I2c子系统在进公司来的时候就学习过了,可是那是还不是很熟悉linux中的i2c子系统,就没有细看。记得当初很想熟悉linux中的各种总线驱动,想专门写一个关于总线驱动的专集,后来发现好像就没有几个,粗粗的写完了,也就是和菜鸟一起学linux总线驱动的专集。现在子系统又要开始讲到i2c了,那么就偷个小懒,参考一下下。
讲到了i2c子系统,一开始便是要讲解下i2c的协议了,从最下面的协议开始熟悉,因为一般调试的时候就是看波形,有没有clock,有没有data。
I2C总线由两根线组成,即串行数据(SDA)和串行时钟(SCL)。每个器件都有一个唯一的地址识别,而且都可以作为一个发送器或接收器。下面贴些主要的术语。
发送器: 发送数据到总线的器件
接收器: 从总线接收数据的器件
主机: 初始化发送产生时钟信号和终止发送的器件
从机: 被主机寻址的器件
多主机: 同时有多于一个主机尝试控制总线但不破坏报文
仲裁 : 是一个在有多个主机同时尝试控制总线但只允许其中一个控制总线并使报文不被破坏的过程
同步: 两个或多个器件同步时钟信号的过程
如上图所示,SDA和SCL线上挂接着很多设备。也有两个主机,A和B。
SDA和SCL都是双向线路,就是即可以当输入也可以当输出的,他们都通过上拉电阻连接到正的电源电压上。当总线空闲时,这两条线路都是高电平的。连接到总线的器件输出级必须是漏极开路或者集电极开路才能执行与的功能。
I2C总线上数据的传输速率在标准模式下可以达到100kbit/s,在快速模式下可达到400kbit/s,在高速模式下可达3.4Mbit/s。连接到总线的接口数量只由总线电容是400pF的限制决定。
I2C是按位传输的,一个时钟一位数据。SDA线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。
I2C总线中,有起始(S)和停止(P)。
起始位:当SCL是高电平时,SDA线从高电平向低电平转换。
停止位:当SCL是高电平时,SDA线从低电平向高电平转换。
如图所示:
I2C传输的数据中,发送到SDA线上的每个字节为8位。每个字节后必须跟一个响应位,即ACK。其简单的数据传输的时序如下
I2C的地址共有7位,紧接着的第8位是数据方向位,0表示发送(写),1表示请求数据(读)。下图为完整的数据传输图
上图就是I2C协议的整个过程了,首先是起始位,然后寻找设备,发送设备地址,接着发送数据,或者请求数据。最后停止位。
标签:SCL,i2c,高电平,总线,SDA,linux,I2C,子系统 From: https://blog.51cto.com/u_15940062/6008701