打印

串口IDLE中断无法触发问题

[复制链接]
11869|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
21ele|  楼主 | 2011-3-15 23:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 21ele 于 2011-3-17 13:31 编辑

之前讨论过串口dma接收未知长度数据问题,如果收到的数据少于dma接收的数量就没有了,需要有一个超时机制,退出dma接收。

正好有时间仔细看了下数据手册关于串口接收IDLE中断部分,感觉用这个做是完全没有问题的,于是决定把之前程序用定时器做超时的部分替换掉。

动手调试之后,结果令人郁闷,开了接收中断,开了IDLE中断,结果这个IDLE中断根本就不来,完全不像预想的那样,开了接收而没有收到数据,就会一直来!!

不知哪位用过这个IDLE中断,给指点一下,如何才能触发?

如果真像有人所言的那样,根本就玩不出来,那可就是个硬件bug了。

关于IDLE手册中提到的部分有:
1.10 个带标志的中断源− 检测到总线为空闲
2.空闲符号被视为完全由“1"组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位。(就是从起始位到停止位全为1)
3.置位 TE 将使得USART 在第一个数据帧前发送一空闲帧
4.当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果 IDLEIE位被设置将产生一个中断。
5.当RWU位被写1 时,USART进入静默模式。当检测到一空闲帧时,它被唤醒。然后RWU被硬件清零,但是USART_SR寄存器中的IDLE位并不置起。RWU还可以被软件写0。
6.接收期间:空闲总线检测中断、溢出错误中断、接收数据寄存器非空中断、校验错误中断、LIN 断开符号检测中断、噪音中断(仅在多缓冲器通信)和帧错误中断(仅在多缓冲器通信)。
7.IDLE:监测到IDLE总线
当检测到空闲总线时,该位被硬件置位。如果USART_CR1中的IDLEIE为1,产生中断。由软件序列清除该位(先读USART_SR,然后读USART_DR)
注意:IDLE位不会再次被置高直到RXNE位被置起(即又检测到一次空闲总线)
沙发
21ele|  楼主 | 2011-3-17 13:32 | 只看该作者
没人关注,自己顶一下。

使用特权

评论回复
板凳
香水城| | 2011-3-17 17:55 | 只看该作者
请注意IDLE中断是只检测到空闲帧时产生的中断。

而空闲帧的定义是:被视为完全由“1"组成的一个完整的数据帧,后面跟着包含了数据的下一帧的开始位

关键是后面半句话,要求有下一帧的开始位,而你的情况恰巧没有下一帧的开始位(传输已经结束),当然不会有中断了。

看看你抄录的第3点,也可以证实我上述的说法。说白了,空闲帧是为了在数据传输过程中插入一个间隔,但你错误地理解成了线路的完全空闲。

使用特权

评论回复
地板
21ele|  楼主 | 2011-3-17 19:31 | 只看该作者
谢谢香版的指点。

确实是我对IDLE没有正确理解,IDLE的正确意义不是线路完全空闲,而是接收开始之后的第一空闲。

刚才已经经过程序调试,确认这个中断是可以来的,就是必须是接收到一个,或多个连续字符之后,总线一空闲,中断就来了。中断里,如果不清除该标志,这个中断会反复来,即使是又收到数据。

另外,RWU位也实验过来,确实是只有收到至少一个数据后,才可以置位,之后总线一旦空闲,就被自动清除(WAKE=0),非常适合先接收个地址,如果地址不符,就静默,不在响应接收中断。

使用特权

评论回复
5
21ele|  楼主 | 2011-3-17 20:44 | 只看该作者
如果这个IDLE能和发送缓存区空中断那样什么时候都有,或者允许软件置位,人为控制在线路完全空闲时也触发,那样就更好了。

因为这样这个中断就相当于一个以一个字符长度为周期的定时中断,使用它足以完成一切使用串口数据传输用的超时、和计时问题,而不用另外再独立开一个定时器,涉及超时切换状态的串口通讯程序程序会简洁很多。那可真是太舒服了,使用串口再也不用消耗定时器资源了。

使用特权

评论回复
6
香水城| | 2011-3-18 10:32 | 只看该作者
如果这个IDLE能和发送缓存区空中断那样什么时候都有,或者允许软件置位,人为控制在线路完全空闲时也触发,那样就更好了。

因为这样这个中断就相当于一个以一个字符长度为周期的定时中断,使用它足以完成一切使用串 ...
21ele 发表于 2011-3-17 20:44


如果是这样,你不是要被这样的中断烦死?除非你不停地发数据,:lol

使用特权

评论回复
7
qrio| | 2013-4-28 21:01 | 只看该作者
我在用stm32l1xx的片子,想用同样的方式.不过我用PC通过串口发几个字节,间隔十几个ms再发几个.但仍然没有收到IDLE的中断. 接受中断倒是正常,只是IDLE怎么也不置位.能说说你是怎么解决的吗?

使用特权

评论回复
8
yjnisangel| | 2013-7-20 14:34 | 只看该作者
当一空闲帧被检测到时,其处理步骤和接收到普通数据帧一样,但如果 IDLEIE位被设置将产生一个中断。
:IDLE位不会再次被置高直到RXNE位被置起(即又检测到一次空闲总线)
IDLE中断是只检测到空闲帧时产生的中断。
有点不明白,空闲中断是检测到空闲帧就产生中断,那我如果发送一串数据的话,是不是会产生很多次空闲中断???

使用特权

