浅析通信协议---I2C
目录
前言:
这是学习I2C协议时,对一些数据传输的重点进行的总结。
一. 什么是I2C
全称:Inter-Integrated Circuit。I2C是芯片间通信的一种标准,有两大显著特征:2根线、低速。下面我们将围绕这两大特点进行介绍:
二. I2C的一些特征
- 1.两根串行线
一条串行时钟线SCL,一条串行数据线SDA ,这两条线在空闲时都是高电平,从下图的起始波形也可以看出。
- 2.数据传输的起始条件和终止条件
起始条件和终止条件一般由主机产生的:
起始条件:SCL高电平时,SDA从高电平转为低电平
终止条件:SCL高电平时,SDA从低电平转化为高电平
- 3. 高电平采样
I2C判定SDA线上的数据是低电平还是高电平是通过每个时钟周期多次采样。
- 4. SCL在低电平期间,SDA的数据才能发生改变
- 5. SDA上的数据必须在SCL的高电平期间保持稳定
其实这也很好理解,I2C是在每个时钟周期多次取样SDA,只有保持稳定,才能准确测出当前SDA上的数据是0还是1
- 6. 低速
I2C的最大缺点就是速度太慢,串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下也就 3.4Mbi,而且每传一个BYTE就要ACK/NACK,效率实在是低。不过其最大的优点是结构简单。
三. 数据传输的过程
- 1.主机写数据到从机(传输的方向不会改变,即若要改变传输方向必须先发送stop条件)
传输的具体细节:
1.主机控制SDA, 产生起始条件;
2.主机控制SDA,依次设置要寻址的7位从机地址(A6-A0),外加1位的R/W(置为0);
3.从机控制SDA,如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);
4.主机控制SDA, 依次设置从机中的8位寄存器地址(B7-B0);
5.从机控制SDA, 如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);
6.主机控制SDA,依次设置要发送的8位字节数据;
7. 重复步骤6,连续发送数据;
8.主机控制SDA,产生停止条件,停止发送。
- 2.主机读取从机中的数据 (传输的方向可以改变,即若要改变传输方向前无需发送stop条件)
1)自定义开头读取
传输的具体细节:
1.主机控制SDA, 产生起始条件;
2.主机控制SDA,依次设置要寻址的7位从机地址(A6-A0),外加1位的R/W(置为0);
3.从机控制SDA,如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);
4.主机控制SDA, 依次设置从机中的8位寄存器地址(B7-B0);
5.从机控制SDA, 如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);
6.产生重复开始条件Sr + 重新设置要寻址的7位从机地址(A6-A0),外加1位的R/W(这里置为1);
7. 从机控制SDA, 如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);
8.从机控制SDA, 发送字节数据
9.主机控制SDA, 如果可以回应就发送ACK位(拉低SDA), 否则发送NACK(拉高SDA);如果要发送STOP条件,必须将最后一个字节的响应设置为NACK(拉高SDA)
2)顺序读取
传输的具体细节:
这个和自定义读取的内容非常相似,唯一不同的是:从上次读取之后的寄存器地址作为起点,继续读取下去。而自定义读取可以自定义读取的寄存器起点。