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
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.
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.
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
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.
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.
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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.