Добрый день...
Попробовал запустить I2S и USART3 через DMA1...
Судь в следующем:
снимаю данные по I2S с микрофона (частота 1 МГц) 4 раза по 16 бит (8 по 8 не получается) в DMA1 Stream3 channel0... Предварительно создал массив на 8 байт...
Данные записываются исправно, в отладчике видно... Отключаю третий поток, чтобы остановить меняющиеся данные, включаю четвёртый поток и начинаю передавать в USART3 8 байт...
И вроде всё хорошо, данные передаются правильно, но в регистре флагов DMA high interrupt status register (DMA_HISR) вылезает флаг ошибки FIFO, а именно FEIF4 (A FIFO error event occurred on stream 4)...
Перепроверял последовательности в памяти и те которые выводятся в терминале, всё совпадает... И хоть флаг можно сбросить, но как-то мне кажется не очень красиво получается...
Это куски с настройками DMA1:
CODE
unsigned char buf[8]; // 0x00
/* DMA1 Stream3 configuration */
DMA1_Stream3->CR = 0x00000000; // DMA1 stream3 channel 0 SPI2/RX configuration clear
DMA1_Stream3->CR = 0x00002D10; // DMA1 stream3 channel 0 SPI2/RX configuration set
DMA1_Stream3->NDTR = 4; // number of data items
DMA1_Stream3->PAR = (uint32_t) &SPI2->DR; // peripheral address register
DMA1_Stream3->M0AR = (uint32_t) &buf[0]; // memory address register
/* DMA1 Stream4 configuration */
DMA1_Stream4->CR = 0x00000000; // DMA1 stream4 channel 7 USART3/TX configuration clear
DMA1_Stream4->CR = 0x0E000550; // DMA1 stream4 channel 7 USART3/TX configuration set
DMA1_Stream4->NDTR = 8; // number of data items
DMA1_Stream4->PAR = (uint32_t) &USART3->DR; // peripheral address register
DMA1_Stream4->M0AR = (uint32_t) &buf[0]; // memory address register
Ind:
CODE
/* DMA1 Stream3 receive part */
DMA1_Stream3->CR |= (1<<0); // DMA1 On
for(;((DMA1->LISR & 0x08000000) == 0x00000000)

{
}
DMA1_Stream3->CR &= ~(1<<0); // DMA1 Stream3 Off
DMA1->LIFCR |= ((1<<27) | (1<<26)); // clear flags TCIF3 and HTIF3
/* DMA1 Stream4 receive part */
DMA1_Stream4->CR |= (1<<0); // DMA1 Stream4 On
for(;((DMA1->HISR & 0x00000020) == 0x00000000)

{
}
DMA1_Stream4->CR &= ~(1<<0); // DMA1 Stream4 Off
DMA1->HIFCR |= ((1<<5) | (1<<4)); // clear flags TCIF4 and HTIF4
goto Ind; // return Ind
return(0); // END programm
}
Этот флаг явно показывает, что что-то не так... Читал в документации, что возможно возникновение флага при переполнении...
Но как, где и в каком промежутке выполнения программы возникает...
Сообщение отредактировал IgorKossak - Dec 6 2012, 10:03
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!