BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #3501同步于 2009/1/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

uboot移植flash问题

DGrayman
2009/1/7镜像同步12 回复
硬件上由于44B0地址线A1与SST39VF1601地址线A0连接,因此这个地址要左移1位: 所以我修改为 #define CFG_FLASH_ADDR0 (0x5555<<1)/* 1st address for flash config cycles */ #define CFG_FLASH_ADDR1 (0x2AAA<<1)/* 2nd address for flash config cycles */ 这时结果出错: Unknown flash on bank 0 如果不修改的话,就正常 这是为什么呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
hobby机器人#1 · 2009/1/7
你说地址线A1与flash芯片的A0连接?是不是说反了? 我们虽然不是这个板子,但是我们板子上是CPU的A0和flash的A1连接的。因为flash工作于x16模式,因此flash的A0可以不用(A0用于x8模式下Byte选择) 这个再查查原理图对照一下吧。 至于你说的出错“Unknown flash”,可能是由于flash基地址配置错误后,无法正确的读到flash的CHIPID,因此flash驱动报错说型号不明。
DGrayman机器人#2 · 2009/1/8
我查过电路图了,确实是CPU的A1连接flash的A0; 而之所以没有左移我也弄懂了,原因如下: #define CFG_FLASH_WORD_SIZE unsigned short volatile CFG_FLASH_WORD_SIZE *addr2 = (CFG_FLASH_WORD_SIZE *)addr; addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA; 因为使用了指针,就巧妙地进行了移位处理,也更加便于移植。
lester98机器人#3 · 2009/1/8
【 在 DGrayman 的大作中提到: 】 : 硬件上由于44B0地址线A1与SST39VF1601地址线A0连接,因此这个地址要左移1位: : 所以我修改为 : #define CFG_FLASH_ADDR0 (0x5555<<1)/* 1st address for flash config cycles */ : ................... 地址是不需要偏移的,空出来一个地址就是为了字节对齐,比如这个图里的,用一个地址读出的数据是32位(正常一个地址对应一个字节,也就是8位),因此地址线要空两位,保证地址+4的时候再读下32位(也就是下四个字节),你偏移了反而没有这种效果了 flash的A0确实总是空着的,不知道为什么,不要想当然认为cpu和flash的地址线是0-0 1-1这样对样的,完全不是这样的.
lester98机器人#4 · 2009/1/8
【 在 DGrayman 的大作中提到: 】 : 我查过电路图了,确实是CPU的A1连接flash的A0; : 而之所以没有左移我也弄懂了,原因如下: : #define CFG_FLASH_WORD_SIZE unsigned short : ................... 你的说明我怎么看不懂?
proakis机器人#5 · 2009/1/8
由于SST39VF1601每个可寻址的单元是16位的,即2字节,而CPU一个地址对应的是一个字节,所以CPU的A1应该接Flash的A0,即CPU访问两个连续的两个字节对于SST39VF1601来说实际上是一个单元,字节的区分只有靠字节屏蔽引脚或软件来处理了。在CPU编程方面其实是透明的,这只是硬件设计人员应该考虑的问题。 不知这样的回答楼主是否满意?
hobby机器人#6 · 2009/1/8
【 在 DGrayman 的大作中提到: 】 : 我查过电路图了,确实是CPU的A1连接flash的A0; : 而之所以没有左移我也弄懂了,原因如下: : #define CFG_FLASH_WORD_SIZE unsigned short : ................... 这个“而之所以没有左移我也弄懂了,原因如下:”,我翻来覆去看了3遍才大概看明白你的意思。 你是说,CFG_FLASH_ADDR0作为下标使用,实际访问的地址换算时需要乘2(因为是short类型的),也就相当于左移一位了。 因此CPU的A1接在flash的A0上也就说的通了:由于使用short类型指针进行操作,总线地址变化的颗粒度总是2字节,于是CPU的A0也就不要了。 没理解错吧?
DGrayman机器人#7 · 2009/1/8
【 在 proakis 的大作中提到: 】 : 由于SST39VF1601每个可寻址的单元是16位的,即2字节,而CPU一个地址对应的是一个字节,所以CPU的A1应该接Flash的A0,即CPU访问两个连续的两个字节对于SST39VF1601来说实际上是一个单元,字节的区分只有靠字节屏蔽引脚或软件来处理了。在CPU编程方面其实是透明的,这只是硬件设计人员应该考虑的问题。 : 不知这样的回答楼主是否满意? 同意这个说法;也就是因为这样,所以我开始就认为应该对擦写指令地址要左移一位,这样正好对准flash的地址指令,也因此将include/configs/myboard.h中的读写指令修改成: #define CFG_FLASH_ADDR0 (0x5555<<1) 但是后来发现,在访问flash时是用这种下面所示的方式访问的: addr2[CFG_FLASH_ADDR0] = (CFG_FLASH_WORD_SIZE)0x00AA; 原以为这个时侯CPU的地址线信号为addr2+CFG_FLASH_ADDR0,其实不然,这个时候地址线信号应该为 addr2+CFG_FLASH_ADDR0<<1
DGrayman机器人#8 · 2009/1/8
【 在 hobby 的大作中提到: 】 : 这个“而之所以没有左移我也弄懂了,原因如下:”,我翻来覆去看了3遍才大概看明白你的意思。 : 你是说,CFG_FLASH_ADDR0作为下标使用,实际访问的地址换算时需要乘2(因为是short类型的),也就相当于左移一位了。 : 因此CPU的A1接在flash的A0上也就说的通了:由于使用short类型指针进行操作,总线地址变化的颗粒度总是2字节,于是CPU的A0也就不要了。 : ................... 就是这个意思,也就是说CPU的A0线未接,也就是一个地址对应着一个16bit,对吗? 这样的话,软件中访问0x0000_0000,将能读到一个16bit的数据么?
lester98机器人#9 · 2009/1/8
【 在 DGrayman 的大作中提到: 】 : 就是这个意思,也就是说CPU的A0线未接,也就是一个地址对应着一个16bit,对吗? : 这样的话,软件中访问0x0000_0000,将能读到一个16bit的数据么? 根据你接了多少根数据线,8位数据线就不需要偏移,16位数据线a0就空着,32位数据线a0 a1都要空着