2013-04-09 15 views
6

Spero di trovare aiuto anche se questo problema potrebbe essere più hardware di software (vedremo). Sto lavorando su una scheda personalizzata basata sul processore Freescales P1021 (ppc, core e500v2). Un PCB esterno sarà connesso e potrebbe essere configurato da SPI. Le specifiche di questo PCB esterno vengono lette mentre attende un comando a 2 byte in modalità full duplex e che solo l'ultimo byte viene utilizzato per trasferire i dati su MISO.Spidev non scrive/legge simultaneamente utilizzando ioctl

Sapendo questo attualmente lavoro per preparare alcuni pezzi di software per testare questo dispositivo. Così ho iniziato con il noto programma spi_test.

[email protected]:~# ./spi_test -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 
[email protected]:~# 

Pic1

Il segnale mostra 608 orologi e sembra ci sono solo dati nella prima metà. Decido di indagare e testarlo con loopback: shorcutting MOSI-MISO esegue il loop dei dati nel buffer rx. I risultati:

[email protected]1021rdb:~# ./spi_test -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

FF FF FF FF FF FF 
40 00 00 00 00 95 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
DE AD BE EF BA AD 
F0 0D 
[email protected]:~# 

Pic2

Questa segnali rivela che l'intero telegramma viene ripetuto per qualsiasi motivo (non so perché). Tuttavia, il programma mostra correttamente i dati ricevuti nella console, quindi potrebbe essere come se lo spi_test lo prevedesse.

Inoltre ho manipolare il modello che verrà inviato a questo programma fino a 2 byte (per simulare il formato di comando richiesto io lo scopo per) come questo:

#ifdef ORIG 
    uint8_t tx[] = { 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0x40, 0x00, 0x00, 0x00, 0x00, 0x95, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 
     0xF0, 0x0D, 
    }; 
#else 
    uint8_t tx[] = { 
     0xAA, 0x81, 
    }; 
#endif 

Ma come non mi aspettavo 32bit sono spostati out to SPI bus - invece di 16. Durante i primi due byte MOSI fornisce entrambi i byte dal tx [] e per gli altri 2 byte è basso/0. Ecco i risultati di output della console e segnali:

[email protected]:~# ./spi_test_2bytes -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

00 00 
[email protected]:~# 

Pic3

E anche se io di loopback MOSI di miso non vengono ricevuti dati (output della console è ancora lo stesso di ricezione "00 00"):

Pic4

io gioco un po 'con tutti i parametri e decido di cambiare il programma di prova per utilizzare half duplex (trasmettere solo) modalità:

01.235.164,106174 millions

Poiché questo è compilato ed eseguito, le cose sono come previsto. SPI_CLK esegue 16 cicli per 16 bit e MOSI fornisce i dati come previsto. Uscita cosole non mostra i dati ricevuti ed i segnali sono come previsto:

[email protected]:~# ./spi_test_2bytes -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

00 00 
[email protected]:~# 

Pic5

Pic6

In realtà mi sembra che invece di fare 2 byte pieno trasferimento duplex faccio una trasmissione N byte seguito da un byte N ricevi.

In realtà ci sono due domande:

  1. Perché 0xAA, 0x81 e 0x00, 0x00 si trasmette?
  2. Perché (utilizzando il loopback) il codice originale è in grado di recuperare i dati nei buffer rx ma se ridotto a 2 byte non vengono ricevuti dati?
+0

Messaggio le immagini altrove e aggiungere link a loro nella risposta - un utente più alto rappresentante può quindi modificare la risposta di includerli –

+0

controllerò oggi, se spidev è stato compilato con SPI_MASTER_HALF_DUPLEX bandiera abilitato che costringe il dispositivo spi a half duplex. – stede

+0

SPI_MASTER_HALF_DUPLEX non è stato impostato. – stede

risposta

1

Bene, il post è silenzioso travolgente. Ho appena letto alcune parti e recentemente sono entrato in contatto con SPI su Linux. Tuttavia, come menzionato in https://www.kernel.org/doc/Documentation/spi/spidev async lettura/scrittura non è disponibile nello spazio utente. AFAIK lettura/scrittura è solo un wrapper su fcntl. Quindi dovrai scrivere il tuo modulo del kernel per ottenere I/O asincroni.

+0

Questa risposta sembra sbagliata. L'articolo https://www.kernel.org/doc/Documentation/spi/spidev dice esplicitamente "Utilizzo di richieste ioctl(), trasferimenti full duplex ... sono ... disponibili.". E spi-test (ad es. Https://github.com/KnCMiner/spi-test/blob/master/spi-test.c#L97) usa quel ioctl(). –

0

So che questo è un thread molto vecchio, ma ho utilizzato spidev su RT5350 con OpenWRT. Sto ottenendo esattamente gli stessi risultati di te; Non sono in grado di ottenere un trasferimento full duplex. Leggendo il foglio dati dell'RT5350 sembra che l'hardware sia in grado di eseguire solo trasferimenti half duplex SPI. Ogni trasferimento è una scrittura (i byte di output su MOSI, non leggono nulla) o una lettura (zero di output su MOSI, leggi MISO).

Non riesco a ottenere la scheda tecnica per il chip P1021, ma considerando la somiglianza dei nostri risultati, direi che l'hardware SPI è implementato in modo simile.

Ciò significa che un modulo del kernel non è la risposta (ioctl SPI_IOC_MESSAGE chiama eventualmente spi_async() comunque). L'unico modo per fare full duplex SPI è utilizzare GPIO nel software.

RT5350 di riferimento: http://forum.vocore.io/viewtopic.php?f=3&t=72#p233

Problemi correlati