[STM32F1] i2s从模式+DMA不能工作?

[复制链接]
1704|1
 楼主| e21 发表于 2014-6-26 18:07 | 显示全部楼层 |阅读模式
DMA, ni, pi, ST, IO
  1. STM32F103RC配置I2S从模式输出+DMA不能工作,不会进入中断,哪里错了?

  2. void I2S2_Configuration(u32 I2S_AudioFreq)
  3.     {
  4.     I2S_InitTypeDef I2S_InitStructure;
  5.     DMA_InitTypeDef DMA_InitStructure;

  6. //GPIOB
  7.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  8.   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;
  9.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  10.   GPIO_Init(GPIOB, &GPIO_InitStruct);
  11.   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
  12.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  13.   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  14.   GPIO_Init(GPIOB, &GPIO_InitStruct);

  15.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  16.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  17.    
  18.     //DMA1 channel 5
  19.     DMA_DeInit(DMA1_Channel5);
  20.     DMA_InitStructure.DMA_PeripheralBaseAddr = ((u32)(SPI2_BASE+0x0c)); //配置 DMA 的寄存器端为 i2s 的数据地址
  21.     DMA_InitStructure.DMA_MemoryBaseAddr  = (u32)I2S2_Buffer;        //配置 DMA 的内存端为我们定义的数组首地址
  22.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                //规定数据传输方向
  23.     DMA_InitStructure.DMA_BufferSize = I2S2_BUFFER_SIZE;             //目的端的个数
  24.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不递增
  25.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;            //数据端使能增长
  26.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //外围设备寄存器尺寸16位
  27.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据16 位
  28.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                 //模式是循环传输
  29.     DMA_InitStructure.DMA_Priority = DMA_Priority_High;                 //DMA通道优先级
  30.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                     //memory- to-memory转换
  31.     DMA_Init(DMA1_Channel5, &DMA_InitStructure);                    //初始化DMA通道1
  32.    
  33.     SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);                // 允许DMA数据发送
  34.     DMA_ITConfig(DMA1_Channel5, DMA_IT_HT|DMA_IT_TC, ENABLE);         //使能DMA传输过半中断和完成中断
  35.     DMA_SetCurrDataCounter(DMA1_Channel5, 0);
  36.     DMA_ClearFlag(DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5 | DMA1_FLAG_GL5);//清除DMA1 channel5标志
  37.     DMA_Cmd(DMA1_Channel5, ENABLE);                                    //配置完成后,启动DMA通道

  38.     // I2S 2
  39.     SPI_I2S_DeInit(SPI2);
  40.     I2S_InitStructure.I2S_Mode = I2S_Mode_SlaveTx;
  41.     I2S_InitStructure.I2S_Standard = I2S_Standard_Phillips;
  42.     I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_16bextended;
  43.     I2S_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable;
  44.     I2S_InitStructure.I2S_AudioFreq = I2S_AudioFreq;
  45.     I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low;
  46.     I2S_Init(SPI2, &I2S_InitStructure);
  47.    
  48.     I2S_Cmd(SPI2, ENABLE);
  49.     }

  50. void NVIC_Configuration(void)
  51.     {
  52.     NVIC_InitTypeDef NVIC_InitStructure;
  53.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  54.     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);               //向量表位于FLASH
  55.    
  56.     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;    //更新事件
  57.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    //抢占优先级0
  58.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //响应优先级
  59.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断
  60.     NVIC_Init(&NVIC_InitStructure);                             //写入设置
  61.    
  62.     }





 楼主| e21 发表于 2014-7-1 12:14 | 显示全部楼层
搞定了I2S2,把上面的语句顺序改了下就可以,同样的语句I2S3依然不行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

e21

4

主题

123

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0