学习嵌入式之硬件——I2C
一、I2C
1.定义
内部集成电路的简称,半双工串行同步通信,是芯片和芯片之间的通信方式;通常只有一个主机,多个从机,采用主从应答的方式
- 上图所示是IIC的总线的使用场景,所有挂载在IIC总线上的设备都有两根信号线,一根是数据线SDA, 另一根是时钟线SCL。这两个信号线都是双向的。
- 作为一种通信方式,IIC总线在某一时刻,总线只允许有一个设备处于发送状态,所发生的数据被总 线上所有的设备所接收。IIC通信协议包含有设备地址,只有发送方携带的地址与某个接收方的地址 相同时,接收方才真正执行相关的指令。
- 主从应答:命令总是由主机发起,从机应答,如果主机只有一个,叫单主机,两个或两个以上,是多主机,通常情况下为单主机;主机再发命令的时候,所有从机都能收到,从机的回答所有也都能收到;
- 时钟信号线永远只有主机发;
2.释放总线:
- 整根线为高电平
- 释放总线的权利(1)应该由接收方来,谁要接收数据,谁要提前释放总线
3.上拉电阻
- IIC总线规定,设备在空闲时,两根总线都处于高电平状态。为保证这种状态,数据线SDA和时钟线SCL都 要外接上拉电阻。对于I.MX来说,这个上拉电阻也可以在引脚电器配置中设置。
- 上拉电阻的作用就是当双方在发1的时候,保证最后线上是1,防止内阻拉低,看过原理图10k
4.I2C时序图:
- 空闲时,两根线均处于高电平;
- 每次通信前,发送方首先发送一个“起始”信号,其实信号就是在SCL为高电平 时,SDA发送一个低电平。时钟信号是由主机来控制和发送;
- 时钟信号线为低电平时,数据信号线可以发生改变,当为高电平时,数据信号线必须保持稳定,接收方要在高电平阶段来采样。
- 高位先行原则
- 当发完信号时,接收方需要应答,应答为ACK(0)或者NACK(1)(芯片手册写);
- 如果后续还有发送数据,就接着应答后面,继续发,依旧遵循上述原则
- 如果后续没有发送数据,在时钟信号线为高电平时,把数据信号线拉为高电平,从此置空闲状态
每一个从机都有占有一个字节的地址值,而主机发完一个起始信号后,先发从机的地址,地址占7位;最后一个bit,是数据流向位。0:主机发从机收;1:从机发主机收,
5.I.MA6ULL
I.MX6U 提供了 4 个 I2C 外设,通过这四个 I2C 外设即可完成与 I2C 从器件进行通信I.MX6U
的 I2C 支持两种模式:标准模式和快速模式,标准模式下 I2C 数据传输速率最高是 100Kbits/s,在快速模式下数据传输速率最高为 400Kbits/s。
6.寄存器I2C_I2CR
- IEN(bit7):I2C 使能位,为 1 的时候使能 I2C,为 0 的时候关闭 I2C;
- IIEN(bit6):I2C 中断使能位,为 1 的时候使能 I2C 中断,为 0 的时候关闭 I2C 中断;
- MSTA(bit5):主从模式选择位,设置 IIC 工作在主模式还是从模式,为 1 的时候工作在主模式,为 0的时候工作在从模式;
- MTX(bit4):传输方向选择位,用来设置是进行发送还是接收,为 0 的时候是接收,为 1 的是发送;
- TXAK(bit3):传输应答位使能,为 0 的话发送 ACK 信号,为 1 的话发送 NO ACK 信号;
- RSTA(bit2):重复开始信号,为 1 的话产生一个重新开始信号。
7.寄存器 I2Cx_I2SR
- ICF(bit7):数据传输状态位,为 0 的时候表示数据正在传输,为 1 的时候表示数据传输完成;
- IAAS(bit6):当为 1 的时候表示 I2Cx_IADR 寄存器中的地址是从设备地址。为0表示I2Cx_IADR是自己的地址;
- IBB(bit5):I2C 总线忙标志位,当为 0 的时候表示 I2C 总线空闲,为 1 的时候表示 I2C 总线忙;
- IAL(bit4):仲裁丢失位,为 1 的时候表示发生仲裁丢失。仲裁丢失在手册第1455页有说明,如果多个设备同时尝试连接总线,则其中一个成为主设备。硬件会立即将仲裁失败的设备切换到Slave
- Receive模式 。那么仲裁失败的设备就会产生仲裁丢失,导致此位置位。需要理解的是这种情况一定发生在发送起始位的时候,也就是说在发送完起始位之后应该判断此位是否为1;
- SRW(bit2):从机读写状态位,当 I2C 作为从机的时候使用,此位用来表明主机发送给从机的是读还是写命令。为 0 的时候表示主机要向从机写数据,为 1 的时候表示主机要从从机读取数据;
- IIF(bit1):I2C 中断挂起标志位,当为 1 的时候表示有中断挂起,此位需要软件清零;
- RXAK(bit0):应答信号标志位,无论作为主机还是从机,为 0 的时候表示接收到 ACK 应答信号,为1 的话表示检测到 NO ACK 信号。
8.寄存器I2Cx_I2DR
这是 I2C 的数据寄存器,此寄存器只有低 8 位有效,当要发送数据的时候将要发送的数据写入到此寄存器
注意:此时LSB代表的是数据流向,需要按照实际情况设置为1或者0;如果要接收数据的话直接读取此寄存器即可得到接收到的数据。
二、电可擦存储器
1.时序图
(1)写8个bit数据
(2)连续写数据
写操作:首先主从机释放总线处于空闲状态,主机在clk处于高电平时,将sda电平拉高,发送起始位。接着主机发送8个bit的设备地址,第8位为数据流向位(0为主机写,1为主机读),从机收到后会发送ACK应答。主机收到从机的应答后,再发送寄存器的地址位,从机收到后发送ACK应答;之后主机发送数据,从机收到后发送ACK应答。主机发送完之后在clk位高电平时拉高电平发送停止位。
(3)当前位置发数据给主机
(3)主机从指定位读
读操作:主机先发送起始位,之后发送8位的设备地址,其中第8个bit写操作,从机收到发送ACK应答,主机再发送寄存器地址,从机回复ACK应答。之后主机会重发设备地址,但第8bit为读操作,从机收到回复ACK应答,从机发送数据,主机收到后回复ACK,主机在最后一个数据字节后回复NACK表示结束,之后主机发送停止位。
- 如果最后主机回应NACK是从机不发了,如果主机发ACK的话,就继续发
三、I2C原理
1.总原理图
- 作为发送方,是否要检测对面回应的ACK;
- 作为接收方,回应的是ACK/NACK;
- 一般用于停止位是否发送并且置1成功