Hallo,
ich will auf dem Devboard MCBSTM32C von Keil(
http://www.keil.com/mcbstm32c/mcbstm32c-base-board-schematics.pdf ) über
I2S Den Mikrofoneingang vom CS42L52 einlesen. Leider kommen die Daten
scheinbar verschoben an. Über die ISR vom SPI2 IRQ werden die Daten je
nach Kanal in zwei verschiedene Arrays gespeichert. Am Kopfhöher ausgang
kann ich alles vom Mikrofon gut hören.
Normal sollten im Array "raw_data" nur 0x00 sein , da der Kanal im
CS42l52 digital gemutet ist. Mit dem Saleae habe ich den I2S Datenstrom
aufgezeichnet und es passt. Der Audiocodec sendet im I2S Format und die
Daten im Kanal 1 sind immer 0(Bild Data_Chan1_LA). Im Array sind die
Daten leider nicht immer 0 (Bild Data_Chan1). Unten ist die ISR mit der
ich die Daten auf die beiden Arrays verteile. Im Errata hab ich nichts
gefunden das der µC hier ein Problem hat.
DEr STM32F107 läuft mit 72 MHz. Die Daten kommen mit
Ich schreibe im Segger Studio mit CMSIS.
1 | void SPI2_IRQHandler()
|
2 | {
|
3 | if(!(half || full))
|
4 | if(SPI2->SR & SPI_SR_CHSIDE)
|
5 | {
|
6 | raw_data2[position2]=SPI2->DR;
|
7 | position2++;
|
8 | position2 %=1024;
|
9 | }
|
10 | else
|
11 | {
|
12 | raw_data[position]=SPI2->DR;
|
13 | position++;
|
14 | position %=1024;
|
15 | if(position == 0)
|
16 | full = true;
|
17 | if(position == 512)
|
18 | half = true;
|
19 | }
|
20 | else
|
21 | {
|
22 | volatile uint16_t temp = SPI2->DR;
|
23 | }
|
Die Initialisierung der I2S Schnittstelle :
1 | //Init I2S2
|
2 | RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;
|
3 | MODIFY_REG(GPIOB->CRH, GPIO_CRH_CNF12 + GPIO_CRH_MODE12, GPIO_CRH_CNF12_1 + 0 );
|
4 | MODIFY_REG(GPIOB->CRH, GPIO_CRH_CNF13 + GPIO_CRH_MODE13, GPIO_CRH_CNF13_1 + 0 );
|
5 | MODIFY_REG(GPIOB->CRH, GPIO_CRH_CNF15 + GPIO_CRH_MODE15, GPIO_CRH_CNF15_1 + 0 );
|
6 | SPI2->I2SCFGR |= SPI_I2SCFGR_I2SMOD | SPI_I2SCFGR_I2SCFG_0;
|
7 | SPI2->CR2 |= SPI_CR2_RXNEIE;
|
8 | SPI2->I2SCFGR |= SPI_I2SCFGR_I2SE;
|
9 | NVIC_EnableIRQ(SPI2_IRQn); // Enable SPI2 IRQ
|
10 | NVIC_SetPriority(SPI2_IRQn,5);
|
Ich hatte es auch mit dem DMA probiert, da ging es leider auch nicht.
1 | void DMA1_enable(uint32_t *data)
|
2 | {
|
3 | RCC->AHBENR |= RCC_AHBENR_DMA1EN ;
|
4 | DMA1_Channel4->CCR |= DMA_CCR4_PL_0 | DMA_CCR4_MSIZE_0 | DMA_CCR4_PSIZE_0 | DMA_CCR4_MINC | DMA_CCR4_CIRC | DMA_CCR4_HTIE | DMA_CCR4_TCIE;
|
5 | DMA1_Channel4->CNDTR = 2048;
|
6 | DMA1_Channel4->CMAR = data;
|
7 | DMA1_Channel4->CPAR = &SPI2->DR;
|
8 |
|
9 | NVIC_EnableIRQ(DMA1_Channel4_IRQn); // Enable DMA IRQ
|
10 | NVIC_SetPriority(DMA1_Channel4_IRQn,5);
|
11 | DMA1_Channel4->CCR |= DMA_CCR4_EN;
|
12 | }
|
13 |
|
14 | void DMA1_Channel4_IRQHandler()
|
15 | {
|
16 | if(DMA1->ISR & DMA_ISR_HTIF4)
|
17 | {
|
18 | DMA1->IFCR = DMA_IFCR_CHTIF4;
|
19 | half = true;
|
20 | SPI2->CR2 &= ~SPI_CR2_RXDMAEN;
|
21 | }
|
22 | if(DMA1->ISR & DMA_ISR_TCIF4)
|
23 | {
|
24 | DMA1->IFCR = DMA_IFCR_CTCIF4;
|
25 | GPIOE->ODR ^= (1 << 15);
|
26 | full = true;
|
27 | SPI2->CR2 &= ~SPI_CR2_RXDMAEN;
|
28 | }
|
29 | }
|
Gibt es ausser, das ich SPI2 im I2S Modus laufen lasse und aich das I2S
Format ausgewält habe noch zu beachten ?
Gruß JackFrost