IIC通信:
特点:
IIC总线是两线式串行总线(连同GND为3线),仅需要时钟和数据两根线就可以进行数据传输,仅占用两个IO口。
IIC总线可以在同一总线上连接多个器件,每个器件都有自己的器件地址。
引脚:
芯片上有A0、A1..是用来设置器件地址的
SDA是串行数据引脚,用于在芯片读写时输入或输出数据和地址,是双向引脚。
SCL是器件的串行同步时钟信号输入端,由单片机的IO口提供。(时钟信号一直由主机控制,即单片机)
WP是保护引脚,但输入高电平时,禁止写入。但有时候没用,所以一般不用
D7-D4是固定地址,D3-D1是可变地址,就是A2.A1.A0 还有D0(LSB) 就是控制读写(R/W)的地址,
写入时R/W为0,读取时R/W为1
一个字节一个字节得传输:
使用:
读写操作时需要先发送器件的地址,与器件地址相符合的器件得到确认就开始执行操作。
传输:
开始:
SCL为高电平、SDL有一个从高到低的电平跳变动作
保持:
器件在SCL、SDL都为高电平是才会从数据线上采取数据,而芯片可以在SCL在低电平的时候写入,然后拉高电平,然后再变低电平。SDL不应该有电平跳变(为高?)数据只有在SDL为高时才是有效数据。
停止:(数据传输完毕)
SCL为高电平、SDL有一个从低到高的电平跳变动作
连接在IIC总线上的器件在每接收完一个字节(8个二进制位)后,在第9个时钟信号时,会在SDA上回应一个低电平的ACK应答信号,以此表明当前受控的器件已经接收完一个字节,可以开始下一个字节了编程的时候就可以在传送完一个字节后,把连接SDA的IO口设置成回读数据(比如把IO口设置为高电平),然后在SCL操作一个脉冲,在SCL为高时读取SDA,如不为低电平就说明器件状态不空闲或出错,由于SDA是双向的IO,每个字节接收完成后,接收方都可以发送一个ACK回应
状态保持的最少时间:
开始、停止: 高至少要保持4.7us,低电平要保持4us。
保持和空闲:高电平保持至少4us
数据写入要求:
每一位的写入是用时钟上升沿同步数据,也就是说时钟上升沿后从器件开始检测输入的数据SDL为高
每一位的读取是用时钟下降沿同步数据,也就是说时钟下降沿后从器件开始输出的数据 SDL为高高到低,变化时间最大 300ns结束低到高,1us
综上所述:在IIC总线上,每一位数据都有一个时钟脉冲相对应,即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。进行数据传递时,在SLC呈现高电平期间,SDA的电平必须稳定,只有在SCL为低电平时,才允许SDA上的电平改变
主机(单片机)是产生起始信号、停止信号并输出时钟信号的器件,此时任何被寻址的器件都被认为是从机
多个字节传输:
也需要先发送一个字节作为器件地址,每次通信都要先发送一个字节的器件地址和读写标识,称为器件寻址
有的芯片有高四位和低四位,高四位是不同IIC类型器件固有的编码,芯片出厂就已经给定,低四位中A2.A1.A0是器件地址,对应芯片A2.A1.A0引脚
D7-D4是固定地址,D3-D1是可变地址,就是A2.A1.A0 还有D0(LSB) 就是控制读写(R/W)的地址,写入时R/W为0,读取时R/W为1
读取:
读取当前地址数据:
这种读取模式是读取当前芯片内部地址指针指向的数据。每次读写操作后,芯片会把最后一次操作过的地址最为当前的地址,在这里要注意的是,单片机在接收完芯片传送的数据后不必发送低电平的ACK给芯片,直接拉高SDA等待一个时钟后发送停止位。
读取任意地址数据:
在读取当前地址时,在这个指令前加一个“伪操作”,这个“伪操作”传送一个写指令,但这个写指令在地址传送完成后就要结束,这时芯片内部的地址指针指到这个地址上,再用读取当前地址指令就可以读取写入的地址数据
连续读取:
连续读取操作只要在上面两种读取方式中,让芯片每传送完一个字节数据后,单片机回应给芯片一个低电平的ACK应答,那么芯片地址指针自动加一并继续传送数据,直到单片机不回应并停止操作。