Kuinka lukea tietoja käyttämällä Arduino SPI: tä

lomakkeessa, todettiin, että minun pitäisi käyttää 32 sarjakelloa saadaksesi 32 bittiä tietoja. Ohjelmoin tämän olevan Arduino?

Kommentit

  • Ehdotan, että avaat esimerkit SPI-kirjastosta ja tarkistat ne. Koodin tulisi joka tapauksessa olla byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); ja löydät kohdasta result 32 tarvitsemasi bittiä
  • Olen jo tehnyt sen. mutta energiapiiri Käytän on STPM10 ja se ehdottaa, että minun pitäisi käyttää yksisuuntaista synkronista SPI: tä, jos MOSI: ta ei ole kytketty. On vain ajoituskaavio vaihtaaksesi tavujen lukemisesta ja tavujen kirjoittamisesta. Kun käytin SPI.transfer (), tietoja ei ole vakaa ja mielestäni ei luotettava
  • Kuinka sanot sen olevan epäluotettava? Oheislaite on täysi kaksipuolinen, ja sen toimintatavan mukaan ainoa tapa vastaanottaa tietoja on lähettämällä näennäistietoja. Jos MOSI on ei ole yhteydessä, sillä ei ole väliä ’ ; Huomaa kuitenkin, että et voi ’ käyttää MOSI-nastaa muihin tehtäviin. Muuten, muistatko asettaa toisen oheislaitteen orjanvalintanastan oikein? Käytitkö SSD-nastaa arduino-levyllä tai toista?

Vastaa

Soitat SPI.transfer() neljä kertaa, joka kerta, kun palautettu arvo tallennetaan muuttujaan oikean bittisiirron jälkeen.

uint32_t val; val = SPI.transfer(0xff); //0xff is a dummy val |= (uint32_t)SPI.transfer(0xff) << 8; val |= (uint32_t)SPI.transfer(0xff) << 16; val |= (uint32_t)SPI.transfer(0xff) << 24; 

Oletan vähiten merkittävän tavu vastaanotetaan ensin. Varmista, että SPI-tila on oikea, kuten tietolomakkeessasi näkyy.

Jos orja ei pysty käsittelemään tavujen välistä poistamista (mikä on SPI.transfer() suoritetaan tapahtuman lopussa), voit joko kokeilla st2000: n laitteiston SPI-lähestymistapaa tai käyttää bittirajoitettua SPI: tä shiftIn(): n kanssa.

Kommentit

  • Etkö ole varma, että tämä toimii. Meidän on todella tiedettävä, miten SPI-orja toimii, ennen kuin voimme olettaa, miten se reagoi. Lisäksi, jos Chip Select -rivi vahvistetaan ja poistetaan jokaisen 8-bittisen SPI-tapahtuman yhteydessä, kuinka hyvin SPI-orja on suunniteltu? Eli tällainen SPI-orja voisi helposti päästä pois synkronoinnista SPI-isännän kanssa. Tarkemmin sanottuna, kuinka voit olla varma, mitä 8-bittistä tavua olet todella lukemassa?
  • @ st2000 OP näki sopivan antamaan tarpeeksi yksityiskohtia mitään muuta kuin oletuksia ei voida tehdä, kunnes se muuttuu.
  • Kaikki ’ näkemäni esimerkit käyttävät SPI: tä, siirrä (0) tietojen lukemiseen SPI: n sijaan. (0xff). He käyttävät SPI.transferia myös tietojen kirjoittamiseen . En edelleenkään ole havainnut ’ sitä, mitä SPI tekee 0- tai 0xff-tiedostojen kanssa, kun luet tietoja. Lähetetäänkö tämä orjalle?
  • @ S.Imp He ’ uudelleen käyttävät tavut. Voit lähettää mitä haluat lähettää, laite toisessa päässä hylkää ne, jos se jopa maksaa tiedoille mitään mieltä. SPI.transfer() käytetään aina osittain SPI: n luontaisen kaksisuuntaisen luonteen vuoksi ja (ensimmäisen tekijän seurauksena) ja sitten sen vuoksi, miten useimmat MCU: t toteuttavat SPI-oheislaitteitaan. Kun kello alkaa käydä, MOSI- ja MISO-riveillä on aina ” data ”, se ’ vain jokaisen väylän osallistujan on mahdollista lukea se vai ei, päättäen minkä tahansa ennalta määritetyn ylemmän tason protokollan perusteella, jos ” data ” on mielekästä tai ei.
  • Se ei ole ’ ei täysin väärin sanoa, että voit ’ t todella lukea kirjoittamatta SPI-väylään ja päinvastoin. Joten on järkevää suunnitella yksinkertaisesti oheislaite, joka vie tavun yhteen rekisteriin ja 8 sykliä myöhemmin palauttaa tavun toiseen (tai jopa samaan) rekisteriin vain yleisten tapausten yleistämiseksi. Sitten ’ riippuu käyttäjän ’ käyttäjän sovelluksesta päättääkö he ’ uudelleen kiinnostaa vain tavu, joka on kirjoitettu ensin (TX), tai luettu takaisin (RX) tai molemmat (TX ja RX). Tästä syystä myös epäselvä nimi transfer(), koska se palvelee sekä luku- että kirjoitusrooleja.

