IIC总线协议

泪湿孤枕 提交于 2020-03-04 19:34:16

——即便这类文章多如牛毛,也只有当自己写时才能发现不足——

IIC总线协议

简介

IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的半双工、双向两线式同步串行总线,用于连接微控制器及其外围设备。

它是由双向数据线 SDA 和双向时钟 SCL 构成的串行总线,可发送和接收数据,两条线可以挂多个设备。

I2C 和 SPI 一样以主从的方式工作,不同于 SPI 一主多从的结构,它允许同时有多个主设备存在,每个连接到总线上的器件都有唯一的固化地址,主设备启动数据传输并产生时钟信号,从设备被主设备寻址同一时刻只允许有一个主设备和一个从设备

总结:IIC允许多主从,但同一时刻只允许有一主一从。

I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。这些信号中,起始信号是必需的,结束信号和应答信号都可以不要(最好不要省;如果要结束总线,可以给也可以不给应答;如果要继续读数据,就必须给出应答)。

起始和结束信号总是由主设备产生。

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:即ACK(acknowledge),接收数据的 IC 在接收到 8bit 数据后,拉低SDA,表示已收到数据。当主机读到最后一个字节数据时,可发送 NACK(Notacknowledge)然后跟停止条件。

简要过程:CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

具体过程

起始和停止

初始化:总线在空闲状态时,SCL和SDA都保持着高电平。
起始:当SCL为高电平而SDA由高到低跳变,表示产生一个起始条件,在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线。
停止:当SCL为高而SDA由低到高的跳变,表示产生一个停止条件,在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。
重复起始: 在一次通信过程中,主机可能需要和不同的从机传输数据或者需要切换读写操作时,
主机可以再发送一个起始条件。

(到处是转载,我找不到原始图作者 )
部分图片及内容引自https://blog.csdn.net/w89436838/article/details/38660631
和https://blog.csdn.net/Lingdongtianxia/article/details/81135456

数据传输

数据传输以字节为单位。

SDA上的数据只能在SCL为低电平期间翻转变化,在SCL为高电平期间必须保持稳定,IIC设备只在SCL为高电平期间采集SDA数据。SCL由主设备控制。

主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位。当一个字节按数据位从高位到低位(小端传输)的顺序传输完后,主设备SDA引脚将变为输入,由于SDA和SDL硬件设计时都有上拉电阻,此时SDA变成高电平。从设备若接受到信号,将在第9个周期把SDA拉低,回传给主设备一个应答位, 完成一个字节的传输。

当从设备不能再接收主设备发送的数据时,从设备将回传一个否定应答位(如果它不拉低SDA线,就表示不响应),此时主机发出一个停止信号终止传输或者重新发出一个起始信号开始新的传输。

在这里插入图片描述
主设备在传输有效数据之前要先指定从设备的地址
主机发送的第一个字节为从机地址,高 7 位为地址(默认为7 位地址模式,也有10位地址模式),最低位为 R/W 读写控制位,1 表示操作,0 表示操作。
在这里插入图片描述

数据传输格式

主设备往从设备中读/写数据
在这里插入图片描述

图片摘自RT-THREAD 编程指南v2.0.0 I2C总线设备

主设备往从设备中写(读)数据,然后重启起始条件,紧接着从从设备中读(写)取数据;
在这里插入图片描述

尾注:关于更多有关ACK与NACK的理解,可参考https://blog.csdn.net/u011392772/article/details/102955675
写的非常详细。
更简明的iic协议解析可参考https://www.cnblogs.com/zalebool/p/4214599.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!