Hallo Welt,
ich teste gerade das SPI Interface des Raspberry Pi 3 Model B. Dabei ist
an den GPIO's und am SPI Interface nichts angeschlossen. Das Senden von
Daten funktioniert (mit nem Scope gemessen), allerdings empfange ich
immer die Daten, die ich auch versendet habe. Auch wenn ich den MISO Pin
mit z.B. dem SCK Pin kurzschließe, "empfange" ich immer die Nachricht,
die ich auch versendet habe.
Hat jemand einen Rat? Vielen Dank!
Hi,
Gordon hat vor dem ioctl-Aufruf so programmiert:
...
memset (&spi, 0, sizeof (spi)) ;
spi.tx_buf = (unsigned long)data ;
spi.rx_buf = (unsigned long)data ;
spi.len = len ;
...
Das erklärt, wieso Du das "empfangen" kannst, was Du gesendet hast, wenn
Du nichts empfängst :-)
Hallo WiringPiSPI,
danke für deine Antwort! Ich bin aber noch nicht auf die Lösung des
Problems gekommen. Ich habe die Funktion für Debugzwecke erweitert:
Die Ausgabe der einzelnen Bytes enthält jeweils die abgesendete
Nachricht.
Ich kenn mich mit der ioctl Funktion nicht so aus, kann es sein, dass
sie nur den Prozess startet und ich die Antwort irgendwie per Interrupt
erhalte?
Danke und viele Grüße
Hi,
der Hinweis auf die Implementierung von wiringPiSPIDataRW sollte nur
erklären, wieso man die gesendeten Daten wieder empfangen kann.
Die Debug Ausgabe hat aber nicht geschadet :-)
>Ich kenn mich mit der ioctl Funktion nicht so aus, kann es sein, dass>sie nur den Prozess startet und ich die Antwort irgendwie per Interrupt>erhalte?
Nein, denn wenn alles gut geht liefert die Funktion wiringPiSPIDataRW
die empfangenen Daten in dem Bereich, auf den der 2. Parameter zeigt und
der ioctl-Aufruf steht ja im return Befehl:
return ioctl (spiFds [channel], SPI_IOC_MESSAGE(1), &spi) ;
Ich denke, ich steck nachher mal was zusammen und teste auch mal. Kann
aber etwas dauern :-)
Viele Grüße
Die ioctl Funktion innerhalb der wiringPiSPIDataRW Funktion gibt -1
zurück. Das Setup Funktioniert: fd=3.
Mich wundert ja, dass das Senden funktioniert. Leider empfange ich aber
immer noch nichts und ich weiß nicht weiter... :-/
Na,weiter gekommen?
spidev_test.c sollte bei Dir auch funktionieren. Wenn nicht stimmt was
am Raspi nicht.
Dein Testprogramm wird aber trotzdem nicht so laufen, wie Du denkst.
In wiringPiSPIDataRW sieht man ja, wie der Puffer verwendet wird. Du
hast aber keinen Zeiger auf einen Puffer übergeben, sondern einen Zeiger
auf eine Stringkonstante.
Ändere mal Dein Testprogramm so ab:
int main()
{
// unsigned char* buffer = "Hallo Welt!!!\n";
unsigned char buffer [32];
int i =0;
if(wiringPiSPISetup(1, 500000)==-1)
{
printf("Could not initialise SPI\n");
return 0;
}
while(1)
{
strcpy(buffer, "Hallo Welt!!!\n");
wiringPiSPIDataRW(1, buffer, 8);
printf("Data send %i, %s\n", i++, buffer);
}
return 0;
}
Dann teste mit offenen MOSI und MISO Ports und mit kurzgeschlossenen.
Dann oder spätestens wenn Du zusätzlich noch mit
wiringPiSPIDataRW(1, buffer, 1);
testest, also in jedem Durchlauf nur 1 Byte per SPI raus- bzw. raus- und
reinschiebst, sollte alles klar sein.
Hallo WiringPiSPI,
vielen Dank für deine Unterstützung! Beide Programme laufen jetzt. Der
Fehler war der Zeiger auf die Stringkonstante.
Viele Grüße und danke nochmal!