Forum: Mikrocontroller und Digitale Elektronik SPI mit variabler Bitlänge?


von Narvik (Gast)


Lesenswert?

Hi,

gibt es einen DSP/eine MCU, bei der ich auf einem SPI-Kanal Daten mit 
variabler Bitlänge empfangen kann (also z.B. sowas krudes wie 23 Bit)?

Bisher habe ich nur die Möglichkeit gesehen, 8, 16 oder 32 Bit 
einzustellen.

Danke!

von Olaf (Gast)


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

von Uli N. (uln)


Lesenswert?

Für das SPI Interface des STM32G474, mit dem ich gerade arbeite, wird
unter "39.2  SPI main features" angegeben:

• 4 to 16-bit data size selection

von Cyblord -. (cyblord)


Lesenswert?

Narvik schrieb:
> Bisher habe ich nur die Möglichkeit gesehen, 8, 16 oder 32 Bit
> einzustellen.

Es gibt immer noch die Möglichkeit SPI in Software zu machen wenn man 
denn schon solche Sonderlocken braucht. Das ganze DMA/IRQ gesteuert kann 
auch recht flott gehen und belastet die CPU dann immer noch wenig.

von Pandur S. (jetztnicht)


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.

: Bearbeitet durch User
von Darth Moan (Gast)


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

von Markus E. (markus_e176)


Lesenswert?

Die Cypress PSoC 5 können das auch.
Zum Einen über den fertigen SPI-Building-Block oder bei umständlicheren 
Anforderungen (Datenpin invertiert, jedes dritte Bit wegfallen lassen 
o.ä.) über zusammengestellte Logikblöcke.

von A. S. (Gast)


Lesenswert?

Narvik schrieb:
> SPI-Kanal Daten mit variabler Bitlänge empfangen kann (also z.B. sowas
> krudes wie 23 Bit)?

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

von Christopher B. (chrimbo) Benutzerseite


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

von Narvik (Gast)


Lesenswert?

Cyblord -. schrieb:
> e

Cyblord -. schrieb:
> Es gibt immer noch die Möglichkeit SPI in Software zu machen wenn man
> denn schon solche Sonderlocken braucht. Das ganze DMA/IRQ gesteuert kann
> auch recht flott gehen und belastet die CPU dann immer noch wenig.

Nö, die Option fällt leider weg, das benötigt zu viel Rechenleistung 
(und damit Strom und Platz und Kühlung).

von Narvik (Gast)


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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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?

: Bearbeitet durch Moderator
von A. S. (Gast)


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?

von Narvik (Gast)


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

von A. S. (Gast)


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.

von Narvik (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von pitschu (Gast)


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

von Frank K. (fchk)


Lesenswert?

einfach mal ein Datenblatt von dem anzusteuernden Device posten geht 
nicht?

von Peter D. (peda)


Lesenswert?

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.

von Narvik (Gast)


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...

von Rudolph R. (rudolph)


Lesenswert?

Narvik schrieb:
> Klingt gut - wie ginge das denn z.B. beim ATSAM?

Welcher ATSAM?
Es gibt da schon sein einige.
Die ATSAMC21 können direkt nur 8 oder 9 Bit.
Die ATSAMD51 / ATSAME51 können 8, 9 oder 32 Bit.

Narvik schrieb:
> SERCOM scheint kein Chip Select zu kennen.

Doch klar, abhängig von DOPO im CTRLA Register ist das PAD1 oder PAD2.

: Bearbeitet durch User
von Narvik (Gast)


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 :-)

von Narvik (Gast)


Lesenswert?

OK, hab's gefunden, es geht über DOPO/DIPO - Danke :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.