基础概念
IC(Inter-Integrated Circuit)又称I2C,是是IICBus简称,所以中文应该叫集成电路总线。
IIC的总线的使用场景,所有挂载在IIC总线上的设备都有两根信号线,一根是数据线SDA,另一 根是时钟线SCL。这两个信号线都是双向的。 作为一种通信方式,IIC总线在某一时刻,总线只允许有一个设备处于发送状态,所发生的数据被总线上所 有的设备所接收。IIC通信协议包含有设备地址,只有发送方携带的地址与某个接收方的地址相同时,接收 方才真正执行相关的指令。
IIC总线规定,设备在空闲时,两根总线都处于高电平状态。为保证这种状态,数据线SDA和时钟线SCL都要 外接上拉电阻 。
I2C通信的流程
- IIC总线上连接的若干设备中,每次通信前,发送方首先发送一个“起始”信号,其实信号就是在SCL为高电平时, SDA发送一个低电平。当其它设备接收到这个其实信号后,将进行一次“总线仲裁”。意思就是设备(除发送其实信 号的那个设备以外的)都将处于聆听状态。
2.IC总线进行数据传送时,时钟线(SCL)上的信号为高电平期间,数据线(SDA)上的数据必须保持稳定。只有在时钟线 (SCL)上的信号为低电平期间,数据线(SCL)上的高电平或低电平状态才允许变化。同时,SCL信号由数据启动发送 的设备提供。输出到数据线(SDA)上的每个字节必须是8位。数据传送时,先传送最高位(MSB),后传送最低位(LSB)。
3.发送器每发送一个字节(8个bit),就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。 主机 SCL拉高,读取从机SDA的电平。对于反馈有效应答位ACK的要求是:接收器在第9个时钟脉冲之前的低电平 期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平。
数据线(SDA)为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节。
数据线(SDA)为高电平时,规定为非应答位(NACK),表示接收器没有成功接收该字节。
当发送方发送完最后一个bit后,需要发送一个结束标志来终止整个通信过程。当时钟线SCL 为高电平时,数 据线SDA 由低电平向高电平跳变。
完整的IIC通信时序图。
IIC控制寄存器
IICCON:IIC控制寄存器中的每个域都需要设置
Bit7:处于发送数据时,如果设置为允许,那么当接收设备回应ACK后,会产生IIC中断。当处于接收数据时, 允许这一位会发送ACK,否则发送NACK。
Bit6:IIC产生波特率的第一次分频
Bit5:由于我们要使用中断方式,所以这一位允许
Bit4:这一位看起来似乎是一个查询用的挂起标志,但是这一位是允许写0的。而且无论我们要发送什么数 据,都必须清除这一位才能真正将数据发送出去。
Bit0~3:IIC产生波特率的第二次分频
代码示例 
IIC初始化函数
第16~17行:配置GPE14和GPE15为IIC方式
第19行:允许ACK,中断使能,IIC时钟分频为512=50M/512=97656.25
第20行:发送时钟分频因子 0+1=10 因此,波特率为97656.25约等于97.6K
第22~23行:允许IIC中断,注册中断服务函数
IIC中断服务函数,由于IIC控制器会在收到和发送完ACK之后产生中断,我们将来在数据发送后等待这个标 记即可。
由于无论发送还是接收数据,手册里要求我们必须清除IICCON的第四位之后才能继续,也就是说我们把数据放入IICDS之后,数据并没有发送出去,而是需要我们把这一位清零后数据才开始发送。从发送第一个比特到接收到ACK之间肯定需要时间,当收到ACK之后就会产生中断。需要注意的 是at24c02在收到数据之后需要一点时间把数据写入到EEPROM中,所以可以在循环中等待一段时间。这个 时间大约为100us。
写操作
读操作
结合以下流程图更容易理解
主机发送器操作
主机接收器操作
以下是逻辑分析仪采取的波形图,直观地查看数据