Hi
Ich habe ein digitales MEMS Mikrofon, dass ich gerne an das
STM32f4-Discovery über I2S anbinden möchte. Die Daten sollen über DMA in
den Speicher geschrieben werden. Die Samples haben eine Breite von 24
Bit und werden entsprechend in einer 32 Bit long Variable gespeichert.
Die Daten sollen noch auf dem Controller verarbeitet werden, weswegen
sich ja ein Ringpuffer oder ähnliches anbietet. Ich habe das selbe schon
auf einen M3 von TI realisiert. Dort betreiben ich den DMA im Ping-Pong
Modus, mit einer primären und sekundären DMA-Konfiguration, und habe
einen Software Ringpuffer. Dort ist es so, dass wenn der I2S FIFO voll
ist, dann wird ein DMA Request ausgelöst, was wiederum den I2S Interrupt
auslöst und die I2S ISR aufgerufen wird. In dieser ISR prüfe ich dann
beide DMA Konfiguration (eben "Ping" oder "Pong" ;-) ) darauf, ob sie
angehalten wurden, weil die definierte Anzahl an zu übertragenden
Elementen vollständig übertragen wurden. Ist das der Fall, dann
konfiguriere ich einen Transfer mit neuer Zieladresse und gebe den
Transfer frei, so dass er gestartet wird, wenn der andere Transfer
abgeschlossen ist, u.s.w. Das ganze sieht dann für das Teil von TI so
aus:
Einmal die Konfiguration des DMA
1
voiduDMAInit()
2
{
3
4
/**
5
* Enable the uDMA controller at the system level. Enable it to continue
6
* to run while the processor is in sleep.
7
*/
8
SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
9
SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA);
10
11
/*
12
* Aktiviert den uDMA Controller
13
*/
14
uDMAEnable();
15
16
/*
17
* Setzt den Pointer auf den Speicher für die Kontrollstruktur
So, nun bin ich neu, was die STM32 Controller angeht und blicke noch
nicht vollständig durch die Konfiguration und deren Eigenheiten durch.
Wie läuft das dort ab? Kann ich da im Prinzip den selben weg gehen?
Welche ISR wird dort aufgerufen, wenn ein Transfer beendet ist? Die vom
entsprechenden DMA Stream oder auch die vom I2S? Wie sollte der DMA
Controller sinnvoll und äquivalent zu dem vom TI konfiguriert werden?
Die nachvollgenden Codeausschnitte spiegeln meine bisherige
Konfiguration wieder. Macht die in diesem Szenario so Sinn?
Das ist die DMA Konfiguration
Hi,
hast du noch Probleme bei dem Thema bzw. liegt es auf Eis oder hast du
es bereits verworfen.
Ich hatte ähnliche Probleme mit dem I2S und vl. kann ich da
weiterhelfen.
- Manuel
Manuel schrieb:> Hi,>> hast du noch Probleme bei dem Thema bzw. liegt es auf Eis oder hast du> es bereits verworfen.>> Ich hatte ähnliche Probleme mit dem I2S und vl. kann ich da> weiterhelfen.>> - Manuel
Interesse hätte ich grundsätzlich schon, allerdings bin ich mittlerweile
nicht mehr ganz so sehr in der Thematik drin, weil ich das Problem dann
mit der anderen Plattform gelöst hatte. Vielleicht kannst du mir aber
einfach noch mal sagen, welche Problematik du hattest und wie du sie
lösen konntest. Interessieren würde mich eine Lösung grundsätzlich auch
weiterhin.
Schöne Grüße
Also grundsätzlich war dein Ansatz der Initialisierung und des
Interrupts fast richtig.
Bei meinen I2S Routinen hatte ich eine FullDuplex konfiguration.
Senden verlief Problemlos, ich hatte aber Probleme mit dem Datenempfang.
Wichtig ist, dass die Memory Buffer im SRAM definiert werden ansonsten
geht der DMA in keinen Interrupt (so wars jedenfalls bei mir mit dem
STM32F405). Warum dass so ist konnt ich leider nicht rausfinden, bzw.
nahm ich mir nicht die Zeit dazu.
1
__attribute__((section(".sram2")))singedlong...
Nur so hat es bei mir funktioniert.
Für mich sieht dein Code bis auf ein paar Stellen funktionstüchtig aus:
Die Zeile
weglassen. Das Target auf das Memory wird automatisch bei dem TC
Interrupt geswitched.
Wie gesagt, ansonsten fällt mir nicht mehr auf und es müsste eigentlich
funktionieren, ich hatte meine Routinen allerdings im FullDuplexMode und
als I2S Masters.
LG
- Manuel