SPI mit variabler Bitlänge?

Gast #6221801
Lesenswert?

Ja gibt. Ich weiss noch das ich innerhalb der letzten sechs Monate einen
Microcontroller gesehen habe wo du alles zwischen 8 und 32Bit einstellen
konntest. Leider weiss ich nicht mehr genau welcher das war.
Ich glaub das war irgendein Teil von Renesas. Aber genauer hab ich es 
jetzt nicht im Kopf.

Olaf
#6221819
Lesenswert?

Ich mach SPI jeweils mit ein paar Portpins. Wenn man nicht dauernd hohe 
Uebertragungsraten benoetigt, passt das schon. Meist geht's ja nur um 
ein paar Config register.

Und falls das nicht geht, muss man darauf achten wann die Daten 
uebernommen werden. zB auf den steigenden CS oder so. Dann muessen 
einfach die N Bits vorher passen. Irgendwas weiter vornedran ist dann 
egal.
Gast #6221951
Lesenswert?

Moin,

wenn es sehr flexibel sein muss, kann man sich die Aurix von Infineon
anschauen. Die sind extrem flexibel, dafür aber auch recht komplex.
Die können 2..32 bit oder bis 32 byte pro Transfer und dann auch
noch mehrere Transfers in einen "CS Frame" übertragen. Und man kann
mehere "CS Frames" mit definierbaren Wartezeiten mit nur einem DMA
Transfer abfeuern. Wenn man das möchte oder braucht.
Was flexibleres ist mir noch nicht begegnet (bisher).
Persönliche Seite #6222064
Lesenswert?

Olaf schrieb:
> Ja gibt. Ich weiss noch das ich innerhalb der letzten sechs Monate einen
> Microcontroller gesehen habe wo du alles zwischen 8 und 32Bit einstellen
> konntest. Leider weiss ich nicht mehr genau welcher das war.
> Ich glaub das war irgendein Teil von Renesas. Aber genauer hab ich es
> jetzt nicht im Kopf.

zumindest bei der RSPI vom R65N kann man teilweise auch 'krumme' Werte 
einstellen:
Transfer bit length is selectable as 8, 9, 10, 11, 12, 13, 14, 15, 16, 
20, 24, or 32 bits
Gast #6222097
Lesenswert?

A. S. schrieb:
> Wozu? Oder anders: was passiert, wenn nach dem letzten Bit noch clocks
> kommen, ist doch meist egal.

Welche zusätzlichen Clocks? Der Sender schickt - in diesem Beispiel - 
genau 23 Bits und damit 23 Clock-Flanken, da ist nichts, was man während 
des Empfanges ignorieren könnte!
Moderator (Firma: Titel) Persönliche Seite #6222179
Lesenswert?

A. S. schrieb:
> Oder anders: was passiert, wenn nach dem letzten Bit noch clocks kommen,
> ist doch meist egal.
Oft ist es genau andersrum: die letzten Bits vor der steigenden Flanke 
des SS# sind relevant.

Narvik schrieb:
> Der Sender schickt - in diesem Beispiel - genau 23 Bits und damit 23
> Clock-Flanken
In meinem Beispiel mit der Synchronisation per SS# Flanke würde der 
Sender 3*8 Bits (per DMA senden) und hätte damit einen Protokolloverhead 
von nur 4%. Und 3*8 Bits nacheinander abschicken könnte dann aber echt 
jeder µC.

Narvik schrieb:
> Bisher habe ich nur die Möglichkeit gesehen, 8, 16 oder 32 Bit
> einzustellen.
Es ist generell eine schlaue Idee, sich auf Zweierpotenzen zu 
fokussieren. Was hast du da für einen Slave, der 23 Bits braucht?
Gast #6222198
Lesenswert?

Narvik schrieb:
> Der Sender schickt - in diesem Beispiel - genau 23 Bits und damit 23
> Clock-Flanken, da ist nichts, was man während des Empfanges ignorieren
> könnte!

Also das Gegenstück ist master und schickt genau 23 clocks? Plus 
chipselect? Wie kommt das? Oder was ist das?
Gast #6222218
Lesenswert?

Lothar M. schrieb:
> Es ist generell eine schlaue Idee, sich auf Zweierpotenzen zu
> fokussieren. Was hast du da für einen Slave, der 23 Bits braucht?

Es ist der Master, der diese schrägen Werte produziert, ich versuche den 
Slave zu bauen, der diese Daten empfängt:

Und: 23 Bit ist ein eher extremes Beispiel, die Länge liegt bei eher 22 
oder 24 Bit (und nein, 24 Bit sind nicht 3x 8 Bit, weil Sync für die 24 
Bit eben nur einmal wackelt und nicht dreimal).
Gast #6222286
Lesenswert?

