Перейти к содержанию
    

Передача SAI+ DMA

Вопрос решен в процессе написания темы, заметил опечатку в 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;

 

 

 

Изменено пользователем pokk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...