天天看点

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

1.IIC简介

  • IIC有两条数据线,SCL和SDA。
  • 空闲时间SCL和SDA均处于高电平。
  • IIC标准模式下速度可以达到100KB/S,快模式下速度可以达到400KB/S。
  • IIC支持多从机,通过从机地址来区分。

2.IIC必备知识

1.起始位

即IIC通讯协议开始标志

SCL为高电平时,SDA出现下降沿。

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

2.停止位

即IIC通讯结束

SCL为高电平期间SDA出现上升沿

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

3.数据传输位

SCL为高电平期间SDA上的数据有效,SCl为低电平期间,SDA数据可以改变。

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

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)

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

 寄存器 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

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

寄存器 I2Cx_IFDR 也只有 IC(bit5:0)这个位,用来设置 I2C 的分频,I2C 的时钟源可以选择 IPG_CLK_ROOT 

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

 如果我们选择PER_CLK_ROOT=49.5M,那么我们可以选择寄存器值为0X13即480分频这样IIC频率=49.5M/480=103.125KHZ

 3.IIC控制寄存器(I2Cx_I2CR)

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

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)

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

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)

I.MX6ULL IIC浅析1.IIC简介2.IIC必备知识3.I.MX6UL I2C 简介4.I.MX6UL I2C重要寄存器

当要发送数据的时候将要发送的数据写入到此寄存器,如果要接收数据的话直接读取此寄存器即可得到接收到的数据。