Hallo Uwe, du hast natürlich recht. Das mit den Protokoll (9bit Adresse + rw-bit + Daten) habe ich gelöst.
Für .bits_per_word werden andere Werte als 8 nicht akzeptiert, da bekomme ich eine Fehlermeldung.
Ich pussele halt die Adresse, RW-Bit und Daten so in einen Buffer, dass es passt. Kommen halt am Ende ein paar Takte mehr. Sende 4x8bit für den Inhalt von 9+1+16. Aber das scheint kein Problem zu sein.
Sehe ich am Oszi so.
Was ich nicht hinbekommen habe ist, dass ich zum Lesen eine andere Flanke samplen muss!! (siehe Bild).
Zwar gibt es
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
aber ich sehe nur eine Reaktion auf die Änderung des Write modes ?!? Scheint so, als würde ich die nicht getrennt einstellen können.
Im Devicetree gib es wohl auch ein mode, das verwende ich bisher nicht - es gibt aber auch in dem Beispiel nichts für read/write getrennt.
Gruß Arno
Gesendet: Dienstag, 09. Mai 2017 um 11:03 Uhr Von: "Uwe Kleine-König" uwe@kleine-koenig.org An: flug@lug-freiburg.de Betreff: Re: [Flug] SPI 9bit/16bit
On 05/08/2017 03:41 PM, Arno Steffens wrote:
Hallo, ich hab eine kurze Frage zu SPI (embedded). Ich hab das bisher mit einem ioctl gemacht:
struct spi_ioc_transfer transfer ={ .tx_buf = (unsigned long)(wr_tmp), .rx_buf = (unsigned long)(rd_tmp), .len = (width>>3)+1, // 8->2, 16->3, 24->4, .speed_hz = SPI_SPEED, .bits_per_word = 8, };
ret = ioctl(file_spi0, SPI_IOC_MESSAGE(1), &transfer); if( ret < 1 ){ printf("could not transmit data\n"); }
Jetzt habe ich aber den seltsamen Fall, dass das Gerät eine 9 (!) Bit Adresse hat und 16 bit Daten hat. Mir ist gar nicht klar wie das gehen soll.
Deine Frage ist nicht verständlich. Was heißt, dass Gerät hat eine 9 Bit Adresse? Da es bei generischem SPI im Protokoll gar keine Adressen gibt (anders als z.B. bei i2c), sprichst Du sicher über das Geräte-spezifische Protokoll. Beschreibe mal eine Nachricht, die Du schicken willst oder zeige das Datenblatt.
Liebe Grüße Uwe
Freiburger Linux User Group Mail an die Liste: flug@lug-freiburg.de Mailingliste verwalten (u.a. abbestellen): https://lug-freiburg.de/mailman/listinfo/flug