[牛人杂谈] 新唐51内核单片机的I2C是如何处理超时的

[复制链接]
3531|25
 楼主| huahuagg 发表于 2024-1-17 15:48 | 显示全部楼层 |阅读模式
本帖最后由 huahuagg 于 2024-1-17 15:57 编辑

I2C简介:
I2C(Inter-Integrated Circuit)是一种串行通信协议,广泛应用于单片机和各种集成电路之间的通信。它是一种主从式的通信协议,支持多个设备在同一总线上通信。
I2C超时处理机制:
  • 超时计数器:
    • 这一系列芯片带有一组14位的超时计数器,用于监控I2C总线的通信时间。这个计数器是一个自动递增的寄存器,从零开始计数,直至溢出。
  • 使能超时定时器:
    • 在需要使用超时机制时,可以使能超时定时器。一旦超时定时器被使能,计数器开始自动计数。
  • 中断触发条件:
    • 如果开启了中断功能,当超时计数器溢出时,硬件会设置I2TOF(I2C Time-Out Flag)位,触发中断。
  • 计数器复位:
    • 为了重新开始计时,可以通过软件操作或硬件触发,清零计数器,从而重新开始计数。
  • I2C总线故障检测:
    • 如果I2C总线出现故障,超时计数器可能长时间不能被清零。当I2TOF位长时间保持1时,超时计数器将继续递增,直至溢出。
  • 中断处理:
    • 一旦I2TOF位被置1,表明发生了I2C通信超时,系统可以进入中断服务程序进行相应的处理,例如重新初始化I2C硬件或执行其他纠正措施。

 楼主| huahuagg 发表于 2024-1-17 15:52 | 显示全部楼层
此系列芯片带一组14位超时计数器,用于防止I2C总线故障。一旦使能了超时定时器,计数器开始计数直至溢出,即如果开启中断,I2TOF位会被硬件置1。当使能计数器,SI置1复位计数器, SI清0后重新开始计数。若I2C总线出现故障,SI 位长时间不能清0,14位的超时定时器就会溢出,并进入中断。
 楼主| huahuagg 发表于 2024-1-17 15:58 | 显示全部楼层
埃娃 发表于 2024-1-29 11:00 来自手机 | 显示全部楼层
定时器计数到一定值就超时了
jcky001 发表于 2024-1-29 16:57 | 显示全部楼层
新唐51内核单片机的I2C模块处理超时主要依赖于软件实现
电子乐园游园ing 发表于 2024-1-29 16:59 | 显示全部楼层
使用定时器判断超时的情况
mikewalpole 发表于 2024-2-3 17:05 | 显示全部楼层
I2C的超时处理是通过设置I2C控制器的相关寄存器来实现的。
mollylawrence 发表于 2024-2-4 20:58 | 显示全部楼层
在ISR中,可以设置一个标志位来跟踪I2C通信的状态。如果检测到超时情况,ISR可以清除该标志位,并执行必要的恢复操作,比如重置I2C接口或重新尝试通信。
wengh2016 发表于 2024-2-4 22:56 | 显示全部楼层
超时处理通常是通过软件来实现的。
louliana 发表于 2024-2-5 12:55 | 显示全部楼层
程序可以继续进行I2C通信,或者选择结束通信并关闭I2C控制器。
dspmana 发表于 2024-2-5 13:33 | 显示全部楼层
很多单片机都会提供硬件计时器来支持I2C的超时处理。
gaoyang9992006 发表于 2024-2-5 13:43 | 显示全部楼层
使用库函数的话,提供了超时处理的功能。
8841765c0756a517b8.png
51xlf 发表于 2024-2-5 15:05 | 显示全部楼层
在等待I2C事件的同时,定时器持续递减计数,一旦达到0,则表示超时。
macpherson 发表于 2024-2-6 09:56 | 显示全部楼层
在I2C总线通信中,超时通常指的是在指定时间内设备未能完成数据的发送或接收。
iyoum 发表于 2024-2-6 12:55 | 显示全部楼层
比如I2C总线上的数据传输速度较慢,或者master设备在发送数据时出现故障。为了处理这些情况,单片机会包含一定的超时检测机制。
ulystronglll 发表于 2024-2-6 13:22 | 显示全部楼层
在开始I2C操作前,设置一个定时器或循环计数器,设定其初始值对应期望的最大等待时间。
youtome 发表于 2024-2-6 14:49 | 显示全部楼层
通过软件模拟I2C从机模式,并设置一个超时计数器来监控I2C通信过程
ulystronglll 发表于 2024-2-6 17:23 | 显示全部楼层
如果遇到I2C通信超时,首先应检查I2C总线的电气特性,比如上拉电阻是否适当,时钟频率是否设置得过高或过低,以及总线是否受到干扰。排除了这些硬件问题后,如果超时情况仍然存在,可以通过软件层面的策略来处理,比如在主循环中设置一个超时计时器,并在每次I2C通信前启动该计时器。如果在规定时间内没有收到从设备的响应,则可以认为通信超时,并执行预定的超时处理程序,比如重新初始化I2C接口或切换到另一种通信方式。
loutin 发表于 2024-2-6 20:57 | 显示全部楼层
I2C协议本身就定义了超时机制。
usysm 发表于 2024-2-6 21:27 | 显示全部楼层
在进行I2C通信时,可以通过设置这些寄存器来处理超时。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

160

主题

1437

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部