以前用51驱动AT24C02觉得挺简单,这次用stm32,感觉好吃力。
以下等待AT24C02 写入数据的代码,原理是利用AT24C02 写数据时不会响应stm32
1: void I2C_EE_WaitAT24C02(void)
2: {
3: do
4: {
5: I2C_GenerateSTART(I2C1, ENABLE); //起始I2C1
6: // while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //先后读SR1的第0位和SR2 的第0和第1位,相应位都置1则进入下条指令,否则循环等待
7: while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0001)); //只读SR1的第0位置1则进入下条指令,否则循环等待
8: I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter); //写入 EEPROM地址,等待AT24C02响应
9: if(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0400) //判断AF是否置1,置1则表示未响应,进入条件语句
10: { 11: I2C_GenerateSTOP(I2C1, ENABLE); //未响应,则结束I2C1
12: I2C_ClearFlag(I2C1, I2C_FLAG_AF); //未响应,清除AF位
13: }
14: }
15: while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002)); //读SR1的第1位,即ADDR,置1代表AT24C02响应,结束等待,否则回到函数初始继续等待。
16: I2C_GenerateSTOP(I2C1, ENABLE); //停止I2C1
17: }
一开始,我的程序是没有第7行,一直跳不出函数。当把第6行取消后,程序就不会卡死了。后来发现,原来只要读SR2,程序就会卡死,即ADDR一直为0。
实在想不明白为什么。求指点,谢谢。
参考手册中的相关资料:
|