Vastaa

Vastaus

Tavoite on lukea 32 bittiä (tuntemattoman) laitteen SPI-portti.

Jos laite sietää SPI Chip Select -viivatoiminnan (siirtyy passiivisesta aktiiviseksi aktiiviseksi jokaisen 8-bittisen tavun luettua), sinun pitäisi pystyä saamaan halutut 32 bittiä tietoja suorittamalla 4 peräkkäistä 8 bittinen SPI lukee.

Jos laite ei kuitenkaan siedä yllä olevaa SPI Chip Select -viivatoimintaa (ts. jos laite vaatii SPI Chip Select -toiminnon olevan aktiivinen koko 32-bittisen SPI-tapahtuman kohdalla), Et voi erottaa 32-bittistä tapahtumaa 4 yksittäiseksi 8-bittiseksi SPI-tapahtumaksi ilman SPI Chip Select -rivin ohjausta. Seuraava koodiesimerkki kuvaa tämän tekemistä:

void loop(){ //transfer 0x0F to the device on pin 10, keep the chip selected SPI.transfer(10, 0xF0, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, keep the chip selected SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response1, keep the chip selected byte response1 = SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response2, deselect the chip byte response2 = SPI.transfer(10, 0×00); } 

Yllä oleva esimerkki tulee Arduino SPI -kirjastosta verkkosivu ja on 16-bittinen (ei 32-bittinen) siirto. Jos haluat koodata 32-bittisen siirron, jatka SPI.transfer-menetelmän kutsumista käyttämällä parametria SPI_CONTINUE.

lisätty myöhemmin …

Vaikuttaa siltä, että ihmiset eivät suosittele DueExtendedSPI-menetelmien käyttöä . Ja SPISettings ja SPI.beginTransaction () on käytettävä? Jos näin on, tämä sivu näyttää esimerkkikoodin, jossa koodi ohjaa nimenomaisesti SPI-sirun valintariviä (etsi slaveAPin & orjaBPin). Huomaa, kuinka koodi lukee 24 bittiä orjalta A ja kirjoittaa 8 bittiä orjalle B. Jos haluat lukea 32 bittiä 24 bitin sijasta, meidän on muutettava koodin segmentti (yhdessä muutaman muun tukemisen kanssa) tällä tavalla:

... SPI.beginTransaction(settingsA); digitalWrite (slaveAPin, LOW); // reading only, so data sent does not matter val0 = SPI.transfer(0); val1 = SPI.transfer(0); val2 = SPI.transfer(0); val3 = SPI.transfer(0); digitalWrite (slaveAPin, HIGH); SPI.endTransaction(); ... 

Kommentit

  • Meidän täytyy todella nähdä orja-SPI-laitteen tekniset tiedot, jotta voimme luoda enemmän erityinen vastaus.
  • Käytän STPM10-arviointilautaa. Yhteys on yksisuuntainen synkroninen SPI, eikä Arduinon MOSI ole kytketty mihinkään. On ajoituskaavio, jonka avulla voit siirtyä vain luku- ja kirjoitustoiminnoista. Minun ongelmani on kuinka lukea tietoja sirun rekistereistä. Käytin SPI.transfer-tiedostoa, mutta en mielestäni ’ usko, että tiedot ovat luotettavia.
  • STPM10-ajoituskaavio löytyy sen sivulta 11 ’ s -määritykset eivät näytä tavallisilta SPI-tapahtumista. Olen taipuvainen sanomaan, ettet voi käyttää Arduino SPI -kirjastoa. Sen sijaan saatat joutua pudottamaan tämän kokonaan ohjelmistossa. Esimerkiksi en usko, että tavallisessa SPI-väylässä on ” SYN ” -rivi. Enkä ’ usko, että sirun valinta -rivin pitäisi mennä korkealle ennen SPI-tapahtuman päättymistä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *