Hi zusammen,
diesmal habe ich folgendes Problem:
ich habe ein STM32F4 Discovery und möchte den Audio-DAC CS43L22 verwenden.
Konfigurieren hat auch funktioniert und wenn ich in meiner main-while-Schleife das passende Flag wie folgt abfrage und daraufhin einen neuen Wert sende kommt auch was raus.
Da ich aber noch ein paar andere Sachen nebenher mache, unter anderem ein Display ansteuern, braucht das Programm zu lange und man hört eine Unterbrechung, wenn z.B. das Display neu beschrieben wird.
Also habe ich einen Timer mit 50kHz eingestellt und die Abfrage darin gemacht. Nun hört man nichts mehr, allerdings sieht man auf dem Display deutlich, dass der Interrupt des Timers kommt. Die einzelnen Zeichen werden nicht mehr fast "gleichzeitig" angezeigt, sondern erscheinen wie eine Laufschrift nacheinander. ("Das ist kein Bug, das ist ein Feature")
Daher wäre es top, wenn ich den DAC per DMA gespielen würde, die bekomme ich aber einfach nicht zum laufen...
Die Config der DMA sieht bisher so aus:
Die IRQ_Handler werden nicht einmal aufgerufen, und bei den Kopfhörern kommt ebenfalls nichts an (es rauscht ein wenig, daher denke ich des DAC ist wieder richtig konfiguriert, allerdings bekommt er keine Daten);
Hat jemand eine Ahnung was ich falsch gemacht haben könnte?
EDIT: Achso,
wird natürlich nach dem Aufruf der setupDMA() gemacht.
diesmal habe ich folgendes Problem:
ich habe ein STM32F4 Discovery und möchte den Audio-DAC CS43L22 verwenden.
Konfigurieren hat auch funktioniert und wenn ich in meiner main-while-Schleife das passende Flag wie folgt abfrage und daraufhin einen neuen Wert sende kommt auch was raus.
Code:
//DAC abfragen
if (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE))
{
//naechstes Sample senden
SPI_I2S_SendData(SPI3, sample);
//Trennung Kanal
if(channel)
{
sample=sinus[stelle];
stelle++;
if (stelle>=48)
stelle-=48;
}
else
sample=0;
}
Da ich aber noch ein paar andere Sachen nebenher mache, unter anderem ein Display ansteuern, braucht das Programm zu lange und man hört eine Unterbrechung, wenn z.B. das Display neu beschrieben wird.
Also habe ich einen Timer mit 50kHz eingestellt und die Abfrage darin gemacht. Nun hört man nichts mehr, allerdings sieht man auf dem Display deutlich, dass der Interrupt des Timers kommt. Die einzelnen Zeichen werden nicht mehr fast "gleichzeitig" angezeigt, sondern erscheinen wie eine Laufschrift nacheinander. ("Das ist kein Bug, das ist ein Feature")
Daher wäre es top, wenn ich den DAC per DMA gespielen würde, die bekomme ich aber einfach nicht zum laufen...
Die Config der DMA sieht bisher so aus:
Code:
void setupDMA()
{
//Clock
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
// DMA Stream IRQ Channel0
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// DMA Stream IRQ Channel5
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//DMA config
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable ;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single ;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI3->DR));
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
//SPI3_RX = Stream0 Channel 0
//SPI3_TX = Stream5 Channel 0
// Configure Tx DMA
DMA_Cmd(DMA1_Stream5, DISABLE);
while (DMA1_Stream5->CR & DMA_SxCR_EN); //warten bis EN=0
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) &DMAbufferTx[0];
DMA_InitStructure.DMA_BufferSize = DMAbufferSizeTx;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_Init(DMA1_Stream5, &DMA_InitStructure);
// Configure Rx DMA
DMA_Cmd(DMA1_Stream0, DISABLE);
while (DMA1_Stream0->CR & DMA_SxCR_EN); //warten bis EN=0
DMA_InitStructure.DMA_Channel = DMA_Channel_0;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) &DMAbufferRx[0];
DMA_InitStructure.DMA_BufferSize = DMAbufferSizeRx;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_Init(DMA1_Stream0, &DMA_InitStructure);
DMA_ITConfig(DMA1_Stream0, DMA_IT_TC , ENABLE); //| DMA_IT_HT
/* Enable the DMA channel */
DMA_ClearFlag(DMA1_Stream0, DMA_FLAG_FEIF0|DMA_FLAG_DMEIF0|DMA_FLAG_TEIF0|DMA_FLAG_HTIF0|DMA_FLAG_TCIF0);
DMA_ClearFlag(DMA1_Stream5, DMA_FLAG_FEIF5|DMA_FLAG_DMEIF5|DMA_FLAG_TEIF5|DMA_FLAG_HTIF5|DMA_FLAG_TCIF5);
DMA_Cmd(DMA1_Stream0, ENABLE); // Enable the DMA SPI TX Stream
DMA_Cmd(DMA1_Stream5, ENABLE); // Enable the DMA SPI RX Stream
// Enable the SPI Rx/Tx DMA request
SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Rx, ENABLE);
SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Tx, ENABLE);
}
Die IRQ_Handler werden nicht einmal aufgerufen, und bei den Kopfhörern kommt ebenfalls nichts an (es rauscht ein wenig, daher denke ich des DAC ist wieder richtig konfiguriert, allerdings bekommt er keine Daten);
Hat jemand eine Ahnung was ich falsch gemacht haben könnte?
EDIT: Achso,
Code:
I2S_Cmd(SPI3, ENABLE);
Zuletzt bearbeitet: