I2C简述
1.协议特点
- 引脚少,硬件实现简单,不需要USART,CAN的外部收发设备
- 广泛用于系统内多个集成电路之间的通信
2.物理层
@总线
总线可以挂在多个主从通讯设备
它是一个支持多设备的总线,总线指的是多个设备共用的信号线。
一条I2C总线支持多个主机和多个从机通信。
两条线路:一条传输数据,一条传输时钟信号
一个I2C总线只使用两条线路,一条是串行数据线(SDA),用于传输数据;一条是串行时钟线(SCL),用于同步数据的收发,因此I2C采用同步通信。
@主机
主机通过发送从机独立的地址来访问从机
每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址选择不同的设备进行通信。
多个主机通过仲裁决定占用
多个主机同时占用总线的时候采用仲裁的方式来决定哪个设备占用主线
@从机
从机通过改变自身阻态决定是否通信
总线通过上拉电阻接到电源,I2C设备空闲时输出高阻态,输出高阻态相当于将从机与总线的连接线断开。所有设备都空闲的时候,整个总线呈现高阻态,上拉电阻将总线拉成高电平,电压就是电源电压。
开始通信的设备接地,相当于逻辑0,结束通信则呈现高阻态,相当于逻辑1。所以一个从机设备通信时输出逻辑0,结束通信输出逻辑1。
@传输速率
- 标准模式:100kbit/s
- 快速模式:400kbit/s
- 高速模式:可达3.4Mbit/s
目前支持高速模式的设备很少
3.协议层
3.1数据包格式
@主机写数据到从机的基本格式
下面图片黑色表示主机发送数据,白色表示从机发送数据
1.主机发送传输开始信号
2. 主机发送从机地址
主机向总线广播从机的独立地址,从机都会接收该地址并进行比较
若是自己的地址则进行在步骤4发送应答信号
若不是自己的地址则在步骤4发送非应答信号
3.主机发送读写位
发送0表示主机要写数据
4.从机发送应答或非应答信号
5.主机发送数据包
6.从机发送应答/非应答
5,6步骤可以循环执行多次,直到从机发送非应答信号
7.主机发送停止信号
主机收到从机的非应答信号后发送停止信号
@主机读从机的数据的基本格式
下面图片黑色表示主机发送数据,白色表示从机发送数据
1.主机发送传输开始信号
2. 主机发送从机地址
前两步与主机写数据到从机一致
3.主机发送读写位
发送1表示主机要读数据
4.从机发送应答或非应答信号
5.从机发送数据包
6.主机发送应答/非应答信号
5,6同样可以循环多次,直到主机发出非应答信号
7.主机发送停止信号
总结上面两种基本格式
相同点
- 无论哪种模式,开始信号和停止信号都由主机发送
不同点
- 写模式下主机给读写位发送0,读模式下主机给读写位发送1
- 写模式下数据包由主机发送,相应的应答信号由从机发送;读模式下数据包由从机发送,相应的应答信号由主机发送。
@复合通讯格式
由于主机读取设备数据的位置往往具体到设备的寄存器,所以在发送设备的地址之后,还需要发送一个数据包将需要读取的寄存器地址写入从设备。
这种格式只是将上面两种基本格式合并,写数据在前,读数据在后,并且将主机读从机数据的基本格式中的起始信号变成了重复起始信号。
3.2数据包格式的实现
下面介绍如何在总线上实现数据包格式:
@通讯的起始和停止信号
SCL线为高电平时,SDA线由高电平变为低电平表示起始信号,由低电平变为高电平表示停止信号,与物理层对应。
@数据有效位
SCL线为高电平时,SDA线的数据有效;SCL线低电平,SDA线的数据无效
SCL线为高电平时,SDA每一次时钟信号传输一个数据位
@设备地址与读写模式
设备地址可以为7bit,也可以为10bit,一般采用7bit。
当设备地址为7bit时,与读写位刚好组成1字节。
读写位低电平表示主机要写数据,读写位高电平表示主机要读数据。
@响应
数据发送端在等待数据接收端响应的过程中,会将SDA线拉成高电平,数据接收端将电平拉低表示应答。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)