SPI使用DMA1发送无法进入进入DMA中断

2019-08-14 04:50发布

本帖最后由 不死鸟 于 2016-12-30 10:23 编辑

使用STM32F103VET,在调试SPI,使用DMA1Channel3进行发送,启用了DMA结束中断和DMA错误中断,但是发现无法进入中断,但是数据发送正常而且正确的,哪位大侠可以帮忙看看么,多谢了![mw_shl_code=c,true]DMA中断配置        
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

DMA配置
        DMA_Cmd(SPI_DMA_TX_CH, DISABLE);//关闭DMA通道

        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;                      //DMA 的目的地址为SPI的DR
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                           //传输方向是向外设写   外设为目的地
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;            //外设的地址不自增
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                   //内存地址自增
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;                   //
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                                        //不循环
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                                //通道优先级高
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                        //非存储器至存储器模式

        DMA_Init(SPI_DMA_TX_CH, &DMA_InitStructure);                           //配置DMA1CH3

        DMA_ITConfig(SPI_DMA_TX_CH,DMA1_IT_TC3 | DMA1_IT_TE3,ENABLE);                //开启完成中断和传输错误中断呢
        
        SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE);   //使能SPI的 DMA

DMA发送函数
int drv_SPI_DMA_Send_Data(u8 *BufferSRC, uint32_t BufferSize)
{

        //SPI_DMA_Send_TX_Cfg(BufferSRC, BufferSize);
        
        DMA_Cmd(SPI_DMA_TX_CH, DISABLE);        
        DMA_ITConfig(SPI_DMA_TX_CH,DMA1_IT_TC3 | DMA1_IT_TE3,ENABLE);                //开启完成中断和传输错误中断呢
        DMA1_Channel3->CNDTR=BufferSize; //设置要传输的数据长度
        DMA1_Channel3->CMAR=(uint32_t)BufferSRC; //设置RAM缓冲区地址
        DMA_Cmd(SPI_DMA_TX_CH, ENABLE);        
        
        //while(!DMA_GetFlagStatus(DMA1_FLAG_TC3)); //等待DMA通道5传输完成
        //DMA_ClearFlag(DMA1_FLAG_TC3); //清除通道5传输完成状态标记
        //DMA_Cmd(DMA1_Channel3,DISABLE); //

}

DMA中断处理函数
void DMA1_Channel3_IRQHandler(void)
{
        
        if(DMA_GetITStatus(DMA1_IT_TE3))
        {
                iiii++;
                DMA_ClearITPendingBit(DMA1_IT_TE3);
                DMA_ClearFlag(DMA1_FLAG_TE3); //清除通道5传输完成状态标记
            DMA_Cmd(DMA1_Channel3,DISABLE); //
        }

        if(DMA_GetITStatus(DMA1_IT_TC3))
        {
                jjjj++;
                DMA_ClearITPendingBit(DMA1_IT_TC3);
                DMA_ClearFlag(DMA1_FLAG_TC3); //清除通道5传输完成状态标记
            DMA_Cmd(DMA1_Channel3,DISABLE); //
        }
}
[/mw_shl_code]






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
qzl200
1楼-- · 2019-08-15 16:37
不死鸟 发表于 2016-12-30 09:57
[mw_shl_code=c,true]void  do_SPI_init()
{
        NVIC_InitTypeDef NVIC_InitStructure;

我说的代码指的是看看你调用SPI发送数据部分,因为你发送的数据有可能没有达到DMB的发送完成量,所以不会产生发送完成中断请求。
Anna
2楼-- · 2019-08-15 19:34
 精彩回答 2  元偷偷看……
Anna
3楼-- · 2019-08-15 23:42
qzl200 发表于 2016-12-31 14:21
地址增量的问题是:
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;        //
DMA ...

数据量发送完 也不应该是进入DMA的中断吧??难道不是应该是由SPI管吗?
Anna
4楼-- · 2019-08-16 04:43
qzl200 发表于 2016-12-30 04:22
我今天刚试过SPI的DMA传输,可以进入中断。你贴出的代码不完整,建议你把完整的代码贴出来才好分析!

SPI的DMA通信   是把SPI的数据通过DMA进行搬运,还是通过SPI把DMA搬运的数据发送出去呢??   

一周热门 更多>