本帖最后由 莫问1990 于 2016-9-27 09:02 编辑
通过DMA给I2S的数据寄存器SPI->DR发送数据,中断显示数据发送完了,但是SPI->DR里的值一直是0x0000,请问是什么原因?
I2S的配置如下:
[mw_shl_code=c,true]void I2S2_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16 I2S_DataFormat)
{
I2S_InitTypeDef I2S_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); //复位SPI2
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//结束复位
I2S_InitStructure.I2S_Mode=I2S_Mode;//IIS模式
I2S_InitStructure.I2S_Standard=I2S_Standard;//IIS标准
I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;//IIS数据长度
I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Enable;//主时钟输出禁止
I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_44k;//IIS频率设置
I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;//空闲状态时钟电平
I2S_Init(SPI2,&I2S_InitStructure);//初始化IIS
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);//SPI2 TX DMA请求使能.
I2S_Cmd(SPI2,ENABLE);//SPI2 I2S EN使能.
} [/mw_shl_code]
DMA的配置如下:
[mw_shl_code=c,true]void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num)
{
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//DMA1时钟使能
DMA_DeInit(DMA1_Channel5); //将DMA1的通道4寄存器重设为缺省值
/* 配置 DMA1 Channel5 */
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;//外设地址为
u32)&SPI2->DR
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buf0;//DMA 存储器0地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//存储器到外设模式
DMA_InitStructure.DMA_BufferSize = num;//数据传输量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据长度:16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据长度:16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel5, &DMA_InitStructure);//初始化DMA Channel4
DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);//开启传输完成中断
NVIC_InitStructure.NVIC_IRQChannel =DMA1_Channel5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);//配置
} [/mw_shl_code]
在中断里设置了DMA的双缓冲的切换,仿真时发现切换时有效了,而且DMA发送完的中断是运行的,但是SPI->DR里的数据就是没有变化
[mw_shl_code=c,true]void DMA1_Channel5_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC5)==SET)////DMA1_Channel4,传输完成标志
{
DMA_Cmd(DMA1_Channel5,DISABLE);
if((DMA1_Channel5->CMAR)==((u32)audiodev.i2sbuf1))
{
DMA1_Channel5->CMAR=(u32)audiodev.i2sbuf2;
// DMA_InitStructure.DMA_MemoryBaseAddr =(u32)audiodev.i2sbuf2;
// DMA_InitStructure.DMA_BufferSize =DMA1_MEM_LEN;
// DMA_Init(DMA1_Channel5, &DMA_InitStructure);
mp3witchbuf=0;
}
else
{
DMA1_Channel5->CMAR=(u32)audiodev.i2sbuf1;
// DMA_InitStructure.DMA_MemoryBaseAddr =(u32)audiodev.i2sbuf1;
// DMA_InitStructure.DMA_BufferSize =DMA1_MEM_LEN;
// DMA_Init(DMA1_Channel5, &DMA_InitStructure);
mp3witchbuf=1;
}
DMA_Cmd(DMA1_Channel5,ENABLE);
DMA_ClearITPendingBit(DMA1_IT_TC5);
i2s_tx_callback(); //执行回调函数,读取数据等操作在这里面处理
}
} [/mw_shl_code]
一周热门 更多>