Hi, ich nutze aktuell den ATSAMD51G für ein Projekt, bei dem ich 3 Byte/24 Bit Daten über ein SPI interface empfange. Der ATSAMD51G bietet die Möglichkeit, die Anzahl der in einem SPI-Frame zu empfangenden Bytes zu konfigurieren, weswegen ich den dafür ausgewählt habe. Mein Problem: die Lieferzeiten von dem Ding sind mittlerweile astronomisch. Deswegen meine Frage: kennt jemand eine andere MCU, welche mindestens zwei SPIs mit mehr als 16 bit Datenbreite bietet? Danke!
Satz K. schrieb: > Deswegen meine Frage: kennt jemand eine andere MCU, welche mindestens > zwei SPIs mit mehr als 16 bit Datenbreite bietet? Wozu? Die allermeisten uCs haben ein SPI mit 8 Bit/Elementartransfer. Damit kann man problemlos ganzzahlige Vielfache von 8 Bit übertragen und das alles in Hardware (=schnell).
Falk B. schrieb: > Satz K. schrieb: >> Deswegen meine Frage: kennt jemand eine andere MCU, welche mindestens >> zwei SPIs mit mehr als 16 bit Datenbreite bietet? > > Wozu? Die allermeisten uCs haben ein SPI mit 8 Bit/Elementartransfer. Und was genau nützt mir 3x 8 Bit (mit 3x Wackeln auf der Select-Leitung) wenn ich 1x 24 Bit mit 1x Wackeln auf der Select-Leitung benötige?
Satz K. schrieb: > Und was genau nützt mir 3x 8 Bit (mit 3x Wackeln auf der Select-Leitung) > wenn ich 1x 24 Bit mit 1x Wackeln auf der Select-Leitung benötige? Wer sagt denn, daß CS da dreimal wackelt? Das wird in den allermeisten Fällen per CPU geschaltet und ist damit frei programmierbar.
Falk B. schrieb: > Wer sagt denn, daß CS da dreimal wackelt? Das wird in den allermeisten > Fällen per CPU geschaltet und ist damit frei programmierbar. Der Empfänger erwartet drei mal Wackeln wenn er nur 8 Bit SPI-Frames kann! Und wenn das nicht passt, werden entweder die zusätzlichen Bits oder das ganze SPI-Frame verworfen, weil das Eingangs-Schieberegister eben schlichtweg keine 24 Bit breit ist!
Satz K. schrieb: > Falk B. schrieb: >> Wer sagt denn, daß CS da dreimal wackelt? Das wird in den allermeisten >> Fällen per CPU geschaltet und ist damit frei programmierbar. > > Der Empfänger erwartet drei mal Wackeln wenn er nur 8 Bit SPI-Frames > kann! Wovon redest du denn eigentlich? Du fragtest nach einem Controller, der 24 Bit per SPI empfangen kann. Das kann jeder! Denn nach jedem Byte ist erstmal Ruhe. Ich gehe davon aus, daß dein Controller der SPI-Master ist, welcher auch den Takt generiert. Dann kann der Controller das empfangene Byte speichern. Dann sind die nächsten zwei Bytes drann. Wo liegt da das Problem? SPI funktioniert so und das schon seit Anfang an und auch auf den allermeisten Controlleren, die nur 8 Bit / Einzeltranfer in Hardware beherrschen.
Falk B. schrieb: > Satz K. schrieb: >> Falk B. schrieb: >>> Wer sagt denn, daß CS da dreimal wackelt? Das wird in den allermeisten >>> Fällen per CPU geschaltet und ist damit frei programmierbar. >> >> Der Empfänger erwartet drei mal Wackeln wenn er nur 8 Bit SPI-Frames >> kann! > > Wovon redest du denn eigentlich? Du fragtest nach einem Controller, der > 24 Bit per SPI empfangen kann. Das kann jeder! Denn nach jedem Byte ist > erstmal Ruhe. Ich gehe davon aus, daß dein Controller der SPI-Master > ist, welcher auch den Takt generiert. Wovon redest du eigentlich? Von Master war nirgends die Rede! Aber ich erkläre es dir gerne: CS geht auf LOW -> Framebeginn Clock wackelt und signalisiert jeweils ein gültiges Datenbit -> dieses wird in das Eingangs-Schieberegister geschoben CS geht auf HIGH -> Frameende, die MCU schiebt die Daten aus dem Eingangs-Schieberegister in irgend ein Empfangsregister oder FIFO oder was auch immer. Was du mir gerade versuchst zu erzählen: Wenn das Eingangs-Schieberegister nur 8 Bit hat, kann ich da trotzdem 24 Bit drin empfangen, weil die überschüssigen 16 Bit ... ja bitte wo landen die denn? Und wieos soll nach 8 Bit Ruhe sein, wenn der Sender eben 24 Bit in einem Frame schickt und nicht 8? Erklärst du mir gerade, wie die Daten aussehen, die ich empfangen möchte? Aber wenn ich das hier lese: > Wer sagt denn, daß CS da dreimal wackelt? Das wird in den allermeisten > Fällen per CPU geschaltet und ist damit frei programmierbar. ...dann hast du offenbar noch immer nicht verstanden, dass ich vom EMPFANG rede und nicht vom SENDEN! Der Empfänger programmiert nicht das CS-Signal!
Satz K. schrieb: >> Wovon redest du denn eigentlich? Du fragtest nach einem Controller, der >> 24 Bit per SPI empfangen kann. Das kann jeder! Denn nach jedem Byte ist >> erstmal Ruhe. Ich gehe davon aus, daß dein Controller der SPI-Master >> ist, welcher auch den Takt generiert. > > Wovon redest du eigentlich? Von Master war nirgends die Rede! In der Tat. Deine bisherige Beschreibung war unvollständig. > Aber ich > erkläre es dir gerne: > > CS geht auf LOW -> Framebeginn Dein Controller ist also der Slave, richtig? > Clock wackelt und signalisiert jeweils ein gültiges Datenbit -> dieses > wird in das Eingangs-Schieberegister geschoben > CS geht auf HIGH -> Frameende, die MCU schiebt die Daten aus dem > Eingangs-Schieberegister in irgend ein Empfangsregister oder FIFO oder > was auch immer. ja, aber da bleibt immer noch die Frage. > Was du mir gerade versuchst zu erzählen: Wenn das > Eingangs-Schieberegister nur 8 Bit hat, kann ich da trotzdem 24 Bit drin > empfangen, weil die überschüssigen 16 Bit ... ja bitte wo landen die > denn? Versuchs mal mit Bladrian oder wenn das nicht hilft mit Val_ium. Du bist vollkommen überdreht! Geh mal davon aus, daß ich weiß wie SPI funktioniert, sowohll was den Master als auch Slave angeht. Mangels genauerer Informationen DEINERSEITS habe ich angenommen, daß der gesuchte Controller als Master arbeiten soll. Auch der kann Daten vom Slave lesen/empfangen. Und das mit BELIBIGER Byteanzahl. Für deine 24 Bit braucht es da KEINERLEI Spezialcontroller. Wenn aber dein Controller als Slave arbeiten soll, muss er sich dem Timing des Taktes sowie CS anpassen. Auch ein SPI-Slave kann mehr als nur 8 Bit empfangen, auch wenn die Hardware nur ein 8 Bit Schieberegister enthält. der Slve-Controller muss nur schnell genug am Ende der ersten 8 Bit diese abholen und im RAM speichern. Kann er das nicht, werden die empfangenen Daten überschrieben und des entsteht Datensalat. Ist das SPI in Empfangsrichtung doppel gepuffer, wie z.B. ein UART, ist das relativ entspannt, der Controller hat ca. 8 Bitzeiten Zeit, die Daten abzuholen und zu speichern. Gibt es die Doppelpufferung NICHT, wie z.B. im AVR, muss der Master eine Zwangspause von ein paar us einlegen, um dem AVR-Slave genügen Zeit zum Speichern des BYtes zu geben. Allerdings kann beim AVR der UART im SPI-Mode arbeiten, damit bekommt man ein SPI mit Doppelpufferung. Somit könnte ggf. soger ein einfacher AVR als SPI-Slve deine mageischen 24 Bit empfangen. > Und wieos soll nach 8 Bit Ruhe sein, wenn der Sender eben 24 Bit in > einem Frame schickt und nicht 8? Das habe ich versucht zu erklären. Wenn dein Controller der Master ist und den Takt vorgibt. > Erklärst du mir gerade, wie die Daten > aussehen, die ich empfangen möchte? Vielleichst solltest du dich mal mit dem Thema Netiquette befassen. Deine Informationen waren unvollständig und ich kann nicht hellsehen. >> Wer sagt denn, daß CS da dreimal wackelt? Das wird in den allermeisten >> Fällen per CPU geschaltet und ist damit frei programmierbar. > > ...dann hast du offenbar noch immer nicht verstanden, dass ich vom > EMPFANG rede und nicht vom SENDEN! Und du scheinst nicht verstanden zu haben, daß auch ein SPI-Master Daten empfängt. > Der Empfänger programmiert nicht das > CS-Signal! In der Tat! Ich versucht mal zu dekodieren. Du suchst einen uC, der als SPI-Slave 24 Bit empfangen kann. Richtig? Bei welchem SPI-Takt? Wieviel Zeit liegt zwischen den Bytes?
Falk B. schrieb: > Geh mal davon aus, daß ich weiß wie SPI funktioniert, sowohll was den > Master als auch Slave angeht. Du hast gerade das Gegenteil bewiesen...
Du hast scheinbar SPI nicht verstanden. CS dient -wie du richtig erkannt hast- als Framestart-Condition. Nach jeweils 8 bit wird -per Hardware- der Inhalt des Schieberegister in das Empfangregister kopiert, und ein Interrupt ausgelöst, der dir signalisiert, das die ersten/nächsten 8bit abgeholt werden müssen. Das passiert bei 24bit eben 3 mal, und am Ende hast du alle 24 bit.
Satz K. schrieb: > Falk B. schrieb: >> Geh mal davon aus, daß ich weiß wie SPI funktioniert, sowohll was den >> Master als auch Slave angeht. > > Du hast gerade das Gegenteil bewiesen... Aha. Was bedeutet wohl MISO beim SPI? Falks Beschreibung ist richtig, vielleicht solltest du mal Grundlagen zu SPI lesen. Viele Cortex-M haben 16 Bit Register, da ginge auch 16+8 oder 12+12 Bit.
:
Bearbeitet durch User
Harry L. schrieb: > Du hast scheinbar SPI nicht verstanden. > Nach jeweils 8 bit wird -per Hardware- der Inhalt des Schieberegister in > das Empfangregister kopiert, und ein Interrupt ausgelöst, der dir > signalisiert, das die ersten/nächsten 8bit abgeholt werden müssen. Und das ist beim ATSAMD51G eben NICHT so! Ich bekomme den Interrupt, so bald im Schieberegister die Anzahl von Bits liegen, die ich zuvor konfiguriert habe - und das sind 24. Und noch mal: was macht dein 8-Bit-SPI denn, wenn CS einfach nicht hochgeht? Stupide die Bits zählen? Das Frameende nur vermuten?
Satz K. schrieb: > Und noch mal: was macht dein 8-Bit-SPI denn, wenn CS einfach nicht > hochgeht? Stupide die Bits zählen? JA! Was sonst? Es ist eine SYNCHRONE Schnittstelle! > Das Frameende nur vermuten? Nö, das muss er schon wissen. Die Software muss es auch wissen. Außerdem kann man das CS auch per Software auswerten. SPI in Contollern ist nie zu 100% Hardware.
Satz K. schrieb: > Und noch mal: was macht dein 8-Bit-SPI denn, wenn CS einfach nicht > hochgeht? Stupide die Bits zählen? Das Frameende nur vermuten? Tja....du solltest dich wirklich nochmal in SPI einlesen! CS bleibt während der gesamten 24bit auf aktiven Pegel. Das Schieberegister schiebt einfach stumpf mit jedem Takt weiter, und es werden alle 8 Takte Interrupts ausgelöst. CS geht erst am Ende des Transfer wieder auf inaktiven Zustand.
Satz K. schrieb: > Und noch mal: was macht dein 8-Bit-SPI denn, wenn CS einfach nicht > hochgeht? Stupide die Bits zählen? Das Frameende nur vermuten? Natürlich die Bits zählen und alle 8 Bits (oder was sonst als Wortbreite für den SPI-Controller konfiguriert ist) einen neuen Interrupt generieren bzw. per DMA das Byte/Teilwort wegspeichern. Kein vernünftiger SPI-Controller braucht die steigende Flanke von CS- als Frameende-Markierung. Das inaktiv werden von CS- nach dem letzten Zugriff deselektiert lediglich den Slave, so daß der aufhört, MISO zu treiben. Was glaubst du wohl, wie sich ein SPI-Slave in einem serial FLASH Speicher verhält?!? Der wird auch nicht erst aktiv, wenn CS- wieder inaktiv wird, sondern liefert nach dem Empfang des Lese-CMD, mehreren Adreßbytes und einem Dymmy-Byte Byte für Byte die gespeicherten Daten auf MISO zurück! Und wenn man möchte den ganzen Speicherinhalt am Stück, incl. Wraparound am Speicherende auf den Anfang.
:
Bearbeitet durch User
So, nach dem Sich Falk hier scheinbar mit seinem Zweit- und Drittaccount selber Recht gibt, habe ich es am ATSAMD51 einfach mal ausprobiert: SPI-Empfang auf 8 Bit gestellt und Eingangsseitig 24 Bit pro CS-Frame gesendet. Ergebnis: ich erhalte NICHT 3x 8 Bit und 3 Interrupts! Die Empfangs-Bitbreite muss also zu der in den CS-Frames gefundenen Anzahl Bits passen. Ansonsten wäre das ja auch eine saublöde SPI-Schnittstelle, wenn das CS-Signal so nutzlos ist: Steckt jemand während einer laufenden Übertragung das Kabel an, wird einfach irgendwo im Byte angefangen, die Bits einzusammeln. D.h. die empfangenen Daten wären permanent verschoben. Resynchronisation? Nö, CS ist ja nutz- und sinnlos und es werden nur stupide Bity geschoben. Aber ist schon gut @bauformb hat es ja zum Glück geschafft, mir meine eigentliche Frage zu beantworten - Danke dafür!
Satz K. schrieb: > So, nach dem Sich Falk hier scheinbar mit seinem Zweit- und Drittaccount ;-) > selber Recht gibt, habe ich es am ATSAMD51 einfach mal ausprobiert: > > SPI-Empfang auf 8 Bit gestellt und Eingangsseitig 24 Bit pro CS-Frame > gesendet. > > Ergebnis: ich erhalte NICHT 3x 8 Bit und 3 Interrupts! Dann hast du entweder was falsch eingestellt oder der Controller kann es nicht. Ich weiß es nicht, ich kenn das Ding nicht! > Die > Empfangs-Bitbreite muss also zu der in den CS-Frames gefundenen Anzahl > Bits passen. Bei dem Ding vielleicht. Der Rest der Controller hat das Problem nicht. > Ansonsten wäre das ja auch eine saublöde SPI-Schnittstelle, wenn das > CS-Signal so nutzlos ist: Steckt jemand während einer laufenden > Übertragung das Kabel an, wird einfach irgendwo im Byte angefangen, die > Bits einzusammeln. D.h. die empfangenen Daten wären permanent > verschoben. Resynchronisation? Nö, CS ist ja nutz- und sinnlos und es > werden nur stupide Bity geschoben. Das hat keiner behauptet. Aber CS ist im Wesentlichen nur für ein definiertes Reset der SPI-Logik zuständig. Klar, wenn CS wieder auf HIGH (inaktiv) geht, kann man da noch andere Aktionen starten. > Aber ist schon gut @bauformb hat es ja zum Glück geschafft, mir meine > eigentliche Frage zu beantworten - Danke dafür! Frag. Was machst du, wenn dein SPI-Master 16 Byte Daten sendet? Brauchst du dann einen Controller, der das rein in Hardware empfangen kann?
Satz K. schrieb: > Das Frameende nur vermuten? Das ist erreicht wenn 8bit empfangen wurden. Clocks zählen ist ja nicht so kompliziert. CS bleibt so lange aktiv wie dieser Slave gemeint ist. CS ist nur insofern das Frame start signal weil es den Slave komplett deaktivieren kann WENN es überaupt vorhanden ist. Der Slave kann auch mit permanentem CS am SPI hängen, wenn es keinen zweiten Slave gibt. Auch wenn Falk sich gerne erst im Ton vergreift, um dann die patzigen Gegenreaktion seinen Gegenübers von ganz weit oben herab zu bemängeln, hat er in der Sache Recht. Das einzige was Deine tolle MCU ausmacht ist das sie einen mehrfach gepufferten SPI Eingang hat und Dich eben erst informiert wenn 3 Byte empfangen wurden. Das macht ja oft Sinn, wenn die CPU nicht jedes Byte abholen muss, sondern erst gestört wird wenn alles vorliegt. Das hat aber nichts damit zu tun das nicht jede beliebige billo MCU 24bit über SPI empfangen kann, WENN Du rechtzeitig die Daten abholst bevor die nächsten 8bit empfangen wurden.
Satz K. schrieb: > Ergebnis: ich erhalte NICHT 3x 8 Bit und 3 Interrupts! Die > Empfangs-Bitbreite muss also zu der in den CS-Frames gefundenen Anzahl > Bits passen. Quatsch! Ein weiterer Beweis, daß du SPI absolut nicht verstanden hast.
So ganz verstehe ich die Diskussion nicht - wenn ich z.B. eine SDCard im SPI-Modus anspreche, dann stehen zwischen den CS-Wechseln u.U. Hunderte von Megabytes.
Satz K. schrieb: > ...dann hast du offenbar noch immer nicht verstanden, dass ich vom > EMPFANG rede und nicht vom SENDEN! Der Empfänger programmiert nicht das > CS-Signal! Da brauchst du gar nicht so rumzuschreien. SPI ist immer ein AUSTAUSCH von Daten. Zwischen Senden und Empfangen gibt es, bis auf Unterschiede bei der Auswertung, keinen Unterschied. Das läuft parallel über MOSI und MISO ab, wobei der Takt durch den Master vorgegeben wird.
Aus dem Datenblatt "35.6.2.6.2 Client In Client mode (CTRLA.MODE=0x2), the SPI interface will remain inactive with the MISO line tri-stated as long as the SS pin is pulled high. Software may update the contents of DATA at any time as long as the Data Register Empty flag in the Interrupt Status and Clear register (INTFLAG.DRE) is set. When SS is pulled low and SCK is running, the client will sample and shift out data according to the Transaction mode set. When the content of TxDATA has been loaded into the Shift register, INTFLAG.DRE will be set, and new data can be written to DATA. Similar to the host, the client will receive one character for each character transmitted. A character will be transferred into the two-level receive buffer within the same clock cycle its last data bit is received. The received character can be retrieved from DATA when the Receive Complete interrupt flag (INTFLAG.RXC) is set. When the host pulls the SS line high, the transaction is done and the Transmit Complete Interrupt flag in the Interrupt Flag Status and Clear register (INTFLAG.TXC) will be set. " Vermutlich hat der OP die Interrupts verwechselt und anstatt des INTFLAG.RXC den INTFLAG.TXC benutzt. Den gibt es natürlich nur einmal, wenn SS auf HIGH geht.
Mit einem FPGA wäre das nicht passiert ... mit einem uC sind immer unschöne Pausen auf der Taktleitung zwischen jeweils 8 Takten.
> mit einem uC sind immer unschöne Pausen auf der > Taktleitung zwischen jeweils 8 Takten Keineswegs.
Gustl B. schrieb: > mit einem uC sind immer > unschöne Pausen auf der Taktleitung zwischen jeweils 8 Takten. Nein! ... wenn man es richtig macht. Hier Anschauungs-Material (zwei 8-Bit Transfers auf einen STM32F407): Beitrag "Re: [STM32F4xx] SPI Optimierung"
Gustl B. schrieb: > Habt Gnade, ich wollte doch nur etwas trollen (-: Das kann man hinterher leicht sagen. Wir sehen deine lange Nase ja nicht.
Satz K. schrieb: > bei dem ich 3 Byte/24 > Bit Daten über ein SPI interface empfange. Dürfte man denn wissen von welchem SPI-Partner da die Rede ist?
"35.8.10 Length Name: LENGTH Bit 8 – LENEN Data Length Enable In 32-bit Extension mode, this bit field enables the length counter. Value Description 0 Length counter disabled 1 Length counter enabled Bits 7:0 – LEN[7:0] Data Length In 32-bit Extension mode, this bit field configures the data length after which the flags INTFLAG.RCX or INTFLAG.DRE are raised. Value Description 0x00 Reserved if LENEN=0x1 0x01-0xFF" Here we go. Muss man halt alles richtig einstellen.
Thorsten S. schrieb: > Das inaktiv werden von CS- nach dem letzten Zugriff deselektiert > lediglich den Slave, so daß der aufhört, MISO zu treiben. Wenn der Slave halbwegs schlau ist, dann nutzt er die Deselektion auch dazu, seinen Kommunikations-Automaten zurücksetzen. Dann geht es beim nächsten Selektieren sicher wieder von vorne los, auch wenn sich der Automat z.B. wegen einer Störung mal "verstolpert" hat. Gustl B. schrieb: > Mit einem FPGA wäre das nicht passiert ... Und mit einem FPGA könnte man auch SPI mit 17 oder 23 Bits machen. ;-)
:
Bearbeitet durch Moderator
Wastl schrieb: > Dürfte man denn wissen von welchem SPI-Partner da die Rede ist? Der ist bestimmt wieder strenggeheim. Sonst fiele ja die gesamte Argumentation des TO in sich zusammen.
Lothar M. schrieb: >> Mit einem FPGA wäre das nicht passiert ... > Und mit einem FPGA könnte man auch SPI mit 17 oder 23 Bits machen. ;-) Toll, damit dann 99% aller Mikrocontrollern den Scheiß mit Soft-SPI ansteuern dürfen, so wie es einige ASICs machen . . . Nicht alles was technisch machbar ist, ist auch sinnvoll. Eine ganzzahliges Vielfaches von 8 als Bitanzahl sollte im 21. Jahrhundert machbar ein . . .
Falk B. schrieb: > Here we go. Muss man halt alles richtig einstellen. Noch ist nicht geklärt ob der Controller des TO als Master oder Slave konfiguriert ist. Oder hab ich etwas überlesen? Den Peripherie-Baustein möchte ich erst noch sehen der einen Mikrocontroller im Slave-Mode braucht um seine Daten zu senden.
Wastl schrieb: >> Here we go. Muss man halt alles richtig einstellen. > > Noch ist nicht geklärt ob der Controller des TO als Master oder > Slave konfiguriert ist. Oder hab ich etwas überlesen? Das hast du. Es ist ein Slave.
Wastl schrieb: >> Es ist ein Slave. > > Zeig es mir bitte. Ich habe es nicht eindeutig finden können. Nun ja, das Wort Slave hat er nie geschrieben, sich aber über meine Annahme Master aufgeregt. Daraus schließe ich, es ist ein Slave. Kann mich aber irren! ;-)
Satz K. schrieb: > Der Empfänger erwartet drei mal Wackeln wenn er nur 8 Bit SPI-Frames > kann! Ähm, was? Der Mikrocontroller ist doch sicher der Master und gibt den Takt vor, oder? Nach 8 Clocks einfach mal den Clock anhalten und das SPI-Register abfragen. Und dann die nächsten 8 Clocks schicken usw.. 24 bit Frames (oder auch mehr) ist bei SPI ja jetzt nichts ungewöhnliches. Ich hatte letztens erst ein Gerät, dass hatte sogar ein 24 Byte-SPI-Frame. Das war für den Atmega mit einem 1 Byte großen SPI-Empfangsregister auch kein Problem mit nur einmal CS wackeln lassen.
M. K. schrieb: > Satz K. schrieb: >> Der Empfänger erwartet drei mal Wackeln wenn er nur 8 Bit SPI-Frames >> kann! > > Ähm, was? Der Mikrocontroller ist doch sicher der Master und gibt den > Takt vor, oder? Oder. Es ist ein Slave. Das hatten wir schon.
Lothar M. schrieb: > Thorsten S. schrieb: >> Das inaktiv werden von CS- nach dem letzten Zugriff deselektiert >> lediglich den Slave, so daß der aufhört, MISO zu treiben. > Wenn der Slave halbwegs schlau ist, dann nutzt er die Deselektion auch > dazu, seinen Kommunikations-Automaten zurücksetzen. Dann geht es beim > nächsten Selektieren sicher wieder von vorne los,Couch wenn sich der > Automat z.B. wegen einer Störung mal "verstolpert" hat. Klar, kann man so machen. Oder auch gleich die fallende Flanke auf CS- dafür nutzen, um den Automaten hart einzusynchronisieren. Kommt im Zweifelsfall darauf an, wie das worst-case-Timing des Masters ist, also wieviel Zeit einem von der fallenden CS-Flanke bis zur ersten Aktivität auf der Taktleitung bleibt. > Gustl B. schrieb: >> Mit einem FPGA wäre das nicht passiert ... > Und mit einem FPGA könnte man auch SPI mit 17 oder 23 Bits machen. ;-) Mir ist mal beruflich ein System untergekommen, das verwendete auf den verschiedenen Steckkarten spezielle UARTs in FPGAs, die asynchron 500000-18-N-1 miteinander kommunizierten. Also ein (fast) normaler UART, aber mit 18-Bit Wortbreite mit einem Startbit und einem Stopbit ohne Parität. Glücklicherweise kann der Serial-Decoder in der Saleae-Software so konfiguriert werden um das korrekt zu decodieren, wenn ich es mit dem Logic 16 aufgezeichnet hab. Bei solchen Sonderprotokollen lernt man neue Flüche...
M. K. schrieb: > Ähm, was? Der Mikrocontroller ist doch sicher der Master und gibt den > Takt vor, oder? Wenn der TO sich so still heimlich leise zurückzieht dass man keine weitere Klärung erfährt dann weiss man normalerweise was davon zu halten ist.
Thorsten S. schrieb: > Mir ist mal beruflich ein System untergekommen, das verwendete auf den > verschiedenen Steckkarten spezielle UARTs in FPGAs, die asynchron > 500000-18-N-1 miteinander kommunizierten. Megacool, war wohl eine PDP-15? Früher konnte man einfach so praxisgerechte Wortbreiten bauen, nicht sowas ;) Falk B. schrieb: > Eine ganzzahliges Vielfaches von 8 als Bitanzahl sollte im > 21. Jahrhundert machbar ein . . .
Falk B. schrieb: > Lothar M. schrieb: >>> Mit einem FPGA wäre das nicht passiert ... >> >> Und mit einem FPGA könnte man auch SPI mit 17 oder 23 Bits machen. ;-) > > Toll, damit dann 99% aller Mikrocontrollern den Scheiß mit Soft-SPI > ansteuern dürfen, so wie es einige ASICs machen . . . > Nicht alles was technisch machbar ist, ist auch sinnvoll. Jain. Es gibt ADCs mit SPI die 12 oder 14 oder mit Vorzeichen sogar 13 oder 15 Bits liefern. Wenn man da die maximale Abtastrate schaffen will, dann verschenkt man besser keine überflüssigen Takte am SPI.
Selten so selbstgefälligen Mist gelesen. Liest sich fast so wie der Thread Beitrag "SPI-Slave ATSAMD51 / 24 Bit Frames empfangen" Die Funkstille des TO rührt sicher daher, das Selbiger den Hinweis zum Datenblatt (RTFM) befolgte…
Wastl schrieb: > Wenn der TO sich so still heimlich leise zurückzieht dass man > keine weitere Klärung erfährt dann weiss man normalerweise was > davon zu halten ist. Da Lesen offenbar nicht so deine Stärke ist: ich habe mich zurückgezogen, weil ich eigentlich bereits eine Antwort auf meine Frage erhalten habe. Was soll ich hier noch weiterdiskutieren und 30 sinnlose Postings abseits der eigentlichen Fragestellung lesen, wenn das Ego von "Falk" und Co noch nicht mal damit klarkommt, was ich explizit an der Hardware verifiziert habe? Deswegen: Bye und ein schönes Leben noch!
Satz K. schrieb: > wenn das Ego von > "Falk" und Co noch nicht mal damit klarkommt, was ich explizit an der > Hardware verifiziert habe? Du bist nur bockig und ignorant. Wollen wir wetten, daß du die Interrupts falsch konfiguriert hast? So wie du auch diverse Grundlagen von SPI nicht verstanden hast? Ich glaube, kauf mir einfach so ein Board, programmier es und werde beweisen, daß dem so ist. Die paar Euro ist mir das wert ;-)
LOL! Der TO bildet sich immer noch ein, seine SPI Kommunikation funktioniere nur mit diesem einen Controller im ATSAM-irgendwas und nicht mit jedem x-beliebigen 8-Bit SPI-Controller...
Satz K. schrieb: > Wovon redest du eigentlich? Von Master war nirgends die Rede! Aber ich > erkläre es dir gerne: > > CS geht auf LOW -> Framebeginn So weit, so gut. Der Slave kann als seine SPI-Hardware aktivieren und der Software sagen, das jetzt eine Frame startet. Die Software hat darüber hinaus per Definition die Vorab-Information, dass der Frame aus drei Payload-Bytes besteht. > Clock wackelt und signalisiert jeweils ein gültiges Datenbit -> dieses > wird in das Eingangs-Schieberegister geschoben Ja, und nach 8Bits weiss der Slave, dass eben dieses voll ist, weil die Hardware halt weiss, dass da nur 8 Bit reinpassen. Die Situation kann dann auf drei verscheidene Weisen behandelt werden. Entweder per Polling oder per Interrupt oder per DMA. Bei korrekter Programmierung führen alle drei Verfahrensweisen letztlich dazu, dass ein Byte aus dem Empfangsregister im Speicher landet und ein Bytezähler inkrementiert wird. > CS geht auf HIGH -> Frameende Hier wird's dann komplizierter. Normalerweise interessiert dieses Event nicht, denn da hat man schon vorher die Information bekommen, dass drei Bytes in den Speicher übertragen wurden. Tracken sollte man es trotzdem, um eine vollständige Behandlung aller denkbaren Fehler zu gewährleisten. > die MCU schiebt die Daten aus dem > Eingangs-Schieberegister in irgend ein Empfangsregister oder FIFO oder > was auch immer. > > Was du mir gerade versuchst zu erzählen: Wenn das > Eingangs-Schieberegister nur 8 Bit hat, kann ich da trotzdem 24 Bit drin > empfangen, weil die überschüssigen 16 Bit ... ja bitte wo landen die > denn? Du Klops hast noch nie was von DMA gehört. Das ist wohl im Kern dein Problem. Aber auch ohne DMA kann man die Sache handlen (wenn die MCU schnell genug ist), entweder per SPI-Byte-Interrupt oder sogar per Polling, denn in beiden Fällen führt man ja einen Bytecounter mit, der halt bei drei sein sollte, noch bevor CS wieder auf High geht. Man muss halt einfach nur denken und programmieren können, das ist schon alles. Schwierig wird es bei SPI eigentlich nur dann, wenn die zu empfangene Bitzahl kein Vielfaches von 8 ist.
Satz K. schrieb: > Da Lesen offenbar nicht so deine Stärke ist: ich habe mich > zurückgezogen, weil ich eigentlich bereits eine Antwort auf meine Frage > erhalten habe. Das Leben wäre so einfach wenn du uns deinen (geheimen) SPI- Partner nennen würdest. Dann würde es dir (und ggf. uns) wie Schuppen aus den Haaren fallen wie klar das alles ist. Da das aber nicht passiert muss man dir Unbelehrbarkeit und Starrsinn attestieren. Dir würde vermutlich ein Zacken aus der Krone fallen wenn du uns dein SPI Peripheral nennen würdest.
Zu erwähnen ist noch, dass das SPI Empfangs-Registern bei vielen Controllern gepuffert ist, also wenn ein Byte empfangen wurde kann schon das nächste durch das Schieberegister getaktet werden, man muss rechtzeitig die Daten lesen. Die ATSAM SERCOM sind gepuffert und der SPI von einem ATMEGA328 zum Beispiel auch. Ja, in dem Ausschnitt den Falk aus dem Datenblatt gepostet hat steht schon "two-level receive buffer", ich wollte es nur mal explizit erwähnen. Und was die ATSAM angeht, wenn der ATSAMD51G nur für den SPI im Projekt ist könnte der vielleicht durch einen ATSAMD21G ersetzt werden. Die ATSAMD21 haben sehr ähnliche SERCOM Einheiten, allerdings ohne den 32 Bit Mode. Die ATSAMD21 sind fast Pin-Kompatibel, Pin 41 und 43 sind anders belegt. Und es sind "nur" Cortex-M0+ mit 48MHz. Aber die wären sehr ähnlich programmierbar und Mouser und Digikey haben davon im Moment tausende auf Lager.
Ben S. schrieb: > Master, Slave .... das ist doch auch nicht mehr zeitgemäß Jaja, der liebe Zeitgeist . . . https://de.wikipedia.org/wiki/Zeitgeist Besser Cheffe und Ali? ;-)
Falk B. schrieb: > Besser Cheffe und Ali? ;-) Die Diskussion gibts tatsächlich. https://www.netzwoche.ch/news/2020-06-17/die-anti-rassismus-bewegung-veraendert-auch-das-it-vokabular
Ben S. schrieb: >> Besser Cheffe und Ali? ;-) > > Die Diskussion gibts tatsächlich. Weiß ich! Auch Arduino ist woke! https://content.arduino.cc/assets/A000066-full-pinout.pdf "CIPO/COPI have previously been referred to as MISO/MOSI" MASTER, MASTER, MASTER! https://www.youtube.com/watch?v=IsvfofcIE1Q ;-)
Ben S. schrieb: > Master, Slave .... das ist doch auch nicht mehr zeitgemäß Das Thema ist schon längst geklärt. https://hackaday.com/2020/06/29/updating-the-language-of-spi-pin-labels-to-remove-casual-references-to-slavery/
C-hater schrieb: > Normalerweise interessiert dieses Event nicht, denn da hat man schon > vorher die Information bekommen, dass drei Bytes in den Speicher > übertragen wurden. Es gibt durchaus SPI Devices, die nehmen jeweils die zuletzt vor der steigenden Flanke eingetakteten Bits für sich. Solche Devices kann man dann in einer Kette (Daisy-Chain) hintereinander anschließen, ein paar hundert Bits durchtakten und zum Schluss mit der steigenden SS# Flanke allen zusammen sagen, dass die Daten jetzt gelten.
Satz K. schrieb: > Deswegen meine Frage: kennt jemand eine andere MCU, welche mindestens > zwei SPIs mit mehr als 16 bit Datenbreite bietet? Die RSPIc der Renesas RX Familie können das >Transfer bit length is selectable as 8, 9, 10, 11, 12, 13, 14, 15, 16, 20, 24, or 32 bits. Z.B. R5F565N7ADFP https://mou.sr/3Hxw1el Grüße
Satz K. schrieb: > Und was genau nützt mir 3x 8 Bit (mit 3x Wackeln auf der Select-Leitung) > wenn ich 1x 24 Bit mit 1x Wackeln auf der Select-Leitung benötige? Wie kommst Du auf das schmale Brett, daß /SS 3* wackeln muß? /SS hat genau 2 Aufgaben: - den Bitzähler auf 0 zu setzen - den MISO zu enablen, damit es bei mehreren Slaves nicht zur Kollision kommt. Typisch ändert sich /SS also genau am Anfang und am Ende eines Pakets. Wieviel Bytes ein Paket lang ist, interessiert nicht. Einen Interrupt erhältst Du jeweils zur eingestellten Bitzahl je Wort (8, 16, 24 usw.)
Peter D. schrieb: > Wie kommst Du auf das schmale Brett ...... Wie kommst Du darauf nochmal das Thema von vorne aufzurollen wo wir doch schon mit Penetranz erlebt haben dass der TO beratungsresistent und stur ist, und sich in die Aufklärung des Problems nicht (mehr) einbringen will? Der Grund der Verabschiedung hat sich ja zwischen den Zeilen auch bereits gezeigt: Wastl schrieb: > Das Leben wäre so einfach wenn du uns deinen (geheimen) SPI- > Partner nennen würdest. Dann würde es dir (und ggf. uns) wie > Schuppen aus den Haaren fallen wie klar das alles ist. > > Da das aber nicht passiert muss man dir Unbelehrbarkeit und > Starrsinn attestieren. Dir würde vermutlich ein Zacken aus der > Krone fallen wenn du uns dein SPI Peripheral nennen würdest.
Also ich weiss jetzt nicht wieso ihr so auf dem TO herum hackt, weil in seinem ersten Post steht explizit das: Satz K. schrieb: > ich nutze aktuell den ATSAMD51G für ein Projekt, **bei dem ich 3 Byte/24 > Bit Daten über ein SPI interface empfange**. Der ATSAMD51G bietet die > Möglichkeit, die Anzahl der in einem SPI-Frame zu empfangenden Bytes zu > konfigurieren, weswegen ich den dafür ausgewählt habe. Er sucht eine Alternative zum ATSAM -> dann muss dieser wohl auch als Empfänger herhalten... Also ob jetzt der Controller als Slave konfiguriert wird, steht zwar nicht wortwörtlich da, aber von diesem Text auf ein Master zu schliessen ist doch schon sehr weit her geholt. Und zur Thematik CS = Copy-Event: Das finde ich nicht so abwegig, weil sonst würden alle Daisy-Chains nicht funktionieren (was soweit ich weiss ja auch Jahrzehnte Standard ist). Aber ich glaube die Ursprungsfrage wurde beantwortet und die restlichen 80% an Posts, naja...
Patrick B. schrieb: > Also ob jetzt der Controller als Slave konfiguriert wird, steht zwar > nicht wortwörtlich da, aber von diesem Text auf ein Master zu schliessen > ist doch schon sehr weit her geholt. Von einem extern per SPI angeschlossenem ADC muss man auch schon mal 24 Bit empfangen, das macht den ADC aber nicht zum Master.
Lothar M. schrieb: > Es gibt durchaus SPI Devices, die nehmen jeweils die zuletzt vor der > steigenden Flanke eingetakteten Bits für sich. Solche Devices kann man > dann in einer Kette (Daisy-Chain) hintereinander anschließen Danke Lothar, hab mich schon gewundert warum das nicht erwähnt wurde. Wir haben für ein Projekt 20MCUs in Daisy Chain verschaltet. Da war das SPI Feature mit steigender Flanke essentiell. Ist meiner Meinung nach wichtiger als die fallende...
Patrick B. schrieb: > Also ich weiss jetzt nicht wieso ihr so auf dem TO herum hackt, weil in > seinem ersten Post steht explizit das: Ein MCP3424 sendet sein ADC Wert, der vom µC empfangen wird, u.a. auch in einem 3 Byte/24 Bit Frame. Er ist deshalb aber dennoch kein Master. Und es gibt viele SPI-Slaves, die ihre Daten in x Byte/ 8*x Bit Frames senden. Das ist nun wahrlich keine Seltenheit. ;)
M. K. schrieb: > Patrick B. schrieb: >> Also ich weiss jetzt nicht wieso ihr so auf dem TO herum hackt, weil in >> seinem ersten Post steht explizit das: > > Ein MCP3424 sendet sein ADC Wert, der vom µC empfangen wird, u.a. auch > in einem 3 Byte/24 Bit Frame. Er ist deshalb aber dennoch kein Master. > Und es gibt viele SPI-Slaves, die ihre Daten in x Byte/ 8*x Bit Frames > senden. Das ist nun wahrlich keine Seltenheit. ;) Also ich dachte der kann nur I2C. Naja…
Uwe D. schrieb: > Also ich dachte der kann nur I2C. Naja… Da hab ich mich vertan, ich dachte der hat SPI, wie der MCP3903, bei dem man den CS-Pin auch nur zum Start und zum Ende der Übertragung umschaltet und es einem quasi völlig egal sein kann, ob man 1 Byte oder 10 Byte durch den durch schiebt ;)
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.