pokk 0 7 июля, 2017 Опубликовано 7 июля, 2017 (изменено) · Жалоба Вопрос решен в процессе написания темы, заметил опечатку в DMA2_Stream3, надо было раньше написать =) Добрый день, понадобилась передавать через SAI 5 байт, в режиме одиночного буфера DMA, все передается как надо смотрю на осцилографе. А как только включаею двойной буфер (выдачу 10 байт 5 с одного массива 5ть с другого) DMA2_Stream3->M1AR = (uint32_t) MassTransmit2; // адрес вторых данных и в регистре CR бит устанавливаю бит DMA_SxCR_DBM, то с первого буфера данные выходят те же(правильные) а со второго выходят левые данные совсем. В чем может быть дело ? Настройка DMA: 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 } Настройка SAI: 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_Block_A->CR2 |= SAI_xCR2_FFLUSH; DMA2_Stream4->CR |= DMA_SxCR_EN; // разрешаем работу DMA SAI2_Block_A->CR1 |= SAI_xCR1_SAIEN; Изменено 7 июля, 2017 пользователем pokk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться