UC头条:嵌入式基础1: I2C
1.简介
I2C(Inter-IntegratedCircuit),是一种串行通信总线,用于连接微控制器及其外围设备,实现主控制器和从器件间的主从双向通信,是一种同步半双工通信(两端时钟频率一致,双向通信,但不能同时进行数据收发)。
2.原理
I2C通信属于串行通信,具有两根串行信号线:数据线(SDA),时钟线(SCL)。如下图所示,主控制器与从器件(一个或多个)都通过两根信号线连接,信号线上主机和从机都可以扮演发送器和接收器的角色。为确保传输过程的指向准确性,每个接到I2C总线上的器件都有唯一的地址(7位从器件专用地址码),可实现制定从机的定向传输与群发传输。
2.1信号类型
同时,为确保传输稳定,所有连接在同一I2C总线上的设备共用一个时钟。I2C总线在传送数据过程中共有以下几种类型信号:
(1)开始信号/结束信号
SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
(2)应答信号/非应答信号
IIC总线协议规定,每传送一个字节数据后(8bit),都要有一个应答信号以确定数据传送是否被对方收到。即一个字节传输的8个时钟过后的第9个时钟期间,接收器必须回一个ACK应答信号给发送器,这样才能进行数据传输。
应答信号由接受设备产生,在SCL为高电平期间,接受设备将SDA拉低为低电平,表示数据传输正确,产生应答(ACK),SDA拉高则表示数据传输失败,产生非应答位(NACK)。
(3)闲置状态/被占用状态
在主机发送起始信号后,且未发送终止信号期间,总线处于被占用状态。
发送终止信号后,总线处于闲置状态,SCL与SDA同时为高电平。
2.2总线读写流程
I2C总线进行数据传送时,SCL时钟信号为高电平期间,SDA数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。当一个字节按数据位从高位到低位的顺序传输完后,紧接着从机将拉低SDA线,回传给主设备一个应答位ACK,此时才认为一个字节真正的被传输完成,如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。
I2C总线写通信过程:
主机在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
发送一个地址字节(8bit),其中bit0-6位为从机地址,存放从机唯一地址;bit7位为读写位(R/W),0表示write主机->从机,1表示read从机->主机;
主机发送地址时,总线上每个从机都会将7位地址与自己的地址进行比较,若相同,则将匹配成功,发送应答信号(ACK),确定发送器和接收器;
主机收到ACK后开始发送第一个字节(Command),对应从机中要写入的寄存器;
从机接收到Command后,从机发送ACK;
主机收到ACK后开始发送第一个数据字节:bit0-7(8bit数据,高到低),从机收到数据后,发送应答ACK;
继续发送数据,n帧;
主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;
I2C总线读通信过程:
主机产生START信号,随后发送从机地址(7bit)+0(Write);
*方向仍然是写,待接收到从机发送的ACK应答后,配对成功。
主机接收到ACK后,发送8bit内存地址(Command对应从机相应寄存器地址),从机接收到后,内部寻址并提取数据,返回ACK;
主机接收到ACK后,重新产生START信号,再一次发送从机内存地址,(7bit)+1(Read),从机接收到后返回ACK;
*方向设置为读,主机设置为接收模式
主机接收到ACK后,做好接收从机信息的准备,现在即可接收1bit的数据。
*主机不向从机发送应答信号,接收完毕后直接发起终止信号。
主机接收全部数据后,产生STOP信号,终止通信,总线变为闲置状态。
3.应用实例:I2C控制温感IC
以温度传感器MAX1617A为例,对照手册可查找到以下数据:
Command寄存器对照表如下,可根据Command表查找从机对应寄存器地址。
温度数据返回格式如下所示:
通过以上数据,我们即可有思路,对照写入读写过程:
写入时,输入Command使用:0x0B,0x0C写入温度上限与下限值;
读取时,输入Command使用:通过Command0x0B,0x0C写入温度上限与下限值;
逻辑分析仪数据采样如下所示:
写入过程:
0x30为从机地址0x18<<1+读写位(0);
0x0B为Command,对应从机寄存器存放地址;
0x00位将写入的数据;
波形如下所示:
读取过程:
读当前温度
读过程中,方向先为写入,后为读取
读温度上限:
3.读温度下限: