imx6ull的IIC实验
I2C协议
IIC是半双工通信(同一时间单向通信),I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。I2C 总线工作是按照一定的协议来运行的,接下来就看一下 I2C 协议。
主机就是负责整个系统的任务协调与分配,从机一般是通过接收主机的指令从而完成某些特定的任务,主机和从机之间通过总线连接,进行数据通讯。
- 发布主要命令的称为主机
- 接受命令的称为从机
IIC主设备功能:主要产生时钟,产生起始信号,停止信号。
IIC从设备功能:可编程的IIC地址检测,停止位检测。
**IIC的一个优点是它支持多主控(multimastering)**, 其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
I2C是支持多从机应答,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备了,
I2C协议
起始信号:在 SCL 为高电平的时候,SDA 出现下降沿就表示为起始位。
终止信号:停止位就是停止 I2C 通信的标志位,和起始位的功能相反。在 SCL 位高电平的时候,SDA出现上升沿就表示为停止位。
数据传输:I2C 总线在数据传输的时候要保证在 SCL 高电平期间,SDA 上的数据稳定,因此 SDA 上的数据变化只能在 SCL 低电平期间发生
应答信号:当 I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态,等待 I2C 从机应答,也就是等到 I2C 从机告诉主机它接收到数据了。应答信号是由从机发出的,主机需要提供应答信号所需的时钟,主机发送完 8 位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过将 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败。
IIC写数据
写时序
起始信号->器件地址(7位地址加一个读写位)->等待应答->要操作内存的地址->等待应答->写入数据->等待应答->停止读时序
主机向从机写数据时候;
1.主机产生起始信号;
2.然后紧跟着发送一个地址,地址一共有7位,紧跟着第8位是数据方向位,0表示主机发送数据,1表示主机接受数据(读);
3.主机发送地址时,总线上的每个从机都将7位地址位与自己的地址比较,相同代表正在被主机寻址,根据R/T位将自己确定为发送器或者接收器;
4.这时主机等待从机的应答信号(A);
5.当主机收到应答信号时,发送要访问从机的那个地址,继续等待从机的应答信号;
6.当主机收到应答信号时,发送N个字节的数据,继续等待从机的N次应答信号;
7.主机产生停止信号,结束传输过程。
IIC读数据
起始信号->器件地址(7+1位写(0))->应答->读取地址->应答->起始信号-.>器件地址(7位+读(1))->应答->读取数据->发送应答->停止信号
1.主机产生起始信号;
2.然后紧跟着发送一从机个地址,地址一共有7位,第8位为0,表明是向从机写命令;
3.主机等待从机的应答信号(ACK);
4.这时主机收到从机的应答信号(A),发送要访问的地址,继续等待从机的应答信号;
5.当主机收到应答信号后,主机要改变通信模式(主机将由发送变为接受,从机将由接受变为发送)所以主机重新发送一个起始信号,之后紧接着发送一个从机地址,此时该地址第8位为1,表明将主机设置成接受模式开始读取数据;
6.这时候主机等待从机的应答信号,当主机收到应答信号时, 就可以接受1个字节数据,当接受完成后, 主机发送非应答信号时候,表示不在接受数据;
7.主机产生停止信号,结束传输过程。
使用的寄存器
IIC的地址寄存器 I2Cx_IADR(x=14)寄存器,(x=14)寄存器,这是I2C 的地址寄存器,只有 ADR(bit7:1)位有效,
用来保存 I2C 从设备地址数据。
I2C Frequency Divider Register (I2C1_IFDR) :IC(bit5:0)这个位,用来设置 I2C 的波特率,I2C 的时钟源可以选择 IPG_CLK_ROOT=66MHz,通过设置 IC 位既可以得到想要的 I2C 波特率。
==时钟源=IC设置的分频值*波特率。==
I2C Control Register (I2C1_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 的话产生一个重新开始信号。
ICF(bit7):数据传输状态位,为 0 的时候表示数据正在传输,为 1 的时候表示数据传输完成。
IAAS(bit6):当为 1 的时候表示 I2C 地址,也就是 I2Cx_IADR 寄存器中的地址是从设备地址。
IBB(bit5):I2C 总线忙标志位,当为 0 的时候表示 I2C 总线空闲,为 1 的时候表示 I2C 总线忙。
IAL(bit4):仲裁丢失位,为 1 的时候表示发生仲裁丢失。
SRW(bit2):从机读写状态位,当 I2C 作为从机的时候使用,此位用来表明主机发送给从机的是读还是写命令。为 0 的时候表示主机要向从机写数据,为 1 的时候表示主机要从从机读取数据。
IIF(bit1):I2C 中断挂起标志位,当为 1 的时候表示有中断挂起,此位需要软件清零。
RXAK(bit0):应答信号标志位,为 0 的时候表示接收到 ACK 应答信号,为 1 的话表示检测到 NO ACK 信号。
I2C Data I/O Register (I2C1_I2DR) ,这是 I2C 的数据寄存器,此寄存器只有低 8 位有效,当要发送数据的时候将要发送的数据写入到此寄存器,如果要接收数据的话直接读取此寄存器即可得到接收到的数据。
硬件IIC和软件IIC
所谓硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的;软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
至于如何区分它们:
可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟。
可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。