目录
I2C协议
E2PROM AT24C02
I2C协议
假设主设备想要向从设备发送数据:
1. 主发送器发送START条件并寻址从接收器
2. 主发送器将数据发送到从接收器
3. 主发送器以STOP条件终止传输
如果主设备想要从从设备接收/读取数据:
1. 主发送器发送START条件并寻址从接收器
2. 主接收器发送请求读取的寄存器
3. 主接收器从从发送器接收数据
4. 主发送器以STOP条件终止传输
SCL:串行时钟
SDA:串行数据线
启动和停止条件:
与主设备的I2C通信由主设备发送START条件启动,并由主设备发送STOP条件终止。 当SCL为高电平时,SDA线上由高到低的转换定义了START条件。 当SCL为高电平时,SDA线上由低到高的转换定义了STOP条件。
一个字节由SDA线上的8位组成,数据首先传输最高位(MSB),SDA线上的数据必须在时钟周期的高电平期间保持稳定,因为当SCL为高电平时数据线的变化被解释为控制命令(START或STOP)。要在SCL是高电平前操作SDA。
PB6 PB7引脚。
总结:
时钟信号SCL为高时,SDA必须保持稳定,SCL为低时,SDA才可以变化。
写数据时:SCL为低时,改变SDA。
读数据时:SCL为高时,读取IO电平。
E2PROM AT24C02
器件地址:1010000(R/W') 0xA0表示51向AT24C02写数据,0xA1表示51读AT24C02的数据。
WP:写入保护,当WP为高电平时,无法写入数据。
总共能存256个字节,写入周期5毫秒。
把资料包提供的I2C.c和I2C.h复制到文件里。
比赛中需要自己编写E2PROM的读写函数,记得声明:
//写24C02
void EEPROM_Write(u8 add,u8 dat)
{I2CStart(); I2CSendByte(0xa0); I2CWaitAck(); I2CSendByte(add); I2CWaitAck(); I2CSendByte(dat); I2CWaitAck(); I2CStop();HAL_Delay(5);
}
//读24C02
u8 EEPROM_Read(u8 add)
{u8 dat;I2CStart(); I2CSendByte(0xa0);I2CWaitAck(); I2CSendByte(add);I2CWaitAck(); I2CStart();I2CSendByte(0xa1); I2CWaitAck();dat = I2CReceiveByte(); I2CSendNotAck();I2CStop();return(dat);
}
E2PROM很多时候用来统计设备的开机次数: