今天学习的是I2C通信实验,I2C是一种两线式串行总线,有数据线SDA和时钟线SCL构成,可发送和接收数据,属于半双工通信。由于要有相同的时钟源,一般用于板内通信。
I2C有几个比较重要的状态:1)空闲状态,即两条线都拉高。2)起始信号:当SCL为高时SDA从高到低的跳变,停止信号:当SCL为高时,SDA从低到高的跳变。3)应答信号:每当发送器发送一个字节的数据时,在第九个脉冲,接收器会反馈一个应答信号ACK,低电平。如果接收器是主控器,则会发送一个非应答信号NACK,高电平,以通知发送方结束数据发送。4)数据有效性:数据必须在SCL的上升沿之前就准备好,并在SCL的下降沿结束前保持稳定。
iic头文件
SDA线需要发送数据和接收数据,所以在发送数据时设为输出模式,接受数据时设为输入模式。
前面这几条是根据通信协议写的
这里使用I2C与E2PROM(电子可擦除可编程只读存储器)进行通信,可以读写E2PROM。地址位有三个,一个芯片最多能与2^3=8个E2PROM通信,这里将三个地址引脚接地,它的地址就为0。写保护引脚高电平有效(禁止写,只读),低电平失效。
设备码,读最低位为1,写最低位为0
根据24C02写的读时序,先是发送起始信号,然后发送设备码0xA0,返回ACK,发送地址,返回ACK,发送起始信号,发送设备码0xA1,返回ACK,读取数据,发送停止信号。
根据24C02写的写时序,先是发送起始信号,然后发送设备码0xA0,返回ACK,发送地址,返回ACK,发送字节,返回ACK,发送停止信号。
检测24C02是否正常,通过在地址255写一个0x55,来判断24C02是否就绪,如果否的话主函数会不断地循环显示检测失败。今天晚上写的程序在等待应答那部分,还没将SDA设为输入模式,就将SCL拉高,导致返回ACK失败,程序一直卡在检测不到24C02的循环部分。找了一小时的bug,终于找到了。欣喜若狂!