Come leggere i dati utilizzando Arduino SPI

nella scheda tecnica, si afferma che dovrei applicare 32 orologi seriali per ottenere i 32 bit di dati. Come posso Ho programmato che questo sia Arduino?

Commenti

  • Ti consiglio di aprire gli esempi della libreria SPI e di controllarli. Comunque il codice dovrebbe essere byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); e troverai in result i 32 bit di cui hai bisogno
  • Lho già fatto. ma il chip di energia Sto usando è STPM10 e suggerisce che dovrei usare SPI sincrono simplex dove il MOSI non è collegato. Cè solo un diagramma temporale per passare dalla lettura di byte e scrittura di byte. Quando ho usato SPI.transfer (), i dati non lo sono stabile e penso non affidabile
  • Come si fa a dire che non è affidabile? La periferica è full duplex e, a seconda del modo in cui funziona, lunico modo per ricevere i dati è inviare dati fittizi. Se MOSI è non connesso, beh, non ‘ importa ; nota tuttavia che non puoi ‘ utilizzare il pin MOSI per altre attività. A proposito, ti sei ricordato di impostare correttamente il pin di selezione slave dellaltra periferica? Hai usato il pin SS sulla scheda arduino o un altro?

Rispondi

Chiami SPI.transfer() quattro volte, salvando ogni volta il valore restituito in una variabile dopo il corretto spostamento del bit.

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; 

Presumo il meno significativo byte viene ricevuto per primo. Assicurati che la modalità SPI sia quella giusta, come indicato nella tua scheda tecnica.

Se lo slave non può “gestire il deasserimento tra byte (che è ciò che SPI.transfer() farà alla fine della transazione), quindi puoi provare lapproccio SPI hardware di st2000 o utilizzare SPI bitbanged con shiftIn().

Commenti

  • Non sono sicuro che funzionerà. Abbiamo davvero bisogno di sapere come funziona lo slave SPI prima di poter presumere come reagirà. Inoltre, se la linea Chip Select viene affermata e de-affermata con ogni transazione SPI a 8 bit, quanto è progettato bene lo slave SPI? Cioè, un tale slave SPI potrebbe facilmente perdere la sincronizzazione con il master SPI. Nello specifico, come sei sicuro di quale byte a 8 bit stai effettivamente leggendo?
  • @ st2000 LOP ha ritenuto opportuno non fornire dettagli sufficienti; nientaltro che ipotesi possono essere fatte fino a quando ciò non cambia.
  • Tutti gli esempi che ho ‘ ho visto usare SPI, transfer (0) per leggere i dati piuttosto che SPI. transfert (0xff). Usano anche SPI.transfer per scrivere dati. Non ho ancora ‘ capito cosa fa SPI con 0 o 0xff quando stai effettivamente leggendo i dati. Viene inviato allo slave?
  • @ S.Imp They ‘ re dummy bytes. Puoi inviare quello che vuoi inviare, il dispositivo dallaltra parte li scarterà comunque, se anche i dati pagheranno qualsiasi attenzione. SPI.transfer() viene sempre utilizzato in parte a causa della natura intrinseca full-duplex di SPI e (come risultato del primo fattore) in parte a causa del modo in cui la maggior parte degli MCU implementa le proprie periferiche SPI. Una volta che lorologio inizia a funzionare, sono sempre presenti ” dati ” sulle linee MOSI e MISO, ‘ spetta a ogni partecipante sul bus leggerlo o meno, decidendo in base a qualsiasi protocollo predefinito di livello superiore se i ” dati ” è significativo o no.
  • Non sarebbe ‘ totalmente sbagliato dire che puoi ‘ t leggere veramente senza scrivere su un bus SPI e viceversa. Quindi ha senso progettare semplicemente una periferica che prenda un byte in un registro e, 8 cicli dopo, restituisca un byte in un altro (o anche lo stesso) registro, solo per generalizzare i casi duso. Quindi, ‘ spetta all ‘ applicazione dellutente decidere se ‘ ri interessato solo al byte che è stato scritto per primo (TX) o quello che è stato letto (RX) o entrambi (TX e RX). Inoltre, da qui il nome ambiguo transfer() poiché serve sia i ruoli di lettura che di scrittura.

Risposta

Risposta

Lobiettivo è leggere 32 bit utilizzando la porta SPI del dispositivo (sconosciuto).

Se il dispositivo tollera lattività della linea SPI Chip Select (passando da inattivo ad attivo a inattivo per ogni lettura di 8 bit byte) dovresti essere in grado di ottenere i 32 bit di dati desiderati eseguendo 4 8 consecutivi letture bit SPI.

Tuttavia, se il dispositivo non tollera la suddetta attività della linea SPI Chip Select (ovvero, se il dispositivo richiede che SPI Chip Select sia attivo per lintera transazione SPI a 32 bit), non è possibile separare la transazione a 32 bit in 4 singole transazioni SPI a 8 bit senza controllare la linea SPI Chip Select. Lesempio di codice seguente illustra come eseguire questa operazione:

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

Lesempio precedente proviene dalla libreria Arduino SPI pagina web ed è un trasferimento a 16 bit (non a 32 bit). Per codificare un trasferimento a 32 bit, continua a chiamare il metodo SPI.transfer utilizzando il parametro SPI_CONTINUE.

aggiunto in seguito …

Sembra che le persone stiano scoraggiando luso dei metodi DueExtendedSPI . E devono essere utilizzati SPISettings e SPI.beginTransaction ()? In tal caso, questa pagina mostra il codice di esempio in cui il codice controlla esplicitamente la riga SPI Chip Select (cerca slaveAPin & slaveBPin). Nota come il codice legge 24 bit dallo slave A e scrive 8 bit sullo slave B.Per leggere 32 invece di 24 bit, dobbiamo alterare un segmento del codice (insieme ad alcune altre modifiche di supporto) in questo modo:

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

Commenti

  • Abbiamo davvero bisogno di vedere le specifiche del dispositivo SPI slave per comporre un altro risposta specifica.
  • Uso la scheda di valutazione STPM10. La connessione è una SPI sincrona simplex e il MOSI di Arduino non è collegato a nulla. Esiste un diagramma temporale per passare dalla sola lettura alla sola scrittura. Il mio problema è come leggere i dati dai registri del chip. Ho utilizzato SPI.transfer ma ‘ non credo che i dati siano affidabili.
  • Il diagramma temporale di STPM10 che si trova a pagina 11 ‘ la specifica non sembra una transazione SPI standard. Sono propenso a dire che non è possibile utilizzare la libreria SPI di Arduino. Invece, potresti dover eseguire il bit-bang completamente nel software. Ad esempio, non credo che ci sia una riga ” SYN ” nel bus SPI standard. E non ‘ credo che la linea di selezione del chip dovrebbe aumentare prima della fine della transazione SPI.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *