学习STM32F1固件库利用IIC与EEPROM通信中CheckEvent()与GetFlagStatus()区别整理
我在学习中遇到的问题
在我学习STM32库函数的IIC库,利用库函数写完发送和接收函数后。在主函数中调用发现结果与我的预期不一致。
找到解决方案后发现在单纯IIC检测(只发送地址)时,无法使用CheckEvent()函数检测IIC通信状态。
初始函数
EEPROM工作时序
这是EEPROM数据手册提供的写时序:
图中可以看出写一字节与按页写入基本一致的。
值得注意的是按页写入时每次最多可以写入八字节数据,这与EEPROM存储方式有关。
读时序:
若MCU按照如上方式发送数据,EEPROM只会输出“当前”内存地址的数据。
若想要自己定义输出起始地址,则需要按照如下方式读取。
IIC收发函数
注:图中函数比较简单并没有进行超时检测,后期可以自己补充完整。
//发送一个字节数据
void EEPROM_Byte_Write(uint8_t addr,uint8_t data)
{
I2C_GenerateSTART(EEPRON_I2C,ENABLE);//产生起始信号
while(I2C_CheckEvent(EEPRON_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR); //检测到EV5事件
I2C_Send7bitAddress(EEPRON_I2C,EEPROM_ADDR,I2C_Direction_Transmitter);
while(I2C_CheckEvent(EEPRON_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);
I2C_SendData(EEPRON_I2C,addr); //发送EEPROM存储地址
while(I2C_CheckEvent(EEPRON_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTING)==ERROR);
I2C_SendData(EEPRON_I2C,data); //发送数据
while(I2C_CheckEvent(EEPRON_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
I2C_GenerateSTOP(EEPRON_I2C,ENABLE);
}
//读出一个字节数据
void EEPROM_Read(uint8_t addr,uint8_t *data,uint8_t num)
{
I2C_GenerateSTART(EEPRON_I2C