16.【linux驱动】IIC驱动-硬件、协议

IIC系列文章
1.【linux驱动】IIC驱动-硬件、协议
2.【linux驱动】IIC驱动OLED屏(GPIO 模拟)
3.【linux驱动】IIC驱动(4418读取EEPROM:24AA025E48T-I/OT)
4.【linux驱动】IIC驱动OLED屏

概述

IIC总线使用两条串行线路传输数据
  SDA :串行数据线
  SCL :串行时钟

  • 传输模式为半双工传输
  • 是一个多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏
  • 每个连接到总线上的器件都有唯一的地址,数据传输和地址设定由软件设定
  • 传输时钟由主机产生

总线空闲状态 :
  SDA :高电平
  SCL :高电平

时序

起始

开始信号:SCL高电平,SDA由高电平跳变为低电平
开始终止:SCL高电平,SDA由低电平跳变为高电平
在这里插入图片描述

数据传输

数据传输:数据位接在在开始信号后,在SCL低电平的时候设置SDA数据位,在SCL高电平的时候采样数据为,因此在SCL高电平的时候SDA必须保持不变
在这里插入图片描述
IIC时钟频率:不高于400K

ACK

数据响应:发送端将8位数据或命令传出后,会检测SDA电平,接收端将SDA由高电平拉为低电平则正确应答,否则传输失败。

器件地址

IIC器件地址:每一个IIC器件都有一个器件地址,例如EEPROM,前四个地址为1010,后三个地址是由硬件链接确定。

引脚电路:IIC引脚为带上拉输出
在这里插入图片描述

数据传输

IIC传输以8位位一个分隔段,传输完8位后接收端必须有一个ACK确认信号。如果外接IIC设备能收到信号的话接着在第9个周期把SDA拉低代表ACK确认。每次传输由开始信号+传输地址+数据+结束信号组成

传输地址组成:开始信号后接7为地址+一位读写标志(0代表写,1代表读)+确认信号(接收端发出)
在这里插入图片描述
所以IIC除了自己以外,可以寻址127个器件。

IIC器件单字节写:器件地址后跟写地址,然后跟数据位
在这里插入图片描述
写过程:

  1. 向IIC总线发送一个起始位
  2. 芯片寻址,向IIC总线写入地址,R/W位是0
  3. 等待应答
  4. 片内子地址寻址
  5. 等待应答
  6. 写入数据
  7. 等待应答
  8. 发送停止位

IIC器件多字节写:多一个字节代表写地址在这里插入图片描述

IIC器件单字节读:读操作是先向器件写入读取地址,然后再发起读取操作,读取完毕不需要确认信号
在这里插入图片描述
读过程:

  1. 向IIC总线发送一个起始位
  2. 芯片寻址,向IIC总线写入地址,R/W位是0
  3. 等待应答
  4. 片内子地址寻址
  5. 等待应答
  6. 向IIC总线再发送一个起始位
  7. 芯片寻址,向IIC总线写入地址,R/W位是1
  8. 等待应答
  9. 读取数据
  10. 发送停止位

整体时序:
在这里插入图片描述

IIC 总线仲裁

IIC总线的仲裁非常简单,基本原理是检测SDA线上的电平是否与自己预期的相同。如果与自己预期的不相同,那么自己就放弃总线。由于IIC数据线是上拉输出,很明显数据位只会在高电平的时候会与自己预期的不相同,因为其他主机此时可能正处在低电平位置。当发现自己高电平数据为设置失败的时候就可以放弃总线了。
仲裁时序图:
在这里插入图片描述

IIC 时钟同步

跟总线仲裁类似,时钟同步也比较简单,通常由时钟最慢的主机决定总线的时钟,因为只有所有主机都是高电平的时候,总线才会是高电平。时钟快的主机将等待时钟慢的主机。
时钟同步时序图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_16054639/article/details/106555710