Forum: Mikrocontroller und Digitale Elektronik Probleme mit I2S zwischen STM32F107 und CS42L52


von Bastian W. (jackfrost)


Angehängte Dateien:

Lesenswert?

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

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.