Hvordan lese data ved hjelp av Arduino SPI

i databladet, det står at jeg skal bruke 32 serielle klokker for å få de 32 bitene med data. Hvordan kan Jeg programmerer dette er Arduino?

Kommentarer

  • Jeg foreslår at du åpner eksemplene på SPI-biblioteket og sjekker dem. Uansett, koden skal være byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); og du finner i result de 32 bitene du trenger
  • Jeg har allerede gjort det. men energibrikken Jeg bruker er STPM10 og det antyder at jeg skal bruke simpleks synkron SPI der MOSI ikke er koblet til. Det er bare et tidsskjema for å bytte fra lesebytes og skrivebytes. Når jeg brukte SPI.transfer (), er dataene ikke stabil og jeg tror ikke pålitelig
  • Hvordan sier du at den ikke er pålitelig? Periferienheten er full dupleks, og i henhold til måten den fungerer på er den eneste måten å motta data på å sende dummy data. Hvis MOSI er ikke koblet, vel, det spiller ingen rolle ‘ ; Vær imidlertid oppmerksom på at du ikke kan ‘ t bruke MOSI-pinnen til andre oppgaver. Husket du forresten riktig å stille inn slave select pin på den andre perifere enheten? Brukte du SS-pinnen på arduino-kortet eller en annen?

Svar

Du ringer SPI.transfer() fire ganger, hver gang du lagrer den returnerte verdien til en variabel etter riktig bitforskyvning.

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 antar at det er minst signifikant byte blir mottatt først. Forsikre deg om at SPI-modus er riktig, som angitt i databladet.

Hvis slaven ikke kan takle å bli omstyrt mellom byte (det er det SPI.transfer() vil gjøre på slutten av transaksjonen), så kan du enten prøve st2000s hardware SPI-tilnærming eller bruke bitbanged SPI med shiftIn().

Kommentarer

  • Ikke sikker på at dette vil fungere. Vi trenger virkelig å vite hvordan SPI-slaven fungerer før vi kan anta hvordan den vil reagere. Også, hvis Chip Select-linjen blir hevdet og de-hevdet med hver 8-biters SPI-transaksjon, hvor godt er SPI-slaven designet? Det vil si at en slik SPI-slave lett kunne komme ut av synkronisering med SPI-mesteren. Spesielt, hvordan er du sikker på hvilken 8 bit byte du faktisk leser?
  • @ st2000 OP-sagen passer til å ikke gi nok detaljer; ingenting annet enn antakelser kan gjøres før det endres.
  • Alle eksemplene jeg ‘ har sett bruker SPI, overføring (0) for å lese data i stedet for SPI.transfer (0xff). De bruker også SPI.transfer for å skrive data. Jeg har fremdeles ikke funnet ‘ t hva SPI gjør med 0 eller 0xff når du faktisk leser data. Sendes dette til slaven?
  • @ S.Imp De ‘ er dummybyte. Du kan sende hva du vil sende, enheten i den andre enden vil fortsatt forkaste dem, hvis det til og med betaler noe for noe. SPI.transfer() brukes alltid delvis på grunn av SPIs iboende full-dupleks natur og (som et resultat av den første faktoren), delvis på grunn av måten de fleste MCUer implementerer SPI-periferiutstyr på. Når klokken begynner å kjøre, er det alltid » data » på MOSI- og MISO-linjene, den ‘ er bare opp til hver deltaker på bussen for å lese den eller ikke, og bestemmer ut fra hvilken som helst forhåndsdefinert protokoll med høyere lag om » data » er meningsfylt eller ikke.
  • Det ville ikke være ‘ t være helt feil å si at du kan ‘ t virkelig lese uten å skrive på en SPI-buss og omvendt også. Så det er fornuftig å bare designe et periferiutstyr som tar en byte i ett register og, 8 sykluser senere, returnerer en byte i et annet (eller til og med det samme) registeret, bare for å generalisere usecases. Så ‘ er opp til brukeren ‘ s applikasjon for å avgjøre om de ‘ bare interessert i byten som ble skrevet ut i utgangspunktet (TX) eller den som ble lest tilbake (RX) eller begge deler (TX og RX). Derav det tvetydige navnet transfer() siden det tjener både lese- og skriveroller.

Svar

Svar

Målet er å lese 32 bits ved hjelp av den (ukjente) enhetens SPI-port.

Hvis enheten tåler SPI Chip Select-linjeaktivitet (går fra inaktiv til aktiv til inaktiv for hver 8 bit byte som leses), bør du kunne få de ønskede 32 bitene med data ved å utføre 4 påfølgende 8 bit SPI leser.

Men hvis enheten ikke tåler ovennevnte SPI Chip Select-linjeaktivitet (det vil si hvis enheten krever at SPI Chip Select er aktiv for hele 32 bit SPI-transaksjonen), Du kan ikke skille 32-biters transaksjonen i 4 individuelle 8-biters SPI-transaksjoner uten å kontrollere SPI Chip Select-linjen. Følgende kodeeksempel illustrerer hvordan dette gjø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); } 

Eksemplet ovenfor kommer fra Arduino SPI-bibliotek webside og er en 16-biters (ikke 32-biters) overføring. For å kode opp en 32-biters overføring, fortsett å ringe SPI.transfer-metoden ved hjelp av SPI_CONTINUE-parameteren.

lagt til senere …

Det ser ut til at folk fraråder bruk av DueExtendedSPI-metodene. . Og SPISettings og SPI.beginTransaction () skal brukes? Hvis ja denne siden viser eksempelkode der koden eksplisitt styrer SPI Chip Select-linjen (se etter slaveAPin & slaveBPin). Legg merke til hvordan koden leser 24 bits fra slave A og skriver 8 bits til slave B. For å lese 32 i stedet for 24 bits, må vi endre et segment av koden (sammen med noen få andre endringer) på denne måten:

... 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 trenger virkelig å se spesifikasjonene til slave SPI-enheten for å komponere en mer spesifikt svar.
  • Jeg bruker STPM10 evalueringstavle. Forbindelsen er en enkeltsidig synkron SPI, og MOSI til Arduino er ikke koblet til noe. Det er et tidsskjema for å bytte fra skrivebeskyttet og bare skrive. Problemene mine er å lese data fra registerene til brikken. Jeg brukte SPI.transfer, men jeg tror ikke ‘ dataene er pålitelige.
  • STPM10-tidsdiagrammet funnet på side 11 av det ser ikke ut som en standard SPI-transaksjon. Jeg er tilbøyelig til å si at du ikke kan bruke Arduino SPI-biblioteket. I stedet må du kanskje bit-bang dette ut helt i programvare. For eksempel tror jeg ikke det er en » SYN » linje i standard SPI-bussen. Og jeg tror ikke ‘ at Chip Select-linjen skal gå høyt før SPI-transaksjonen er avsluttet.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *