I2C总线

SPEC:Rev 7.0
规格:
1.通信速度:
在这里插入图片描述
standard-mode:100kbps
fast-mode:400kbps
fast-mode plus:1Mbps
high-speed mode:3.4Mbps

2.半双工、多主多从
基本原理
在这里插入图片描述
总线空闲状态:SCL和SDA都处在高电平。
起始信号:SCL高电平时SDA从高到低。
终止信号:SCL高电平时SDA从低到高。
数据传输:按字节发送、SDA在时钟低电平切换、高电平保持。
ACK和NACK:第九个时钟拉低SDA为ACK、拉高为NACK.

建立保持时间:
在这里插入图片描述
t(HD;DAT):hold time 保持时间,时钟下下降沿之后,SDA需要保持的时间。
t(SU;DAT):set-up time建立时间,时钟沿上升之前,SDA需要保持的时间。

相关点:
时钟同步:
双主机时钟不同时,SCL通过线与同步低速时钟。

总线仲裁:
解决多主机情况下总线冲突情况,SCL空闲状态下。两个主机一前一后的拉低SDA启动发送,则仲裁开始。
仲裁期间,主机逐位监测发送和电平和读取电平是否一致,不一致则停止发送,让出总线。

常见问题:
总线挂死:
情况一:SDA挂死
先来看下哪些情况下I2C从机会需要拉低SDA线:
(1) 主机向从机写数据或地址时,从机如果发出A应答,则会第9个CLK的期间拉低SDA
(2) 主机读数据的时候,从机会在bit为0时对应的CLK期间拉低SDA
那什么情况I2C从机可能钳住SDA线呢?假如在读数据时,从机在SCK高电平时拉低SDA发送0,按照I2C协议规定,SCK高电平期间,SDA应当保持,假如此时主机发生复位或断点,则主机恢复后,默认SCK为高电平,SDA仍然处于被从机拉低的状态,此时主机也无法发出START信号(START信号需要先主机拉低SDA,但此刻SDA正被从机拉低),故而也无法使SDA恢复,导致SDA总线挂死。此时现象为:
① SDA低电平
② SCK高电平
在这里插入图片描述
解决方案:
方案一:主机模拟SCK信号,同时探测SDA电平状态。假如SDA被释放,则发送STOP信号,结束本次通信。
方案二:连续模拟9个CLK信号。

情况二:SCL挂死
I2C从机主动拉低SCL线在规范中是一个合法的行为,称之为Clock Stretching(时钟扩展,我一般叫他时钟同步)。通常是主机请求数据( 收或者发)后从机需要一些时间处理,且没有多余Buffer可以接收接或者提供接下来的数据的时候从机则会拉低SCL一段时间直到有新的数据准备好。
SCL挂死(也就是前面所说一直拉低SCL)这种情况在标准I2C从器件上基本不会出现,因为只要芯片还在正常工作buffer总算有准备好的时候,自然就就释放SCL了。往往是使用用户使用MCU作为I2C从机时,程序设计上的问题导致MCU无法读取&填充buffer而导致,重点分析MCU I2C中断服务程序。
解决方案:从以下角度接入分析
① I2C中断服务程序被意外屏蔽
② 中断服务程序中陷入了一些标志位查询的while(flag != xxx)死循环
③ I2C功能系统被意外禁止

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux I2C总线寄存器是用于控制和配置I2C总线通信的寄存器集合。I2C(Inter-Integrated Circuit)总线是一种串行通信协议,用于在多个设备之间进行数据交换。 在Linux系统中,I2C总线寄存器位于内核空间中的驱动程序中,由内核提供支持。通过这些寄存器,可以实现对I2C总线的读写操作、设备的探测和配置等功能。 I2C总线寄存器主要包括如下几个方面的功能: 1. 控制寄存器:用于设置I2C总线的工作模式和速率等参数。通过控制寄存器可以选择I2C总线的主从模式,设置传输速率和时钟频率等。 2. 数据寄存器:用于存储需要传输的数据。在写操作中,数据会被写入数据寄存器,然后通过I2C总线发送给目标设备。在读操作中,目标设备的数据会被存储在数据寄存器中,然后从数据寄存器中读取出来。 3. 状态寄存器:用于检测I2C总线的状态。通过状态寄存器可以判断I2C总线是否忙碌、传输是否成功等。状态寄存器中的标志位可以提供给驱动程序检测和判断使用。 4. 地址寄存器:用于设置目标设备的地址。在I2C总线中,每个设备都有一个唯一的地址,通过地址寄存器可以设置要读写的目标设备的地址。 总的来说,Linux I2C总线寄存器提供了对I2C总线通信的底层控制和管理能力,通过对这些寄存器的操作可以实现I2C设备的读写操作、总线的配置和控制等功能。同时,通过驱动程序对这些寄存器进行访问和操作,可以方便地实现I2C设备的驱动开发和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值