Jak číst data pomocí Arduino SPI

v datovém listu, uvádí se, že bych měl použít 32 sériových hodin, abych získal 32 bitů dat. Jak může Programuji toto je Arduino?

Komentáře

  • Doporučuji vám otevřít příklady knihovny SPI a zkontrolovat je. Každopádně by kód měl být byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); a v result najdete 32 bitů, které potřebujete
  • Už jsem to udělal. ale energetický čip Já používám je STPM10 a naznačuje, že bych měl použít simplexní synchronní SPI, kde není připojen MOSI. Existuje jen časový diagram pro přepnutí z čtení bajtů a psaní bajtů. Když jsem použil SPI.transfer (), data nejsou stabilní a myslím si, že není spolehlivý
  • jak říkáte, že není spolehlivý? periferní zařízení je plně duplexní a podle toho, jak to funguje, jediný způsob, jak přijímat data, je zasílání fiktivních dat. pokud je MOSI není připojeno, na tom nezáleží ‚ ; Pamatujte však, že ‚ t nelze použít pin MOSI pro jiné úkoly. Mimochodem, pamatovali jste si, že jste správně nastavili slave select pin na druhé periferii? Použili jste pin SS na desce arduino nebo na jiném?

Odpověď

Zavoláte SPI.transfer() čtyřikrát, pokaždé, když po správném posunu bitů vrátím vrácenou hodnotu do proměnné.

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; 

Předpokládám nejméně významný bajt je přijat jako první. Ujistěte se, že režim SPI je ten správný, jak je uvedeno v datovém listu.

Pokud slave nezvládne vyřazení mezi bajty (což je SPI.transfer() provede na konci transakce), pak můžete buď zkusit hardwarový přístup SPI st2000, nebo použít bitbanged SPI s shiftIn().

Komentáře

  • Nejste si jisti, zda to bude fungovat. Skutečně potřebujeme vědět, jak otrok SPI funguje, než budeme moci předpokládat, jak bude reagovat. Také, pokud je linka Chip Select uplatněna a zrušena s každou 8bitovou transakcí SPI, jak dobře je SPI slave navržen? To znamená, že takový otrok SPI by se mohl snadno synchronizovat s SPI masterem. Konkrétně, jak máte jistotu, který 8bitový bajt ve skutečnosti čtete?
  • @ st2000 OP viděl, že neposkytuje dostatek podrobností; dokud se tyto změny nezmění, lze předpokládat pouze předpoklady.
  • Všechny příklady, které jsem ‚ viděl, používají spíše SPI, transfer (0) ke čtení dat než SPI.transfer (0xff). Používají také SPI.transfer pro zápis dat. Stále jsem ‚ t nezjistil, co SPI dělá s 0 nebo 0xff, když čtete data. Je to odesláno otrokovi?
  • @ S.Imp Jsou ‚ re figuríny bajtů. Můžete odeslat cokoli, co chcete odeslat, zařízení na druhém konci je stále zahodí, pokud dokonce zaplatí datům jakoukoli mysl. SPI.transfer() se vždy používá částečně kvůli vnitřní full-duplexní povaze SPI a (jako výsledek prvního faktoru), pak částečně kvůli způsobu, jakým většina MCU implementuje své periferie SPI. Jakmile hodiny začnou běžet, na linkách MOSI a MISO jsou vždy “ data “ data ‚ je jen na každém účastníkovi sběrnice, zda si ji přečte nebo ne, a rozhodne se na základě libovolného předdefinovaného protokolu vyšší vrstvy, pokud “ data “ má smysl nebo ne.
  • Nebylo by ‚ úplně nesprávné říkat, že ‚ opravdu nečtete bez zápisu na sběrnici SPI a naopak. Má tedy smysl jednoduše navrhnout periferní zařízení, které bere bajt v jednom registru a o 8 cyklů později vrátí bajt v jiném (nebo dokonce stejném) registru, jen aby se zobecnily případy použití. Poté je ‚ na aplikaci uživatele ‚, aby se rozhodl, zda ‚ znovu zajímá se pouze o byt, který byl zapsán na prvním místě (TX) nebo ten, který byl přečten zpět (RX) nebo oba (TX a RX). Proto také nejednoznačný název transfer(), který slouží jak pro čtení, tak pro psaní.

Odpovědět

Sparkfun má dobré vysvětlení toho, co je SPI:
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

Arduino IDE má knihovnu SPI, která je dodávána s IDE.
http://www.arduino.cc/en/Reference/SPI

Knihovna přichází se dvěma příklady:
Použití SPI ke čtení snímače barometrického tlaku
Ovládání digitálního potenciometru pomocí SPI

Odpověď

Cílem je přečíst 32 bitů pomocí port SPI (neznámého) zařízení.

Pokud zařízení bude tolerovat aktivitu linky SPI Chip Select (přechází z neaktivního na aktivní na neaktivní pro každé 8bitové čtení bajtu), měli byste být schopni získat požadovaných 32 bitů dat provedením 4 po sobě jdoucích 8 bit SPI čte.

Pokud však zařízení nebude tolerovat výše uvedenou aktivitu linky SPI Chip Select (tj. pokud zařízení vyžaduje, aby byl SPI Chip Select aktivní pro celou 32bitovou transakci SPI), nemůžete oddělit 32bitovou transakci do 4 samostatných 8bitových transakcí SPI bez řízení linky SPI Chip Select. Následující příklad kódu ukazuje, jak se to dělá:

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

Výše uvedený příklad pochází z knihovny Arduino SPI webová stránka a jedná se o 16bitový (ne 32bitový) přenos. Chcete-li kódovat 32bitový přenos, pokračujte v volání metody SPI.transfer pomocí parametru SPI_CONTINUE.

přidáno později …

Zdá se, že lidé odrazují od používání metod DueExtendedSPI . A SPISettings a SPI.beginTransaction () mají být použity? Pokud ano, tato stránka zobrazí ukázkový kód, kde kód výslovně řídí řádek SPI Chip Select (podívejte se na slaveAPin & slaveBPin). Všimněte si, jak kód čte 24 bitů z podřízeného A a zapisuje 8 bitů do podřízeného B. Chcete-li číst 32 namísto 24 bitů, musíme změnit segment kódu (spolu s několika dalšími podpůrnými změnami) tímto způsobem:

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

Komentáře

  • Opravdu potřebujeme vidět specifikace zařízení SPI otroka, abychom mohli vytvořit více konkrétní odpověď.
  • Používám zkušební desku STPM10. Připojení je simplexní synchronní SPI a MOSI Arduina není k ničemu připojeno. K dispozici je časový diagram pro přepnutí z režimu pouze pro čtení a pouze pro zápis. Mým problémem je, jak číst data z registrů čipu. Použil jsem SPI.transfer, ale ‚ si nemyslím, že jsou data spolehlivá.
  • Časový diagram STPM10 nalezený na jeho 11. stránce ‚ s spec nevypadá jako standardní transakce SPI. Mám sklon říci, že nemůžete používat knihovnu Arduino SPI. Místo toho to možná budete muset v softwaru úplně rozbít. Například nevěřím, že ve standardní sběrnici SPI je “ SYN “ linka. A já ‚ si nemyslím, že by linka Chip Select měla jít vysoko před koncem transakce SPI.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *