Hogyan lehet adatokat olvasni az Arduino SPI használatával

az adatlapon, kijelentette, hogy 32 soros órát kell alkalmaznom a 32 bit adat megszerzéséhez. Programozom, hogy ez az Arduino?

Megjegyzések

  • Javaslom, hogy nyissa meg az SPI könyvtár példáit, és ellenőrizze őket. Mindenesetre a kódot meg kell adni. byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); és megtalálja a result -ban a 32 bitet, amire szüksége van
  • én már megtettem. de az energia chip Az STPM10-et használom, és azt javasolja, hogy használjak szimplex szinkron SPI-t, ahol a MOSI nincs csatlakoztatva. Csak egy időzítési diagram áll rendelkezésre a bájtok olvasásáról és a bájtok írásáról. Amikor az SPI.transfer () -t használtam, az adatok nem stabil, és szerintem nem megbízható
  • Hogyan mondod, hogy nem megbízható? A periféria teljes duplex, és működési módja szerint az adatok fogadásának egyetlen módja a dummy adatok küldése. Ha a MOSI nincs csatlakoztatva, nos, nem számít ‘ t ; Ne feledje azonban, hogy ‘ nem használhatja a MOSI tűt más feladatokhoz. Egyébként emlékezett rá, hogy helyesen állította be a másik periféria szolga kiválasztó gombját? Az SS-tűt használta az arduino táblán, vagy egy másikat?

Válasz

Hívja a SPI.transfer() négyszer, a megfelelő biteltolás után minden alkalommal a visszatérő értéket egy változóba menti.

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; 

Feltételezem, hogy a legkevésbé szignifikáns bájt érkezik először. Győződjön meg arról, hogy az SPI mód a megfelelő, amint az az adatlapján is szerepel.

Ha a szolga nem tudja kezelni a bájtok közötti elhárítást (ez az, amit SPI.transfer() a tranzakció végén megteszi), akkor kipróbálhatja az st2000 hardveres SPI megközelítését, vagy használhat bitrangú SPI-t shiftIn() -vel.

Megjegyzések

  • Nem biztos, hogy ez működni fog. Tényleg tudnunk kell az SPI-rabszolga működését, mielőtt feltételezhetnénk, hogyan fog reagálni. Továbbá, ha a Chip Select sort minden 8 bites SPI tranzakciónál érvényesítik és érvénytelenítik, mennyire van megtervezve az SPI slave? Vagyis egy ilyen SPI-rabszolga könnyen kikerülhet az SPI-mester szinkronjából. Pontosabban, hogyan lehet biztos abban, hogy melyik 8 bites bájtot olvassa valójában?
  • @ st2000 Az OP úgy látta, hogy nem ad elegendő részletet; mindez feltételezésekig nem tehető, amíg ez nem változik.
  • Az összes példa, amelyet ‘ láttam, SPI-t, transfer (0) -t használ az adatok olvasásához, nem pedig az SPI-hez.transfer (0xff). Az SPI.transfer-t az adatok írására is használják. Még mindig nem tudtam ‘ kitalálni, hogy az SPI mit csinál a 0 vagy a 0xff-el, amikor valóban adatokat olvas. Ezt a rabszolgának küldik?
  • @ S.Imp Ők ‘ dummy byte-okat állítanak elő. Küldhet bármit, amit el akar küldeni, a másik végén lévő eszköz akkor is eldobja őket, ha akár az adatot is kifizeti. A SPI.transfer() részt mindig az SPI belső full-duplex jellege és (az első tényező eredményeként), majd részben a legtöbb MCU SPI perifériáinak megvalósítási módja miatt használják. Amint az óra elkezd futni, mindig vannak ” adatok ” a MOSI és a MISO vonalakon, ezek ‘ nek csak a busz minden résztvevőjétől függ, hogy elolvassa-e, vagy sem, az előre meghatározott magasabb szintű protokoll alapján dönthet, ha a ” adatok ” értelmes vagy sem.
  • Nem lenne ‘ nem teljesen helytelen azt mondani, hogy ‘ t valóban olvassa anélkül, hogy SPI buszra írna, és viszont. Tehát van értelme egyszerűen megtervezni egy perifériát, amely egy bájtot vesz fel egy regiszterbe, és 8 ciklussal később visszaad egy bájtot egy másik (vagy akár ugyanabban a) regiszterben, csak az usecases általánosítása érdekében. Ezután ‘ a felhasználó ‘ felhasználójának feladata eldönteni, hogy ‘ újra csak az első helyen kiírt bájt (TX) vagy a visszaolvasott (RX) vagy mindkettő (TX és RX) érdekli. Továbbá, ezért a kétértelmű név transfer(), mivel olvasási és írási szerepeket is szolgál.

