目录
这个专栏闲置好久了,最近忙里偷闲想学一下IIC通信的协议以及对应的FPGA实现。顺便以博客的形式记录一下~
本篇博文主要就是介绍与 IIC 通信相关的基础内容。
IIC总线由飞利浦公司在上世纪80年代推出的总线协议。
IIC总线属于串行、同步、低速、低距、半双工、多主机的通信协议。
2根信号线,一根时钟线(SCL),一根数据(地址)线(SDA)。
IIC总线上相互通信的设备,可以分为两类,即主设备和从设备。
主设备有权利主动发起、结束一次通信。从设备只能被动响应。如果总线上有多个设备同时启用总线,IIC有自身的检测和仲裁机制,防止产生错误。
连接在IIC总线上的设备都有一个唯一的地址(典型的地址位宽:7bits,也有10bits),每个设备都可以作为主机或从机,BUT,同一时刻只能有一个主机存在。
对于7位地址线位宽的地址寻址:
1、时钟信号为高电平期间,数据总线必须保持稳定,时钟信号为低电平时,数据总线才能变化。示意图如下:
2、时钟信号为高电平时,数据信号由高电平跳变到低电平为总线的 起始信号;由低电平跳变到高电平为总线的停止信号。示意图:空闲时,SCL信号和SDA信号均为高电平。
3、当IIC 主机(不一定是发送端还是接受端)将8 位数据或命令传出后,会将数据总线(SDA)释放,然后等待从机应答(低电平0 表示应答,1 表示非应答),此时的时钟仍然是主机提供的。示意图:
4、数据帧格式,I2C 器件通讯的时候首先是要发送“起始信号”,紧跟着就是七位器件地址,第八位是数据传送方向位(0:代表写,1:代表读),再后面就是等待从机的应答。当然传送结束后,“终止信号”也是由主机来产生的。发送数据的时候是高位先发送。IIC 一帧数据有9位,8个数据位加1个应答位。
从机的器件地址,一般是器件本身在制造完成就已经确定,或者部分确定。以AT24C64为例:
这个存储器地址分为单字节和双字节两种:
单字节:
双字节:
典型时序图:
1、主机——>从机
蓝色表示数据源自主机,黄色表示数据源自从机。绿色表示数据循环发送。S表示起始信号,P表示结束信号,A表示应答信号。在主机发送停止信号前的应答信号一般为不应答。
2、从机——>主机
蓝色表示数据源自主机,黄色表示数据源自从机。绿色表示数据循环发送。S表示起始信号,P表示结束信号,A表示应答信号。在主机发送停止信号前的应答信号一般为不应答。
3、主机——>从机 (先) 从机——>主机 (后)
注意此处重新发起通信 更改发送方向,主从机并没有改变,可以不发送停止信号。即使从机更改了,主机也可以不发送停止信号,直接与另一个从机开始新的通信。因为如果主机发送了停止信号,总线被释放,释放后可能被其他的主机抢下总线的使用权。
单字节 存储器地址:
时序过程描述:
1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输待写入的数据;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机产生STOP 位,终止传输。
双字节 存储器地址:
时序过程描述:
1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置SDA 为输出,传输待写入的数据;
10、设置SDA 为三态门输入,读取从机应答信号;
11、读取应答信号成功,主机产生STOP 位,终止传输。
单字节 存储器地址:
1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输待写入的第1 个数据;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功后,主机设置SDA 为输出,传输待写入的下一个数据;
10、设置SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤11,若数据未被写完,转到步骤9;
11、读取应答信号成功,主机产生STOP 位,终止传输。
双字节 存储器地址:
1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置SDA 为输出,传输待写入的第1 个数据;
10、设置SDA 为三态门输入,读取从机应答信号;
11、读取应答信号成功后,主机设置SDA 为输出,传输待写入的下一个数据;
12、设置SDA 为三态门输入,读取从机应答信号;n 个数据被写完,转到步骤13,若数据未被写完,转到步骤11;
13、读取应答信号成功,主机产生STOP 位,终止传输。
单字节 存储器地址:
1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机发起起始信号;
8、主机传输器件地址字节,其中最低位为1,表明为读操作;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的一个字节的数据;
10、产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
11、主机产生STOP 位,终止传输。
双字节 存储器地址:
1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机发起起始信号;
10、主机传输器件地址字节,其中最低位为1,表明为读操作;
11、设置SDA 为三态门输入,读取从机应答信号;
12、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的一个字节的
数据;
13、主机设置SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总
线会被自动拉高);
14、主机产生STOP 位,终止传输。
单字节 存储器地址:
1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输1 字节地址数据;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机发起起始信号;
8、主机传输器件地址字节,其中最低位为1,表明为读操作;
9、设置SDA 为三态门输入,读取从机应答信号;
10、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的第1 个字节的数据;
11、主机设置SDA 输出,发送一位应答信号;
12、设置SDA 为三态门输入,读取SDA 总线上的下一个字节的数据;若n 个字节数据
读完成,跳转到步骤13,若数据未读完,跳转到步骤11;(对于AT24Cxx,一次读取长度最大为32 字节,即n 不大于32)
13、主机设置SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
14、主机产生STOP 位,终止传输。
双字节 存储器地址:
1、主机设置SDA 为输出;
2、主机发起起始信号;
3、主机传输器件地址字节,其中最低位为0,表明为写操作;
4、主机设置SDA 为三态门输入,读取从机应答信号;
5、读取应答信号成功,主机设置SDA 为输出,传输地址数据高字节;
6、主机设置SDA 为三态门输入,读取从机应答信号;
7、读取应答信号成功,主机设置SDA 为输出,传输地址数据低字节;
8、设置SDA 为三态门输入,读取从机应答信号;
9、读取应答信号成功,主机发起起始信号;
10、主机传输器件地址字节,其中最低位为1,表明为读操作;
11、设置SDA 为三态门输入,读取从机应答信号;
12、读取应答信号成功,主机设置SDA 为三态门输入,读取SDA 总线上的第1 个字节的数据;
13、主机设置SDA 输出,发送一位应答信号;
14、设置SDA 为三态门输入,读取SDA 总线上的下一个字节的数据;若n 个字节数据读完成,跳转到步骤15 ,若数据未读完,跳转到步骤 13 ;(对于 AT24Cxx ,一次读取长度最大为 32 字节,即 n 不大于 3215、主机设置 SDA 输出,产生无应答信号(高电平)(无需设置为输出高电平,因为总线会被自动拉高);
16、主机产生 STOP 位,终止传输。
【1】 创客学院视频;
【2】芯路恒开发板教程;