Добрый день, понадобилась передавать через SAI 5 байт, в режиме одиночного буфера DMA, все передается как надо смотрю на осцилографе. А как только включаею двойной буфер (выдачу 10 байт 5 с одного массива 5ть с другого)
DMA2_Stream3->M1AR = (uint32_t) MassTransmit2; // адрес вторых данных
и в регистре CR бит устанавливаю бит DMA_SxCR_DBM, то с первого буфера данные выходят те же(правильные) а со второго выходят левые данные совсем.
В чем может быть дело ?
Настройка DMA:
CODE
void SAI2_A_DMA_Init(void){
//------------------------------------------------
//---------Включение тактирование-DMA-------------
//------------------------------------------------
RCC->AHB1ENR|=RCC_AHB1ENR_DMA2EN;
//------------------------------------------------
//------------------------------------------------
//---------Настройка-DMA CR-----------------------
//------------------------------------------------
DMA2_Stream4->PAR = (uint32_t) &SAI2_Block_A->DR; // адрес приёмника в периферии
DMA2_Stream4->M0AR = (uint32_t) MassTransmit; // адрес первой половины двойного буфера в памяти
DMA2_Stream3->M1AR = (uint32_t) MassTransmit2; // адрес второй половины двойного буфера в памяти
DMA2_Stream4->NDTR = 5;
DMA2_Stream4->FCR = DMA_SxFCR_FEIE * 0
| DMA_SxFCR_FS_0 * 0
| DMA_SxFCR_FS_1 * 0
| DMA_SxFCR_FS_2 * 1
| DMA_SxFCR_DMDIS * 0 // разрешить FIFO
| DMA_SxFCR_FTH_0 * 0 // 11: full FIFO
| DMA_SxFCR_FTH_1 * 0;
//------------------------------------------------
//---------Настройка-DMA CR-----------------------
//------------------------------------------------
DMA2_Stream4->CR = DMA_SxCR_CHSEL_0 * 1 // DMA2 Stream3 СH3 = SAI2_A Chenal=3
| DMA_SxCR_CHSEL_1 * 1
| DMA_SxCR_CHSEL_2 * 0
| DMA_SxCR_MBURST_0 * 0
| DMA_SxCR_MBURST_1 * 0
| DMA_SxCR_PBURST_0 * 0
| DMA_SxCR_PBURST_1 * 0
| DMA_SxCR_CT * 0 // цель - буфер DMA2_Stream3->b.audio_out_buf0
| DMA_SxCR_DBM * 1 // режим двойного буфера
| DMA_SxCR_PL_0 * 0 // приоритет потока 10: High
| DMA_SxCR_PL_1 * 1
| DMA_SxCR_PINCOS * 0
| DMA_SxCR_MSIZE_0 * 0 // размер данных
| DMA_SxCR_MSIZE_1 * 0 //00: word (8-bit)
| DMA_SxCR_PSIZE_0 * 0 // размер данных
| DMA_SxCR_PSIZE_1 * 0 //10: word (32-bit)
| DMA_SxCR_MINC * 1 // память с инкрементом
| DMA_SxCR_PINC * 0 // периферия без инкремента
| DMA_SxCR_CIRC * 1 // кольцевой режим
| DMA_SxCR_DIR_0 * 1 // 00: to-peripheral to memory //01: Memory-to-peripheral
| DMA_SxCR_DIR_1 * 0 //
| DMA_SxCR_PFCTRL * 0 // DMA управляет потоком
| DMA_SxCR_TCIE * 0 // прерывание по окончании передачи
| DMA_SxCR_HTIE * 0
| DMA_SxCR_TEIE * 0
| DMA_SxCR_DMEIE * 0;
//----------------------------------------------
DMA2->HIFCR = DMA_HIFCR_CTCIF4
| DMA_HIFCR_CHTIF4
| DMA_HIFCR_CTEIF4
| DMA_HIFCR_CDMEIF4
| DMA_HIFCR_CFEIF4; // стёрли флаги
//----------------------------------------------
//NVIC_EnableIRQ (DMA2_Stream4_IRQn);
//----------------------------------------------
// вынес в маин
//DMA2_Stream4->CR |= DMA_SxCR_EN; // разрешаем работу DMA
}
//------------------------------------------------
//---------Включение тактирование-DMA-------------
//------------------------------------------------
RCC->AHB1ENR|=RCC_AHB1ENR_DMA2EN;
//------------------------------------------------
//------------------------------------------------
//---------Настройка-DMA CR-----------------------
//------------------------------------------------
DMA2_Stream4->PAR = (uint32_t) &SAI2_Block_A->DR; // адрес приёмника в периферии
DMA2_Stream4->M0AR = (uint32_t) MassTransmit; // адрес первой половины двойного буфера в памяти
DMA2_Stream3->M1AR = (uint32_t) MassTransmit2; // адрес второй половины двойного буфера в памяти
DMA2_Stream4->NDTR = 5;
DMA2_Stream4->FCR = DMA_SxFCR_FEIE * 0
| DMA_SxFCR_FS_0 * 0
| DMA_SxFCR_FS_1 * 0
| DMA_SxFCR_FS_2 * 1
| DMA_SxFCR_DMDIS * 0 // разрешить FIFO
| DMA_SxFCR_FTH_0 * 0 // 11: full FIFO
| DMA_SxFCR_FTH_1 * 0;
//------------------------------------------------
//---------Настройка-DMA CR-----------------------
//------------------------------------------------
DMA2_Stream4->CR = DMA_SxCR_CHSEL_0 * 1 // DMA2 Stream3 СH3 = SAI2_A Chenal=3
| DMA_SxCR_CHSEL_1 * 1
| DMA_SxCR_CHSEL_2 * 0
| DMA_SxCR_MBURST_0 * 0
| DMA_SxCR_MBURST_1 * 0
| DMA_SxCR_PBURST_0 * 0
| DMA_SxCR_PBURST_1 * 0
| DMA_SxCR_CT * 0 // цель - буфер DMA2_Stream3->b.audio_out_buf0
| DMA_SxCR_DBM * 1 // режим двойного буфера
| DMA_SxCR_PL_0 * 0 // приоритет потока 10: High
| DMA_SxCR_PL_1 * 1
| DMA_SxCR_PINCOS * 0
| DMA_SxCR_MSIZE_0 * 0 // размер данных
| DMA_SxCR_MSIZE_1 * 0 //00: word (8-bit)
| DMA_SxCR_PSIZE_0 * 0 // размер данных
| DMA_SxCR_PSIZE_1 * 0 //10: word (32-bit)
| DMA_SxCR_MINC * 1 // память с инкрементом
| DMA_SxCR_PINC * 0 // периферия без инкремента
| DMA_SxCR_CIRC * 1 // кольцевой режим
| DMA_SxCR_DIR_0 * 1 // 00: to-peripheral to memory //01: Memory-to-peripheral
| DMA_SxCR_DIR_1 * 0 //
| DMA_SxCR_PFCTRL * 0 // DMA управляет потоком
| DMA_SxCR_TCIE * 0 // прерывание по окончании передачи
| DMA_SxCR_HTIE * 0
| DMA_SxCR_TEIE * 0
| DMA_SxCR_DMEIE * 0;
//----------------------------------------------
DMA2->HIFCR = DMA_HIFCR_CTCIF4
| DMA_HIFCR_CHTIF4
| DMA_HIFCR_CTEIF4
| DMA_HIFCR_CDMEIF4
| DMA_HIFCR_CFEIF4; // стёрли флаги
//----------------------------------------------
//NVIC_EnableIRQ (DMA2_Stream4_IRQn);
//----------------------------------------------
// вынес в маин
//DMA2_Stream4->CR |= DMA_SxCR_EN; // разрешаем работу DMA
}
Настройка SAI:
CODE
void SAI2_A_init (void){
SAI2_A_DMA_Init();
//--------------------------------------------------------------------------------------------------
//---------Включение DMA для приема-----------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
#if defined (SAI_DMA_ENABLED)
//SAI1_A_DMA_Init();
#endif
//--------------------------------------------------------------------------------------------------
//---------Настройка портов SAI PE2,PE3,PE4,PE5,PE6-------------------------------------------------
//--------------------------------------------------------------------------------------------------
gpio_conf(GPIOD,13,MODE_AF,TYPE_PUSHPULL,SPEED_2MHz, PULLUP_NONE, 0xA); //GPIO_AF_SPI3// SAI =AF=6
gpio_conf(GPIOD,12,MODE_AF,TYPE_PUSHPULL,SPEED_2MHz, PULLUP_NONE, 0xA);
gpio_conf(GPIOD,11,MODE_AF,TYPE_PUSHPULL,SPEED_2MHz, PULLUP_NONE, 0xA);
//--------------------------------------------------------------------------------------------------
//---------Включение тактирование SAI---------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
RCC->APB2ENR|=RCC_APB2Periph_SAI2;
SAI2->GCR|=SAI_GCR_SYNCOUT_0*0
|SAI_GCR_SYNCOUT_1*0
|SAI_GCR_SYNCIN_0*0
|SAI_GCR_SYNCIN_1*0;
//--------------------------------------------------------------------------------------------------
//-------Настройка DMA в модуле SAI-----------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
#if defined (SAI_DMA_ENABLED)
SAI1_Block_A->CR2 |=
SAI_xCR2_FFLUSH *1 // Подключаем FIFO буфер
|SAI_xCR2_FTH *1; // 100: FIFO full Запросы генерируются по заполнению всего буфера
#endif
SAI1_Block_A->CR2 |=
SAI_xCR2_FFLUSH *1 // Подключаем FIFO буфер
|SAI_xCR2_FTH *1; // 100: FIFO full Запросы генерируются по заполнению всего буфера
//--------------------------------------------------------------------------------------------------
//-------Конфигурация SAI1_A------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
SAI2_Block_A->CR2 =0x04;
SAI2_Block_A->CR1 = SAI_xCR1_MODE_0 * 0 // <Bit 0 MODE[1:0] bits (Audio Block Mode)
| SAI_xCR1_MODE_1 * 0 // <Bit 1 00: Master receive
| SAI_xCR1_PRTCFG_0 * 0 // <Bit 0 PRTCFG[1:0] bits (Protocol Configuration)
| SAI_xCR1_PRTCFG_1 * 0 // Bit 0: Free protocol.
| SAI_xCR1_DS_0 * 0 // Bit 0 S[1:0] bits (Data Size)
| SAI_xCR1_DS_1 * 1 // Bit 1 110: 24 bits
| SAI_xCR1_DS_2 * 0 // Bit 2 */
| SAI_xCR1_LSBFIRST * 0 // LSB First Configuration */
| SAI_xCR1_CKSTR * 1 // ClocK STRobing edge */
| SAI_xCR1_SYNCEN_0 * 0 // Bit 0 SYNCEN[1:0](SYNChronization ENable)
| SAI_xCR1_SYNCEN_1 * 0 // Bit 1 */
| SAI_xCR1_MONO * 1 // Mono mode */
| SAI_xCR1_OUTDRIV * 0 // Output Drive */
| SAI_xCR1_SAIEN * 0 // Audio Block enable */
| SAI_xCR1_DMAEN * 1 // DMA Enable */
| SAI_xCR1_NODIV * 1 // No Divider Configuration */
| SAI_xCR1_MCKDIV_0 * 0 // Bit 0 MCKDIV[3:0] (Master ClocK Divider)
| SAI_xCR1_MCKDIV_1 * 0 // Bit 1 */
| SAI_xCR1_MCKDIV_2 * 0 // Bit 2 */
| SAI_xCR1_MCKDIV_3 * 0; // Bit 3 */
//--------------------------------------------------------------------------------------------------
SAI2_Block_A->SLOTR=0x001F0400;
SAI2_Block_A->FRCR=(1<<FSOFF)|(0<<FSDEF)|(0<<FSPOL)|(((0))<<FSALL)|(((8*5)-1)<<FRL);
}
SAI2_A_DMA_Init();
//--------------------------------------------------------------------------------------------------
//---------Включение DMA для приема-----------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
#if defined (SAI_DMA_ENABLED)
//SAI1_A_DMA_Init();
#endif
//--------------------------------------------------------------------------------------------------
//---------Настройка портов SAI PE2,PE3,PE4,PE5,PE6-------------------------------------------------
//--------------------------------------------------------------------------------------------------
gpio_conf(GPIOD,13,MODE_AF,TYPE_PUSHPULL,SPEED_2MHz, PULLUP_NONE, 0xA); //GPIO_AF_SPI3// SAI =AF=6
gpio_conf(GPIOD,12,MODE_AF,TYPE_PUSHPULL,SPEED_2MHz, PULLUP_NONE, 0xA);
gpio_conf(GPIOD,11,MODE_AF,TYPE_PUSHPULL,SPEED_2MHz, PULLUP_NONE, 0xA);
//--------------------------------------------------------------------------------------------------
//---------Включение тактирование SAI---------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
RCC->APB2ENR|=RCC_APB2Periph_SAI2;
SAI2->GCR|=SAI_GCR_SYNCOUT_0*0
|SAI_GCR_SYNCOUT_1*0
|SAI_GCR_SYNCIN_0*0
|SAI_GCR_SYNCIN_1*0;
//--------------------------------------------------------------------------------------------------
//-------Настройка DMA в модуле SAI-----------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
#if defined (SAI_DMA_ENABLED)
SAI1_Block_A->CR2 |=
SAI_xCR2_FFLUSH *1 // Подключаем FIFO буфер
|SAI_xCR2_FTH *1; // 100: FIFO full Запросы генерируются по заполнению всего буфера
#endif
SAI1_Block_A->CR2 |=
SAI_xCR2_FFLUSH *1 // Подключаем FIFO буфер
|SAI_xCR2_FTH *1; // 100: FIFO full Запросы генерируются по заполнению всего буфера
//--------------------------------------------------------------------------------------------------
//-------Конфигурация SAI1_A------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
SAI2_Block_A->CR2 =0x04;
SAI2_Block_A->CR1 = SAI_xCR1_MODE_0 * 0 // <Bit 0 MODE[1:0] bits (Audio Block Mode)
| SAI_xCR1_MODE_1 * 0 // <Bit 1 00: Master receive
| SAI_xCR1_PRTCFG_0 * 0 // <Bit 0 PRTCFG[1:0] bits (Protocol Configuration)
| SAI_xCR1_PRTCFG_1 * 0 // Bit 0: Free protocol.
| SAI_xCR1_DS_0 * 0 // Bit 0 S[1:0] bits (Data Size)
| SAI_xCR1_DS_1 * 1 // Bit 1 110: 24 bits
| SAI_xCR1_DS_2 * 0 // Bit 2 */
| SAI_xCR1_LSBFIRST * 0 // LSB First Configuration */
| SAI_xCR1_CKSTR * 1 // ClocK STRobing edge */
| SAI_xCR1_SYNCEN_0 * 0 // Bit 0 SYNCEN[1:0](SYNChronization ENable)
| SAI_xCR1_SYNCEN_1 * 0 // Bit 1 */
| SAI_xCR1_MONO * 1 // Mono mode */
| SAI_xCR1_OUTDRIV * 0 // Output Drive */
| SAI_xCR1_SAIEN * 0 // Audio Block enable */
| SAI_xCR1_DMAEN * 1 // DMA Enable */
| SAI_xCR1_NODIV * 1 // No Divider Configuration */
| SAI_xCR1_MCKDIV_0 * 0 // Bit 0 MCKDIV[3:0] (Master ClocK Divider)
| SAI_xCR1_MCKDIV_1 * 0 // Bit 1 */
| SAI_xCR1_MCKDIV_2 * 0 // Bit 2 */
| SAI_xCR1_MCKDIV_3 * 0; // Bit 3 */
//--------------------------------------------------------------------------------------------------
SAI2_Block_A->SLOTR=0x001F0400;
SAI2_Block_A->FRCR=(1<<FSOFF)|(0<<FSDEF)|(0<<FSPOL)|(((0))<<FSALL)|(((8*5)-1)<<FRL);
}
Включение в майне:
Код
SAI2_Block_A->CR2 |= SAI_xCR2_FFLUSH;
DMA2_Stream4->CR |= DMA_SxCR_EN; // разрешаем работу DMA
SAI2_Block_A->CR1 |= SAI_xCR1_SAIEN;
DMA2_Stream4->CR |= DMA_SxCR_EN; // разрешаем работу DMA
SAI2_Block_A->CR1 |= SAI_xCR1_SAIEN;