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!
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
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
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.
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
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).
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.
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.
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
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).
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!
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
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?
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).
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.
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?
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.
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);
einfach mal ein Datenblatt von dem anzusteuernden Device posten geht nicht?
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.
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...
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
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.