明月小厨 发表于 2013-3-10 19:49 
2>程序的内容是循环读0x000000开始的4K内容,刚开始只有第一次是正常,随后的就是接收到的数前面多了一 ...
你好,我在调试DMA- SPI rx模式的时候,遇到这样的情况,我的spi 配置为主模式,收发两用,配置完DMA,运行一段时间,读回的数据正常,但过一段时间后,发现整一帧数据右移了3个字节,然后运行一段时间左移一字节,再运行一段时间再左移1字节,再运行一段时间再左移一字节,恢复正常情况,然后就是类似的循环。。
在中断中,发送完毕关闭发送中断,接收完毕关闭接收中断,下面是中断处理:
if(DMA_GetFlagStatus(DMA1_FLAG_TC4) == SET)
{
DMA_ClearITPendingBit(DMA1_FLAG_TC4 | DMA1_FLAG_HT4 |DMA1_FLAG_TE4); //DMA1_FLAG_TC2 | DMA1_FLAG_HT2 | DMA1_FLAG_TE2
DMA_Cmd(DMA1_Channel4, DISABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE);
SPI2->DR;
}
//发送完成
if(DMA_GetITStatus(DMA1_IT_TC5) == SET)
{
DMA_ClearITPendingBit(DMA1_FLAG_TC5 | DMA1_FLAG_HT5 |DMA1_FLAG_TE5);
DMA_Cmd(DMA1_Channel5, DISABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);
}
在主函数中开启相应的DMA请求:
SPI2->DR;
DMA_Cmd(DMA1_Channel5, DISABLE);
DMA_ClearFlag(DMA1_FLAG_TC5 |DMA1_FLAG_HT5 | DMA1_FLAG_TE5);
DMA_SetCurrDataCounter(DMA1_Channel5,0);
DMA_SetCurrDataCounter(DMA1_Channel5,64);
DMA1_Channel5->CMAR = (uint32_t)dummy;
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);
DMA_Cmd(DMA1_Channel5, ENABLE);
if( SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE))
{
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
}
DMA_Cmd(DMA1_Channel4, DISABLE);
DMA_ClearFlag(DMA1_FLAG_TC4 |DMA1_FLAG_HT4 | DMA1_FLAG_TE4);
DMA_SetCurrDataCounter(DMA1_Channel4,0);
DMA_SetCurrDataCounter(DMA1_Channel4,64);
DMA1_Channel4->CMAR = (uint32_t)RfBuf;
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE);
DMA_Cmd(DMA1_Channel4, ENABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
这个问题折腾了几天了,请指教,谢谢!
|