当前位置:网站首页>IIC 通信协议 (一)
IIC 通信协议 (一)
2022-07-27 03:51:00 【在路上,正出发】

目录
引言
这个专栏闲置好久了,最近忙里偷闲想学一下IIC通信的协议以及对应的FPGA实现。顺便以博客的形式记录一下~
本篇博文主要就是介绍与 IIC 通信相关的基础内容。
IIC协议
1、历史
IIC总线由飞利浦公司在上世纪80年代推出的总线协议。
2、特点
IIC总线属于串行、同步、低速、低距、半双工、多主机的通信协议。
3、信号线
2根信号线,一根时钟线(SCL),一根数据(地址)线(SDA)。
4、主从关系

IIC总线上相互通信的设备,可以分为两类,即主设备和从设备。
主设备有权利主动发起、结束一次通信。从设备只能被动响应。如果总线上有多个设备同时启用总线,IIC有自身的检测和仲裁机制,防止产生错误。
连接在IIC总线上的设备都有一个唯一的地址(典型的地址位宽:7bits,也有10bits),每个设备都可以作为主机或从机,BUT,同一时刻只能有一个主机存在。
对于7位地址线位宽的地址寻址:

5、通信过程
- 主机发送起始信号 启用IIC总线;
- 主机发送一个字节数据指示从机地址以及读写方向;
- 被寻址的从机发送应答信号回应主机;
- 发送器发送一个字节的数据;
- 接收器发送应答信号回应接收器;
- 重复4 5 步骤;
- 主机发送停止信号释放 IIC 总线;
6、协议规范
1、时钟信号为高电平期间,数据总线必须保持稳定,时钟信号为低电平时,数据总线才能变化。示意图如下:

2、时钟信号为高电平时,数据信号由高电平跳变到低电平为总线的 起始信号;由低电平跳变到高电平为总线的停止信号。示意图:空闲时,SCL信号和SDA信号均为高电平。

3、当IIC 主机(不一定是发送端还是接受端)将8 位数据或命令传出后,会将数据总线(SDA)释放,然后等待从机应答(低电平0 表示应答,1 表示非应答),此时的时钟仍然是主机提供的。示意图:

4、数据帧格式,I2C 器件通讯的时候首先是要发送“起始信号”,紧跟着就是七位器件地址,第八位是数据传送方向位(0:代表写,1:代表读),再后面就是等待从机的应答。当然传送结束后,“终止信号”也是由主机来产生的。发送数据的时候是高位先发送。IIC 一帧数据有9位,8个数据位加1个应答位。
地址
1、器件地址
从机的器件地址,一般是器件本身在制造完成就已经确定,或者部分确定。以AT24C64为例:

2、存储器地址
这个存储器地址分为单字节和双字节两种:
单字节:

双字节:

读写时序
典型时序图:
1、主机——>从机

蓝色表示数据源自主机,黄色表示数据源自从机。绿色表示数据循环发送。S表示起始信号,P表示结束信号,A表示应答信号。在主机发送停止信号前的应答信号一般为不应答。
2、从机——>主机

蓝色表示数据源自主机,黄色表示数据源自从机。绿色表示数据循环发送。S表示起始信号,P表示结束信号,A表示应答信号。在主机发送停止信号前的应答信号一般为不应答。
3、主机——>从机 (先) 从机——>主机 (后)

注意此处重新发起通信 更改发送方向,主从机并没有改变,可以不发送停止信号。即使从机更改了,主机也可以不发送停止信号,直接与另一个从机开始新的通信。因为如果主机发送了停止信号,总线被释放,释放后可能被其他的主机抢下总线的使用权。
1、写时序
1.1、单字节写时序
单字节 存储器地址:

时序过程描述:
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.2、连续写时序
单字节 存储器地址:

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 位,终止传输。
2、读时序
2.1、单字节读时序
单字节 存储器地址:

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 位,终止传输。
2.2、连续读时序
单字节 存储器地址:

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】芯路恒开发板教程;
边栏推荐
猜你喜欢

e. The difference between target and e.currenttarget

shel自动设置目录权限

数据库泰斗王珊:努力创新,精心打磨优质的数据库产品

深度剖析 —— 动态内存管理

Anonymous named pipes, understanding and use of interprocess communication in shared memory

How to set user-defined display for Jiaming Watch

Nacos启动与登录

Use the kubesphere graphical interface dashboard to enable the Devops function

Brightcove任命Dan Freund为首席营收官

Rust:axum learning notes (1) Hello World
随机推荐
Ribbon负载均衡策略与配置、Ribbon的懒加载和饥饿加载
ISG index shows that the it and business service market in the Asia Pacific region fell sharply in the second quarter
BSN IPFs (interstellar file system) private network introduction, functions, architecture and characteristics, access instructions
js修改对象数组的key值
使用kubesphere图形界面dashboard开启devops功能
Principle of bean validation --07
人很话不多,工程师不耍嘴皮子
F - Pre-order and In-order(Atcoder 255)
The external symbol parsed by the method "public: virtual _ucdecl nvinfer1:: yololayerplugin:: ~yololayerplugin (void)" "public: virtual
Why does genericservlet have two init methods
spark练习案例(升级版)
【软件工程期末复习】知识点+大题详解(E-R图、数据流图、N-S盒图、状态图、活动图、用例图....)
Echart柱状图中数据显示在图上方
The difference between ArrayList and LinkedList
佳明手表怎么设置用户定制显示
[untitled]
JMeter学习笔记004-CSV文件行数控制循环次数
卷积神经网络——灰度图像的卷积
Ref Hook
Effect Hook