Válasz

Válasz

A cél 32 bit beolvasása az (ismeretlen) eszköz SPI portja.

Ha az eszköz elviseli az SPI Chip Select soros tevékenységet (inaktívaktól aktívig inaktívvá válik minden 8 bájtos olvasásnál), akkor 4 egymást követő 8 végrehajtásával képesnek kell lennie a kívánt 32 bit adat megszerzésére. bites SPI beolvassa.

Ha azonban az eszköz nem fogja tolerálni a fenti SPI Chip Select soros tevékenységet (vagyis ha az eszköz megköveteli, hogy az SPI Chip Select aktív legyen a teljes 32 bites SPI tranzakciónál), nem választhatja szét a 32 bites tranzakciót 4 külön 8 bites SPI tranzakcióra, az SPI Chip Select sor vezérlésének nélkül. A következő kódpélda szemlélteti ennek végrehajtását:

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); } 

A fenti példa az Arduino SPI könyvtárból származik weboldal és egy 16 bites (nem 32 bites) átvitel. 32 bites átvitel kódolásához továbbra is hívja meg az SPI.transfer metódust az SPI_CONTINUE paraméter használatával.

később hozzáadva …

Úgy tűnik, hogy az emberek nem szívesen használják a DueExtendedSPI metódusokat. . És a SPISettings és az SPI.beginTransaction () fájlokat kell használni? Ha igen, ez az oldal példakódot mutat, ahol a kód kifejezetten az SPI Chip Select sort irányítja (keresse meg a slaveAPin & slaveBPin). Vegye figyelembe, hogy a kód hogyan olvas 24 bitet az A rabszolgától és 8 bitet ír a B rabszolgához. Ahhoz, hogy 24 bites helyett 32-et olvassunk, a kód egy szegmensét (néhány további támogató változtatással együtt) így kell megváltoztatnunk:

... 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(); ... 

Megjegyzések

  • Valószínűleg meg kell látnunk a slave SPI eszköz specifikációit, hogy többet alkossunk konkrét válasz.
  • Az STPM10 kiértékelő táblát használom. A kapcsolat szimplex szinkron SPI, és az Arduino MOSI-ja nem csatlakozik semmihez. Van egy időzítési diagram, amellyel csak olvashatóról és csak írásról válthatunk. A problémám az, hogy hogyan olvassam le az adatokat a chip regisztereiből. Az SPI.transfer szoftvert használtam, de nem gondolom, hogy az adatok megbízhatóak.
  • Az STPM10 időzítési diagramja a 11. oldalon található. s specifikáció nem úgy néz ki, mint egy szokásos SPI tranzakció. Hajlamos vagyok azt mondani, hogy nem használhatja az Arduino SPI könyvtárat. Ehelyett lehet, hogy ezt teljesen szoftveresen kell kibontania. Például nem hiszem, hogy van egy ” SYN ” vonal a standard SPI buszon. És nem hiszem, hogy ‘ nem hiszem, hogy a Chip Select sornak magasra kellene mennie az SPI tranzakció vége előtt.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük