背景:
有一个项目用到STM32F091芯片去读取 AT24C512C-SSHD EEPROM 芯片,我直接移植了之前项目的IIC库,结果程序运行后,读不出EEPROM里面的数据。
摘要:
本文主要介绍一个基于STM32F091芯片和AT24C512C-SSHD EEPROM芯片的项目,该项目旨在读取EEPROM芯片中的数据。我直接移植了之前项目的库,但是遇到了读不出EEPROM数据的问题。本文记录了问题的发型与排查过程。
运行开发环境介绍
|--------|--------------------------|
| 硬件环境 | STM32F091CBT6 J-LINK V11 |
| 软件开发环境 | IAR 8.32.1 VSCODE |
| 软件支持包 | ST HAL 库 |
正文:
来到新公司后接了一个项目,用到STM32F091芯片去读取 AT24C512C-SSHD EEPROM 芯片,我直接移植了之前项目的IIC驱动库,结果程序运行后,读不出EEPROM里面的数据。
解决方法:
1.单步仿真,在IIC驱动部门的SCL和SDA 拉高和拉低之后打断点,然后单步运行,用万用表测量电压,看SCL 和SDA线的电平变化是否正常。
2.重新查看EEPROM芯片数据手册,搜索定位问题。
实验结果:
解决方法1:
单步仿真,用电压表量电压,发现电压变化正常。
解决方法2:
重新查看数据手册,发现了下面的东东:
大体意思就是说, AT24C512C Device Address 的地址字中
A0 A1 A2 代表着EEPROM芯片的IIC通讯地址。
而且设备地址的LSB最后一位还代表着不同的读写模式。
再看一下我的电路图,可以看到,我的电路中A0是1,A1 A2 为 0
可以看到我发送的器件地址为 0xA0,这就是因为我直接用的之前AT24C512 的 IIC 驱动库,没有注意到芯片的地址是可更改的。
所以程序中应该将地址改为:0xA8
容易踩的坑:
AT24C系列EEPROM的IIC通讯器件地址是可以硬件配置的!
移植原有代码的时候,特别是像我这样跳槽了后注意不同硬件设计人员的设计习惯不一样!