lomakkeessa, todettiin, että minun pitäisi käyttää 32 sarjakelloa saadaksesi 32 bittiä tietoja. Ohjelmoin tämän olevan Arduino?
Kommentit
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
Sparkfunilla on hyvä selitys SPI: stä:
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi
Arduino IDE: llä on SPE-kirjasto, joka tulee IDE: n mukana.
http://www.arduino.cc/en/Reference/SPI
Kirjastossa on kaksi esimerkkiä:
SPI: n käyttäminen barometrisen paineanturin lukemiseen
Digitaalisen potentiometrin hallinta SPI: n avulla
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ä.
byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00);
ja löydät kohdastaresult
32 tarvitsemasi bittiä