Forum: Mikrocontroller und Digitale Elektronik STM32F407 wie SPI mit variablen Bit längen machen


von Klaus (Gast)


Lesenswert?

Hallo.

Ich habe das Problem das ich mit der SPI Daten senden will.
Aber nicht nur 32 Bit sondern auch jenach Wunsch von Aussen auch mal nur 
8, ..,16,18,20,..,32.

Intern habe ich die Daten in einem Doppel-Buffer mit 32Bit (2*4K)
Die Ausgabe geht über DMA mit Int beim Puffer wechsel.
Die SPI arbeitet als Slave.

Zur Zeit arbeit alles mit 32Bit, SPI an und los gehts bis zum Stop der 
ganzen Sache.

Aber ich will/muss ja auch weniger senden, kann ich nun einfach die 
SPI-Enable Leitung nach 14Bit kappen und beim wieder starten geht es mit 
den nächsten 32Bit aus meinem Speicher weiter?

VG, Klaus

von Arduinoquäler (Gast)


Lesenswert?

Klaus schrieb:
> Aber ich will/muss ja auch weniger senden,

Bei welcher Anwendung muss das der Fall sein?

Klaus schrieb:
> kann ich nun einfach die SPI-Enable Leitung nach 14Bit kappen

Wenn du so anfängst kann es mit der Ernsthaftigkeit deiner
Anwendung nicht sehr weit her sein.

Bei solchen Pfusch-Ansätzen bin ich weg.

von Jim M. (turboj)


Lesenswert?

Klaus schrieb:
> Aber ich will/muss ja auch weniger senden, kann ich nun einfach die
> SPI-Enable Leitung nach 14Bit kappen und beim wieder starten geht es mit
> den nächsten 32Bit aus meinem Speicher weiter?

Nö. Wenn die Bitrate nicht total schnarchlahm ist kann man als Slave an 
der Enable Leitung nix rechtzeitig machen.

Aber wenn man so einen SPI mit DMA hat, kann man den i.d.R. auch auf 
krumme Bitzahlen von 4..16 stellen.

von Klaus (Gast)


Lesenswert?

Die Anwendung spielt eigentlich keine Rolle.
Hat was mit Signalerzeugung MONO zutun und einem DAC der jenach 
Einstellung halt 8,16,18,20,24 Bit & CLOCK erwartet aber die Übernahme 
nach der Zeit von 32Bit erst haben will. Was ich aber noch genauer 
Testen werde.

Warum genau hinterfrage ich lieber nicht sonst ist wieder Ostern bis ich 
die Hintergründe der verbauten Teile zusammen habe.

Pfusch? Nicht bei mir! Ich muss nur den Pfusch der andern irgendwie 
benutzen.

14Bit war so schön krum, darum habe ich das als Beispiel genommen.
VG, Klaus

von Klaus (Gast)


Lesenswert?

Die Ganzen Leitungen erzeuge ich aus einem internen Timer mit externen 
24,xxxx MHz Quarz am Timer Eingang.
Somit kann ich da fast alles Erzeugen was ich will.

von Darth Moan (Gast)


Lesenswert?

Moin,

der STM32F407 ist doch auf dem Discovery drauf. Da hab ich keine
Einstellung fuer andere Transferlaengen als 8 oder 16 bit im RefMan
gefunden.
Aber da du Slave Bist muesste der Master das clocken doch einfach
einstellen und den NSS auf high ziehen. Die SPI glaubt dann eben
nicht fertig zu sein und wartet auf weitere clocks, oder?
Da koennte man probieren, den Transfer Buffer einfach neu zu
beschreiben. Aber ich habe das nur in einem Fall mal gemacht, da ich
nicht wissen konnte wann der Transfer vom Master zu ende sein wird, und
schon mal Dummy Transferdaten in den Sendebuffer geschoben habe.
Aber dabei hoerte der Master immer genau auf der Transfergrenze auf
zu clocken, sodass nur im Buffer-Latch die Daten ueberschrieben werden
mussten. Sonst wurde zu Beginn des naechsten Transfers die alten Dummy
Daten ausgegeben. Was nicht erwuenscht war. Man braucht natuerlich
genuegend Zeit zwischen 2 SPI Transfers um das Ende zu detektieren und
die Dummy Daten mit den Daten fuer den naechsten Transfer zu
ueberschreiben.
Ich glaube, die Daten werden mit den ersten Clock aus dem Buffer ins
Schieberegister uebertragen.
Muesstest du mal probieren, ob das klappt. Sonst bliebe nur die SPI
Signale anders zu erzeugen zB mit Timern und DMA. Da ist man dann ganz
frei was die Transferlaengen angeht.

von Klaus (Gast)


Lesenswert?

