OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6573|回复: 6

I2S DMA中断响应不正常的问题

[复制链接]

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-5-20 10:35:43 | 显示全部楼层 |阅读模式
5金钱
       我使能了两条iis总线,目的是接收两路iis音频信号。现在总线时钟已经发出来了。我用逻辑分析仪看了没有问题,数据总线上也有数据。这两路iis总线两路收发共4路DMA通道使能。
       我的两路发送中断没有执行任何操作。
       两路接收中断接收dsp发过来的iis数据,但是只有dma1中断接收到数据并且能顺利进入中断。另一路iis通道一直没有进入中断。我看了dma缓存的buf,buf里面一直有数据过来的。
       我期望第一路、第二路接收中断能不能响应中断,但是检查中断的时候发现第二路的发送中断居然会一直有中断,我检查了dma初始化,没有发现具体问题。@正点原子


/************************第一路发送中断*************************************/
void DMA1_Stream4_IRQHandler(void)
{      
        if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4)==SET)
        {
                DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);

        }                                                                                            
}
/************************第一路接收中断*************************************/  这里中断响应正常

void DMA1_Stream3_IRQHandler(void)
{      
        if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3)==SET)       
        {
                DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
              i2s_rx_callback();
        }                                                                                           
}
/************************第二路发送中断*************************************/   这里会一直有中断

void DMA1_Stream5_IRQHandler(void)
{      
        if(DMA_GetITStatus(DMA1_Stream5,DMA_IT_TCIF5)==SET)
        {
                DMA_ClearITPendingBit(DMA1_Stream5,DMA_IT_TCIF5);
       
        }                                                                                            
}
/************************第二路接收中断*************************************/  第二路接收没有响应一个中断

void DMA1_Stream0_IRQHandler(void)
{      
        if(DMA_GetITStatus(DMA1_Stream0,DMA_IT_TCIF0)==SET)       
        {
                DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_TCIF0);       
              i2s3_rx_callback();       
        }                                                                                           
}

最佳答案

查看完整内容[请看2#楼]

I2S3ext_RX_DMA_Init函数中 DMA_DoubleBufferModeConfig(DMA1_Stream0,(u32)buf1,DMA_Memory_0);//双缓冲模式配置 DMA_DoubleBufferModeCmd(DMA1_Stream0,ENABLE);//双缓冲模式开启 DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);//开启传输完成中断 你开启的是DMA1_Stream3的传输完成中断,所以DMA1_Stream0_IRQHandler无法进入
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-5-20 10:35:44 | 显示全部楼层
I2S3ext_RX_DMA_Init函数中
DMA_DoubleBufferModeConfig(DMA1_Stream0,(u32)buf1,DMA_Memory_0);//双缓冲模式配置
DMA_DoubleBufferModeCmd(DMA1_Stream0,ENABLE);//双缓冲模式开启
DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);//开启传输完成中断

你开启的是DMA1_Stream3的传输完成中断,所以DMA1_Stream0_IRQHandler无法进入
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-5-20 12:19:11 | 显示全部楼层
没完整的程序,怎么分析,你觉得初始化对就一定对吗
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-5-20 13:02:31 | 显示全部楼层
lvehe 发表于 2016-5-20 12:19
没完整的程序,怎么分析,你觉得初始化对就一定对吗

我贴出来吧。

实验44 录音机实验 0519 左右通道通 左右通道有数据.rar

7.72 MB, 下载次数: 1088

回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-5-20 14:54:01 | 显示全部楼层
void DMA2BufInit(void)函数中
I2S3_TX_DMA_Init((u8*)&i2spybuf1,(u8*)&i2spybuf2,1);  //配置TX DMA
你设置为1个字节的数据即产生一个中断,自然会频繁的进入中断。
看原子的例程如下:
I2S2_TX_DMA_Init((u8*)&i2splaybuf[0],(u8*)&i2splaybuf[1],1);  //配置TX DMA
DMA1_Stream4->CR&=~(1<<4);        //关闭传输完成中断(这里不用中断送数据)
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-5-20 15:05:22 | 显示全部楼层
lvehe 发表于 2016-5-20 14:54
void DMA2BufInit(void)函数中
I2S3_TX_DMA_Init((u8*)&i2spybuf1,(u8*)&i2spybuf2,1);  //配置TX DMA
你 ...

DMA1_Stream4->CR&=~(1<<4);  这个是对应dma1_stream4的。我不确定DMA1_Stream5->CR&=~(1<<5); 是否对应通道5.所以直接把这段屏蔽了。谢谢你提醒
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
 楼主| 发表于 2016-5-20 15:06:18 | 显示全部楼层
lvehe 发表于 2016-5-20 10:35
I2S3ext_RX_DMA_Init函数中
DMA_DoubleBufferModeConfig(DMA1_Stream0,(u32)buf1,DMA_Memory_0);//双缓冲 ...

这里是我疏忽了,谢谢你这么仔细。我看时钟和数据正常了就没检查初始化这里的代码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 09:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表