Hvordan man læser data ved hjælp af Arduino SPI

i databladet, det hedder, at jeg skal anvende 32 serielle ure for at få de 32 bit data. Hvordan kan Jeg programmerer dette er Arduino?

Kommentarer

  • Jeg foreslår, at du åbner eksemplerne på SPI-biblioteket og kontrollerer dem. Koden skal alligevel være byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); og du finder i result de 32 bits, du har brug for
  • Det har jeg allerede gjort. men energichippen Jeg bruger er STPM10, og det antyder, at jeg skal bruge simpleks synkron SPI, hvor MOSI ikke er tilsluttet. Der er bare et tidsdiagram for at skifte fra at læse byte og skrive byte. Da jeg brugte SPI.transfer (), er dataene ikke stabil og jeg synes ikke at være pålidelig
  • Hvordan siger du, at den ikke er pålidelig? Den perifere enhed er fuld duplex, og ifølge den måde, den fungerer, er den eneste måde at modtage data på ved at sende dummy-data. Hvis MOSI er ikke forbundet, ja, det betyder ikke noget ‘ ; bemærk dog, at du ikke kan ‘ t bruge MOSI-stiften til andre opgaver. Forresten, huskede du korrekt at indstille slave select pin på den anden perifere enhed? Brugte du SS-stiften på arduino-kortet eller en anden?

Svar

Du kalder SPI.transfer() fire gange, hver gang gemte den returnerede værdi til en variabel efter korrekt bitforskydning.

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; 

Jeg antager, at den mindst signifikante byte modtages først. Sørg for, at SPI-tilstanden er den rigtige, som angivet i dit datablad.

Hvis slaven ikke kan håndtere at blive omstyrt mellem bytes (hvilket er hvad SPI.transfer() vil gøre i slutningen af transaktionen), så kan du enten prøve st2000s hardware SPI-tilgang eller bruge bitbanged SPI med shiftIn().

Kommentarer

  • Ikke sikker på, at dette fungerer. Vi har virkelig brug for at vide, hvordan SPI-slaven fungerer, før vi kan antage, hvordan den vil reagere. Også, hvis Chip Select-linjen hævdes og afvises med hver 8 bit SPI-transaktion, hvor godt er SPI-slave designet? Det vil sige, en sådan SPI-slave kunne let komme ud af synkronisering med SPI-masteren. Specifikt, hvordan er du sikker på, hvilken 8 bit byte du faktisk læser?
  • @ st2000 OP-saven passer til ikke at give nok detaljer; intet andet end antagelser kan gøres, før det ændrer sig.
  • Alle eksemplerne I ‘ har set bruge SPI, overfør (0) til at læse data i stedet for SPI.transfer (0xff). De bruger også SPI.transfer til skrivning data også. Jeg har stadig ikke ‘ t fundet ud af, hvad SPI gør med 0 eller 0xff, når du rent faktisk læser data. Sendes dette til slaven?
  • @ S.Imp De ‘ er dummy-bytes. Du kan sende hvad du vil sende, enheden i den anden ende vil stadig kassere dem, hvis det endda betaler noget for noget. SPI.transfer() bruges altid dels på grund af SPIs iboende full-duplex-natur (og som et resultat af den første faktor), dels på grund af den måde, som de fleste MCUer implementerer deres SPI-perifere udstyr på. Når uret kører, er der altid ” data ” på MOSI- og MISO-linjerne, det ‘ er lige op til hver deltager på bussen for at læse det eller ej, og beslutte ud fra den foruddefinerede højere lagprotokol, hvis ” data ” er meningsfuld eller ej.
  • Det ville ‘ ikke være helt forkert at sige, at du kan ‘ t læser virkelig uden at skrive på en SPI-bus og omvendt også. Så det giver mening at simpelthen designe et perifert udstyr, der tager en byte i et register og 8 cykler senere returnerer en byte i et andet (eller endda det samme) register, bare for at generalisere usecases. Derefter ‘ er det op til brugeren ‘ s applikation at beslutte, om de ‘ re kun interesseret i den byte, der blev skrevet ud i første omgang (TX) eller den, der blev aflæst (RX) eller begge dele (TX og RX). Derfor det tvetydige navn transfer(), da det tjener både læse- og skriveroller.

Svar

Svar

Målet er at læse 32 bits ved hjælp af (ukendt) enhedens SPI-port.

Hvis enheden tåler SPI Chip Select-linjeaktivitet (går fra inaktiv til aktiv til inaktiv for hver 8 bit byte-læsning), skal du kunne få de ønskede 32 bit data ved at udføre 4 på hinanden følgende 8 bit SPI læser.

Men hvis enheden ikke tåler ovenstående SPI Chip Select-linjeaktivitet (det vil sige, hvis enheden kræver, at SPI Chip Select er aktiv for hele 32 bit SPI-transaktionen), du kan ikke adskille 32-bit-transaktionen i 4 individuelle 8-bit SPI-transaktioner uden at kontrollere SPI Chip Select-linjen. Følgende kodeeksempel illustrerer, hvordan dette gøres:

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

Ovenstående eksempel kommer fra Arduino SPI-bibliotek webside og er en 16 bit (ikke 32 bit) overførsel. For at kode op til en 32-bit overførsel skal du fortsætte med at kalde SPI.transfer-metoden ved hjælp af SPI_CONTINUE-parameteren.

tilføjet senere …

Det ser ud til, at folk fraråder brugen af DueExtendedSPI-metoderne . Og SPISettings og SPI.beginTransaction () skal bruges? Hvis ja viser denne side eksempelkode, hvor koden eksplicit styrer SPI Chip Select-linjen (se efter slaveAPin & slaveBPin). Bemærk, hvordan koden læser 24 bit fra slave A og skriver 8 bit til slave B. For at læse 32 i stedet for 24 bit, skal vi ændre et segment af koden (sammen med et par andre understøttende ændringer) på denne måde:

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

Kommentarer

  • Vi skal virkelig se specifikationerne for slave SPI-enheden for at komponere en mere specifikt svar.
  • Jeg bruger STPM10 evalueringskort. Forbindelsen er en simpleks synkron SPI, og Arduinos MOSI er ikke forbundet til noget. Der er et tidsdiagram for at skifte fra skrivebeskyttet og kun skrive. Mine problemer er, hvordan man læser data fra chipens registre. Jeg brugte SPI.transfer, men jeg ‘ tror ikke dataene er pålidelige.
  • STPM10 timing diagram fundet på side 11 i det ‘ s specifikation ligner ikke en standard SPI-transaktion. Jeg er tilbøjelig til at sige, at du ikke kan bruge Arduino SPI-biblioteket. I stedet skal du muligvis bit-bang dette helt ud i software. For eksempel tror jeg ikke, at der er en ” SYN ” linje i standard SPI-bussen. Og jeg tror ikke ‘ at Chip Select-linjen skal gå højt inden afslutningen af SPI-transaktionen.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *