当uboot启动时候,出现 "EEPROM @ 0x50 read FAILED!!! " 这样的错误提示,大体解决思路如下:
这个错误是在uboot执行board/davinci/dm6467_evm/dm6467_evm.c代码时候提示的,分析这个错
误所在代码得知,当uboot启动时候,通过i2c读取eeprom中0x7f00处6个字节(即MAC地址),读取失
败后会打印"EEPROM @ 0x50 read FAILED!!"错误提示,读取成功的话,先判断ethaddr参数是否为空
,若为空,将读到的6个字节MAC地址 setenv ethaddr。
之所以读取失败,最大的原因是i2c中eeprom设备地址有问题,这得根据具体硬件原理图分析得知。
配置eeprom设备地址等相关信息在include/configs/davinci_dm6467_evm.h文件中:
60 /*====================================================*/
61 /* EEPROM definitions for EEPROM */
62 /*====================================================*/
63 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
64 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
65 #define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 6
66 #define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 20
提示:打印的错误提示"EEPROM @ 0x50 read FAILED!!"中的 50 就是此处
定义的宏 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50
其中 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2 意思如下(参考common/cmd_eeprom.c):
129 /*-----------------------------------------------------------------------
130 *
131 * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 2 (16-bit EEPROM address) offset is
132 * 0x000nxxxx for EEPROM address selectors at n, offset xxxx in EEPROM.
133 *
134 * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 1 (8-bit EEPROM page address) offset is
135 * 0x00000nxx for EEPROM address selectors and page number at n.
136 */
如何得知该宏CONFIG_SYS_I2C_EEPROM_ADDR_LEN设置成 1 还是 2 ,可以从数据手册中相关
介绍得知,以ATC24C512为例子,从其数据手册中Memory Organization 处介绍可以得知,此处宏
应该设置成 2。
其中 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x50 ,该宏意思是设备地址,以ATC24C512
为例子,从其数据手册中Device Adress 处介绍得知其设备地址结构如下:
提示:此处宏不设置成 0xa0 是因为该宏设置的值是取其高7位。
如何得知该宏 CONFIG_SYS_I2C_EEPROM_ADDR 的值设置成多少了,先从数据手册中分析下引脚
信息,在根据具体电路原理图具体设置,若A0接低电平,A1接高电平,则设置成0x52 。
其中 #define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 6,该宏设置的值与eeprom芯片的
Page Write Mode 多少有关,可以从数据手册中 Features 处可以知道。若为 16 Page Write Mode,
则设置成 4,若为 64 Page Write Mode,则设置成 6,若为 128 Page Write Mode,则设置成 7,
看出规律来了吧,2 的 n 次方,n 即为设置的值。(俺在这个宏纠结过一段时间才得知)
其中 #define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 20,从其字面可以看出是延时时间。
本人在启动uboot时候遇到 "EEPROM @ 0x50 read FAILED!!!" 这个错误提示,就是根据我的
板子上AT24C512芯片相关电路,得知其设备地址是0x52,CONFIG_SYS_EEPROM_PAGE_WRITE_BITS应该
设置成 7,因为是 128 Page Write Mode,而我的uboot源码中默认的设备地址是0x50,
CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 默认的是 6 。所以当通过 i2c 读取eeprom设备时候,由于
设备地址有误,就会报此错误信息。
当上面配置正确后,eeprom读写可能还有一种情况出现,就是读写eeprom时候,读的值读不出
来,写的值写不进去。这种情况,经一个前辈指导得知跟i2c时序有关系,主要是因为i2c标准时序
是飞利浦的专利,其他公司在用的时候,会将时序适当改下,以免侵权。而 uboot 源码中i2c的相
关的代码是根据其标准时序编写的。
因此,只要将其时序适当调整下即可,具体代码解决方法:在i2c_read()和i2c_write()两个
函数中的适当位置加些延时即可。
转载于:https://blog.51cto.com/limingshang/1281043