Wie gesagt kommen der Takt und NSS von einem Timer Ausgang.
Die Steuersignale vom DAC macht der auch gleich mit, ist ja alles ein 
Taktsystem.

Wenn der DMA einfach die SPI weiter schaltet wenn ich NSS abschalte ist 
alles was ich brauche machbar.

Kann ich aber erst heute abend testen.
VG, Klaus

von Markus (Gast)


Lesenswert?

Beim STM32GENERIC Arduino Core gibt es jetzt I2S Unterstützung.
Mittlerweile kann man auch einen Buffer auf dem Codec des CS43L22 im 
Arduino-Environment abspielen. Der Codec ist auf dem STM32F4 Discovery 
mit drauf.

Der Arduino-I2S Treiber funktioniert auch auf jedem beliebigen F407 
Board zusammen mit dem I2S Verstärker von Adafruit.
Beitrag "Re: I2S Verstärker"

Der STM32F407 hat ja auch einen DAC, den man zur Audiosignalerzeugung 
nehmen könnte. Soweit ich weiß, fehlt der Arduino-Treiber dafür aber 
noch ( Dürfte aber bald kommen ). Zur Not mit der freundlichen 
Unterstützung dieses Forums ;-)

Wen man den DAC mit hoher Abtastrate und Dithering betreibt, kommt man 
sicher wahrscheinlich auch auf 16Bit Audioqualität ( vermute ich mal ).

Ansonsten wäre die Frage, ob PWM nicht geeigneter wäre als SPI. Mit PWM 
Dithering kommt dort wahrscheinlich auch auf eine gute Audioauflösung.

von Darth Moan (Gast)


Lesenswert?

Moin,

Klaus schrieb:
> Wenn der DMA einfach die SPI weiter schaltet wenn ich NSS abschalte ist
> alles was ich brauche machbar.

aber der DMA macht doch von sich aus erstmal garnix. Die SPI vordert
DMA Transfers an, wenn die DMA Bits enabled sind (in der SPI
Konfiguration). Sobald ein Clock Signal reinkommt (bei NSS low) will
die SPI arbeiten. Und wenn der TX Buffer ins Schieberegister
transferiert wurde, wird das TXE (TX Buffer Empty) Flag gesetzt, das
im DMA Mode einen weiteren Transfer anfordert.

Wie hast du denn den TX DMA Kanal konfiguriert?
Ist die Zahl der Transfers passend eingestellt?
Kriegst du einen DMA complete Interrupt?
Oder checkst du NSS steigende Flanke?

Andererseits, wenn du die SPI Signale alle selbst erzeugts, kannst du
doch dem STM entgegen kommen und nur 8 bzw. 16 bit Transfers machen.
Ich kenne das Problem nur von externer HW die eben nicht anpassbar
ist, und ihre vermaldeiten 20Bit Transfers verlangt.

von Klaus (Gast)


Lesenswert?

Der DMA - SPI Transfer ist auf 32Bit eingestellt mit dem normalen 
Standart Werten für so was.

Eigentlich stellt sich nur noch die Frage,
ob die SPI dem DMA auch nach 8,16,18,20,24 Bit sagt "neue Daten Bitte" ?

NSS nehme ich dann logischerweise nach der richtigen Bit Anzahl weg.
Nur intern ist Speicher, DMA und SPI auf 32Bit eingestellt.

Klaus

von Darth Moan (Gast)


Lesenswert?

Moin,

Klaus schrieb:
> Eigentlich stellt sich nur noch die Frage,
> ob die SPI dem DMA auch nach 8,16,18,20,24 Bit sagt "neue Daten Bitte" ?

nee, das macht die nicht. Man kann da nur zwischen 8 und 16 Bit waehlen.
Ich weiss, bei anderen µC Familien geht sowas, aber beim STM32F407 
nicht.

Aber wenn ich das richtig verstanden habe, ist ein permanenter Clock da.
Dann kann doch das NSS solange low bleiben, bis ein Octet voll ist.
Dann kommen halt Dummy Daten ans Ende Des Transfers rein. Die braucht
man dann nur in SW wegschmeissen und gut ist.
Also ggf. ein separates NSS fuer den µC und die HW. ZB 18 Bit lang fuer
die HW und 24bit fuer den µC. Sind dann volle 3 Bytes fuer den 407er und
seine Welt ist heile. Wiederholen tut sich das erst nach 32 Clocks.

Oder hab ich das verpeilt?

Ich lasse da eigentlich immer den µC den Master machen. Und hab dann 
schmutzbuckelig das NSS mitm Timer erzeugt, das eben 20 bit lang war.
MISO hat ja Pullup, kommen halt ein paar 1er rein, wegschneiden, gut.

Nur bei µC-µC SPI ging das nicht, aber da habe ich, wie gesagt, immer
auf 16Bit aufgefuellt. Hatte ja beides unter Kontrolle.

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.