Narvik schrieb:
> und nein, 24 Bit sind nicht 3x 8 Bit, weil Sync für die 24 Bit eben nur
> einmal wackelt und nicht dreimal).

Dann nochmal die Frage: was ist das? Und warum ohne chipselect? Und was 
ist sync? Normal ist entweder: chipselect, danach kommen x bits, egal 
wie viele. Oder: ein bitstrom als Startsignal, und dann x bits. Und wenn 
es am Ende clocks extra gibt, ist es egal, ob der Empfänger (Slave) dass 
in 4, 8 oder 24 bit-frames auswertet.
Gast #6222308
Lesenswert?

A. S. schrieb:
> Narvik schrieb:
>> und nein, 24 Bit sind nicht 3x 8 Bit, weil Sync für die 24 Bit eben nur
>> einmal wackelt und nicht dreimal).
>
> Dann nochmal die Frage: was ist das? Und warum ohne chipselect? Und was
> ist sync? Normal ist entweder: chipselect, danach kommen x bits, egal
> wie viele. Oder: ein bitstrom als Startsignal, und dann x bits. Und wenn
> es am Ende clocks extra gibt, ist es egal, ob der Empfänger (Slave) dass
> in 4, 8 oder 24 bit-frames auswertet.

Ja, Sync = Chipselect. Es ist schon ein SPI, Sync/CS geht auf Low, dann 
kommen z.B. 22 oder 24 Datenbits die durch 22 oder 24 Clock-Flanken 
markiert werden, dann geht Sync/CS wieder hoch, um das Ende des Frames 
zu markieren. Das ganze ist ein krudes und proprietäres 
Industrie-Datenprotokoll, welches ich mir nich ausgesucht habe.

Und so wie ich das sehe, würde ein Slave, der z.B. 32 Bits erwartet, 
damit ja nicht klar kommen?
Moderator (Firma: Titel) Persönliche Seite #6222316
Lesenswert?

Narvik schrieb:
> Und so wie ich das sehe, würde ein Slave, der z.B. 32 Bits erwartet,
> damit ja nicht klar kommen?
Wenn du wie vorgesehen den SS# zum synchronisieren nimmst, dann kannst 
du auch mit 32-Bit Schieberegistern nur Teile davon übertragen. Ein 
Slave bekommt und schickt dann halt nur die ersten 23 Bits von den 32. 
Du musst dann also einfach das zu "23/32" übertragene Wort aus dem 
Schieberegister des Empfängers auslesen.
Du kannst dann natürlich nicht irgendwelche internen Bitzähler zur 
Protokollkontrolle nehmen, sondern du musst einen Interrupt auf die 
steigende SS# Flanke erzeugen, der dann das zu fast 2/3 übertragene 
32-Bit Wort ausliest und das nächste im Senderegister bereitstellt.
Gast #6222332
Lesenswert?

Der ESP32 kann beliebige Bit-Längen. Du gibst dem SPI Transfer die 
genaue Länge in Bits vor, z.B.:

  trans.addr = 0;
  trans.cmd = 0;
  trans.flags = 0;
  trans.user = NULL;
  trans.length = (numberByte) * 8;
  trans.rxlength = 0;
  trans.tx_buffer = data;
  trans.rx_buffer = NULL;

  gpio_set_level(LEDMX_PIN_CS, 0);

  ret=spi_device_queue_trans(spiLEDMX, &trans, portMAX_DELAY);
Gast #6223379
Lesenswert?

Peter D. schrieb:
>

Peter D. schrieb:
> Du kannst für das Synch einen externen Interrupt enablen. Im Interrupt
> liest Du dann das 32Bit SPI-Register aus. Dann sind eben nur 23 Bits
> davon die Daten, der Rest ist unbestimmt.

Klingt gut - wie ginge das denn z.B. beim ATSAM? Ich kann da keine 
passende Funktion für finden und SERCOM scheint kein Chip Select zu 
kennen. Und ein manuelles

Externer Interrupt -> Interrupt Service Routine aufrufen -> mit aktivem 
Code das SPI-Empfangsregister auslesen -> SPI zum neu Lesen 
initialisieren

ist auf Grund der üblichen Interruptlatenzen ja zu langsam...
Gast #6223487
Lesenswert?

Rudolph R. schrieb:
>> SERCOM scheint kein Chip Select zu kennen.
>
> Doch klar, abhängig von DOPO im CTRLA Register ist das PAD1 oder PAD2.

Ah, hab's gesehen, da heißt es /SS. Was ich noch nicht verstehe - wo 
sehe ich denn, welches PAD welches Signal (MISO, MOSI, SCK, /SS) ist? 
Für /SS liegt es offenbar an DOPO, aber wie sind MISO/MOSI zugeordnet?

Danke :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren