【I2C】I2C常见知识点整理
定义:Inter-Integrated Circuit - 集成电路总线。
特点:双向、双线、串行、多主控接口标准、速率不快、半双工、同步接口、具有总线仲裁机制。非常适用于器件之间近距离经常性数据通信,可实现设备组网。
线:SCL、SDA。
起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
写操作:
主机发送起始信号后发送I2C从机地址(7位)和写操作0(1位),主机等待从机发送ACK,收到ACK后主机发送从机寄存器地址(8位),接着继续等待ACK,等到ACK后主机发送要写入寄存器的数据。主机发送data,从机发送ACK,重复多次可顺序写入多个寄存器直至主机产生结束信号。
读操作(随机读):
主机发送起始信号后,继续发送从机地址和写操作0,主机等待从机发送ACK,收到ACK后主机发送从机寄存器地址,接着继续等待ACK,等到ACK后主机再次发起起始信号,然后发送从机地址和读操作1,并等待ACK,从机发送ACK之后接着发送指定寄存器里的数据,主机发送ACK表示收到,从机继续发送数据即顺序读取下一个寄存器。当主机希望停止接收数据时就返回一个非应答信号NACK,数据传输将结束。
总线仲裁机制:
SDA线的仲裁是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致,是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失(因为仲裁结束之前各节点发送数据一致),总线系统通过仲裁只允许一个主节点可以继续占据总线。
最大从机数:
由I2C地址决定,7位地址,2^7=128,但是0x00不用,所以理论上可以挂127个从机。但是,虽然I2C协议没有规定总线上设备的最大数目,但是规定了总线的电容不能超过400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制,实际设计中经验值大概是不超过8个器件。
【I2C】在中断函数中能否使用I2C传输?为什么?
不能,多点原因.
1.中断要求尽快处理,否则会影响到其他中断的响应。(I2C和SPI传输过程都比较耗时)
2.I2C传输(I2C_transfer)时transfer内部如果使用中断传输模式,则会造成“中断嵌套”,会出一些不可预见的错误。(内核可能崩溃)
【I2C】I2C的传输速率有哪几种?如何设置?如何获取?
IIC传输位速率在
标准模式下可达100Kbit/s,
快速模式下可达400Kbit/s,
高速模式下可达3.4Mbit/s;
I2C的传输速率和I2C的时钟频率相关。
时钟频率(Hz)与数据传输速率(bit/s)两者是相同的概念。
时钟频率与数据传输率是如何对等的喃。因为一个SCL时钟周期只能传输1bit数据(并且只能在SCL的低电平期间进行SDA数据电平的变化),
假如SCL的时钟频率为100KHz,那么1s中就能产生100K个SCL时钟周期,也就是说1s中可以传输100Kbit的数据。
此时,可以看出时钟频率100KHz与数据传输率100Kbit/s就是一样的了。
因此,想要设置I2C的传输速率,只需要设置I2C的时钟频率就好了。
I2C时钟频率的设置:
一般是I2C总线控制器里面去设置,和具体的控制器型号和对应的I2C总线驱动相关。
有的I2C总线会注册相应的回调函数,通过i2c_ioctl去设置。
还有的办法就是在dts下面通过clock节点去传递I2C的时钟频率
这样我们就可以在dts下面去获取和设置I2C的时钟频率的。会更加的标准。