STM32使用硬件I2C读写AT24C02 EEPROM(二)
文章目录
- STM32使用硬件I2C读写AT24C02 EEPROM(二)
- 1、修改函数,多字节读写
- 输出效果:
- 调试 效果:
- 2、任意字节读写
- 调试效果,读写失败:
- 查找原因:
- 调试效果:
- 总结
- 源码链接,免费下载,如有问题欢迎指导
STM32使用硬件I2C读写AT24C02 EEPROM(二)
在STM32使用硬件I2C读写AT24C02 EEPROM(一)中我们读写了eeprom的一个字节,但是我们想要读写多个字节应该怎么办?
1、修改函数,多字节读写
HAL_I2C_Mem_Write
HAL_I2C_Mem_Read
对这个两个函数进行了封装
uint8_t at24cxx_read(uint16_t addr, uint8_t *pbuf, uint16_t datalen)
{
if(EE_TYPE < AT24C16)return HAL_I2C_Mem_Read(&hi2c2,AT24C02_ADDR_READ,addr,I2C_MEMADD_SIZE_8BIT,pbuf,datalen,1000);
elsereturn HAL_I2C_Mem_Read(&hi2c2,AT24C02_ADDR_READ,addr,I2C_MEMADD_SIZE_16BIT,pbuf,datalen,1000);
}
uint8_t at24cxx_write(uint16_t addr, uint8_t *pbuf, uint16_t datalen)
{
if(EE_TYPE < AT24C16)return HAL_I2C_Mem_Write(&hi2c2,AT24C02_ADDR_WRITE,addr,I2C_MEMADD_SIZE_8BIT,pbuf,datalen,1000);
elsereturn HAL_I2C_Mem_Write(&hi2c2,AT24C02_ADDR_WRITE,addr,I2C_MEMADD_SIZE_16BIT,pbuf,datalen,1000);
}
在main函数中while循环读写
输出效果:
读出来的结果都是0,读写失败
什么原因呢?查找资料写完不能马上读需要等待写完,很奇怪,所有加个延时吧
调试 效果:
可以了正常读写了
2、任意字节读写
那读写任意字节呢,多读写些字节
调试效果,读写失败:
什么情况,多读写了两位就不行了?
查找原因:
通过页写入每次只能最多写8个字节,要不就只能按一个字节写,尝试了几种方法最终还是以单个字节写的方式来改。
uint8_t at24cxx_hal_writeonebyte(uint16_t WriteAddr,uint8_t DataToWrite)
{
if(EE_TYPE < AT24C16)
return HAL_I2C_Mem_Write(&hi2c2,AT24C02_ADDR_WRITE,WriteAddr,I2C_MEMADD_SIZE_8BIT,&DataToWrite,1,1000);
else
return HAL_I2C_Mem_Write(&hi2c2,AT24C02_ADDR_WRITE,WriteAddr,I2C_MEMADD_SIZE_16BIT,&DataToWrite,1,1000);
}
uint8_t at24cxx_write(uint16_t addr, uint8_t *pbuf, uint16_t datalen)
{
while (datalen--)
{HAL_Delay(5);at24cxx_hal_writeonebyte(addr, *pbuf);addr++;pbuf++;}
}
调试效果:
总结
使用stm32 硬件i2c读写at24c02 芯片需要注意延时否则会锁死和多字节读写的限制,谨慎处理读写操作中的细节,可以有效解决通信中遇到的问题,确保数据的可靠存储和读取
源码链接,免费下载,如有问题欢迎指导
STM32使用硬件I2C读写AT24C02 EEPROM,实现任意字节读写