1.IIC简介
- IIC有两条数据线,SCL和SDA。
- 空闲时间SCL和SDA均处于高电平。
- IIC标准模式下速度可以达到100KB/S,快模式下速度可以达到400KB/S。
- IIC支持多从机,通过从机地址来区分。
2.IIC必备知识
1.起始位
即IIC通讯协议开始标志
SCL为高电平时,SDA出现下降沿。
2.停止位
即IIC通讯结束
SCL为高电平期间SDA出现上升沿
3.数据传输位
SCL为高电平期间SDA上的数据有效,SCl为低电平期间,SDA数据可以改变。
4.应答信号
当IIC主机发送完8位数据后将SDA设置为输入模式,等待从机应答。
从机接收到数据后将SDA信号拉低证明接收完成。
5.IIC写时序
主机如果想要修改从机寄存器内容需要以下步骤:
1.发送起始信号
2.发送IIC地址,
IIC地址是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为1 的话表示这是一个读操作,为 0 的话表示这是一个写操作。
3.等待从机发送应答信号
4.重新发送起始信号
5.发送要写入的寄存器地址
6.等待从机发送应答信号
7.发送要写入的数据
8.等待从机发送应答信号
9.发送停止信号
5.IIC读时序
主机如果要读取机寄存器数据需要以下步骤:
1.主机发送起始信号
2.主机发送从机地址,最后一位为写位(写)
3.等待应答信号
4.主机发送要读取的寄存器地址
5.等待从机发送应答信号
6.重新发送起始信号
7.重新发送要读取的IIC从机设备地址,最后一位为读写位(读)
8.等待从机发送应答信号
9.在SCL为高电平期间读取SDA电平
10.如果读取完成发送非应答信号,如果没有读取完发送应答信号
11.主机发送停止信号,停止IIC数据传输。
注意如果读取的时候如何需要读取多个数据则需要发送应答信号,直到读取完毕发送非应答信号。
3.I.MX6UL I2C 简介
I.MX6UL 共有4个IIC
支持标准模式和快速模式,标准模式下 I2C 数据传输速率最高是 100Kbits/s,在快速模式下数据传输速率最高为 400Kbits/s。
4.I.MX6UL I2C重要寄存器
1.IIC地址寄存器(I2Cx_IADR)
寄存器 I2Cx_IADR 只有 ADR(bit7:1)位有效,用来保存 I2C 从设备地址数据。
2.分频寄存器(I2Cx_IFDR)
I2C_IFDR提供了一个可编程的预分频器,以将时钟配置为比特率选择。 寄存器不会通过软件复位来复位。
I2C时钟来自PERCLK_ROOT,该时钟由IPG_CLK_ROOT产生。 I2C使用以下公式可以轻松获得时钟频率:
I2C clock Frequency = (PERCLK_ROOT frequency)/(division factor correspondingto IFDR)
默认情况下,IPG_CLK_ROOT和PERCLK_ROOT频率设置为49.5MHz,根时钟来自PLL2的PFD2。 获取频率可以是
完成于:
PLL2 = 528MHz
PLL2_PFD2 = 528MHz * 18 / 24 = 396MHz
IPG_CLK_ROOT = (PLL2_PFD2 / ahb_podf )/ ipg_podf = (396MHz/4)/2 =49.5MHz
PER_CLK_ROOT = IPG_CLK_ROOT/perclk_podf = 49.5MHz/1 = 49.5MHz
寄存器 I2Cx_IFDR 也只有 IC(bit5:0)这个位,用来设置 I2C 的分频,I2C 的时钟源可以选择 IPG_CLK_ROOT
如果我们选择PER_CLK_ROOT=49.5M,那么我们可以选择寄存器值为0X13即480分频这样IIC频率=49.5M/480=103.125KHZ
3.IIC控制寄存器(I2Cx_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 的话产生一个重新开始信号。
4.IIC状态奇存器(I2Cx_I2SR)
ICF(bit7):数据传输状态位,为 0 的时候表示数据正在传输,为 1 的时候表示数据传输完成。
IAAS(bit6):当为 1 的时候表示 I2C 地址,也就是 I2Cx_IADR 寄存器中的地址是从设备地址。
IBB(bit5):I2C 总线忙标志位,当为 0 的时候表示 I2C 总线空闲,为 1 的时候表示 I2C 总线忙。
IAL(bit4):仲裁丢失位,为 1 的时候表示发生仲裁丢失。
SRW(bit3):从机读写状态位,当 I2C 作为从机的时候使用,此位用来表明主机发送给从机的是读还是写命令。为 0 的时候表示主机要向从机写数据,为 1 的时候表示主机要从从机读取数据。
IIF(bit1):I2C 中断挂起标志位,当为 1 的时候表示有中断挂起,此位需要软件清零。
RXAK(bit0) :应答信号标志位,为 0 的时候表示接收到 ACK 应答信号,为 1 的话表示检测到 NO ACK 信号。
5.IIC数据寄存器(I2Cx_I2DR)
当要发送数据的时候将要发送的数据写入到此寄存器,如果要接收数据的话直接读取此寄存器即可得到接收到的数据。