评论回复
9
yjnisangel| | 2013-7-20 14:38 | 只看该作者
香水城 发表于 2011-3-17 17:55
请注意IDLE中断是只检测到空闲帧时产生的中断。

而空闲帧的定义是:被视为完全由“1"组成的一个完整的数 ...

请问香主,空闲中断是检测到空闲帧时产生的中断,那如果我发送一串数据,空闲中断是不是会中断很多次,还是只中断一次

使用特权

评论回复
10
菜鸟宅男| | 2013-7-31 20:29 | 只看该作者
学习一下!

使用特权

评论回复
11
人生之际| | 2013-8-3 17:04 | 只看该作者
打个比方,如果某个设备往你的设备发送"abcd","12345657",发送的设备基本可以保证每个串是连续发送的(前一个字节结束位后马上下一个字节开始位),串之间有延迟比如20ms为例:
空闲帧标志被清除后,在接收数据"d"完成后再一个字符的时间后,置位,中断(标志要被清除,否则持续进来),此后IDLEIE将不再产生,直到下一个字符串的“7”完成后的再下一个字符的时间后,再次置位请求中断。所以用这个IDLEIE来结束DMA方式的接收,是合适的。唯一一个不合适的地方是:如果你发送一个字符串后,将DMA设置好接收传输方式,然后:对方没响应,你一个字符也收不到,这时候,IDLEIE是不会来的,必须有个总超时检测来结束DMA接收方式:因为IDLEIE中断必须要有字符串收到,然后有一个字符的时间没收下一个字符的起始位,才会发生。

另外,1个字符间隔的空闲就结束接收:是默认任何对方发送字节的间隔不大于1个字符间隔,是不符合Modbus-RTU协议的,RTU协议是3.5个字符时间,如果收到"a"后,停了2个字符时间,又收到"b",Modbus-RTU还是认为ab是同一帧的连续字符。

使用特权

评论回复
12
虫虫好| | 2014-2-15 17:23 | 只看该作者
小弟手头上有一个stm32  f103系列的板子,调试串口 ,之前拜读 过前辈的帖子 关于串口 不定帧长 数据DMA 传输的 ,有位兄台提到的串口空闲中断 感觉挺好奇的  想用该方法实现DMA 不定帧长数据传输。 调试 板子上 串口usart3 设置好基本的配置 开启usart3的空闲中断   通过串口助手的发送数据, 板子上的485l接收后 在通过同一个485 发送到串口助手 ,但是显示的接收数据与我发送的数据  有些字节是 错的 ,通过 联调发现 其实在485 接收的buffer的里数据就错了 现在这个是困扰我的问题之一 但是毕竟实现了串口空闲中断与DMA 不定帧长数据 收发 有点小满足; 同样方法调试USART2的485  发现始终 进不去串口空闲中断 不知道为什么 检查了几遍程序 也无果 ,后来我用串口接收中断与串口助手测试usart2硬件没问题 ,串口接收中断配合 DMA通道数据收发也是正确的,就不理解了 为什么使能了USART2的串口空闲中断  在中断函数里打断点但就进去不去呢   串口助手数据我只发送一次 不存在我一直发数据的问题  波特率19200 望指教1 485收数据出错原因2串口空闲中断进不去为什么  谢谢

使用特权

评论回复
13
90chinazhu| | 2014-4-1 09:07 | 只看该作者
学习一下,我觉得空闲方式很有用,之前用dsp的空闲方式进行解码很好用,可以通过硬件方式获得一帧数据的帧头,省得每次收到一byte数据与定义的帧头数据对比一次,以便找帧头。现在,改用stm32,一直在找串口空闲方式。

使用特权

评论回复
14
秀色可餐| | 2014-6-4 14:22 | 只看该作者
21ele 发表于 2011-3-17 19:31
谢谢香版的指点。

确实是我对IDLE没有正确理解,IDLE的正确意义不是线路完全空闲,而是接收开始之后的第一 ...

请教一下,如筛选到不是这个地址,就静默,此时需要操作什么,写RWU=1吗?然后再写指令,让单片机进入休眠模式? 然后,遇到空闲了,单片机就会自动唤醒,是这样吗?

使用特权

评论回复
15
ysmz4| | 2014-11-14 16:40 | 只看该作者
本帖最后由 ysmz4 于 2015-7-1 13:50 编辑

。。。。。。。

使用特权

评论回复
16
ysmz4| | 2015-7-1 14:10 | 只看该作者
香水城 发表于 2011-3-17 17:55
请注意IDLE中断是只检测到空闲帧时产生的中断。

而空闲帧的定义是:被视为完全由“1"组成的一个完整的数 ...

香主,请问有没有可能串口DMA接收端把收到的两包认为是一包?(即怎么知道两包间的间隔一定大于1帧的时长)

使用特权

评论回复
17
520sky| | 2017-2-7 10:41 | 只看该作者
21ele 发表于 2011-3-17 19:31
谢谢香版的指点。

确实是我对IDLE没有正确理解,IDLE的正确意义不是线路完全空闲,而是接收开始之后的第一 ...

请问下,在什么情况才能进去中断,现在测试 只有遇到 acsii码为 0x?0格式的 才会进去中断

使用特权

评论回复
18
520sky| | 2017-2-7 15:49 | 只看该作者
香水城 发表于 2011-3-17 17:55
请注意IDLE中断是只检测到空闲帧时产生的中断。

而空闲帧的定义是:被视为完全由“1"组成的一个完整的数 ...

为什么网上的 DMA+IDLE接收程序,都说是 串口接收到数据后,检测到总线空闲时 触发中断?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

191

帖子

1

粉丝