温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

EEPROM @ 0x50 read FAILED!!! -------dm6467 uboot中eeprom相关问题

发布时间:2020-07-15 13:00:29 来源:网络 阅读:1505 作者:风尚love 栏目:开发技术

   当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 处介绍得知其设备地址结构如下:

EEPROM @ 0x50 read FAILED!!! -------dm6467 uboot中eeprom相关问题

提示:此处宏不设置成 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()两个

函数中的适当位置加些延时即可。


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI