阅读:1930回复:5
vxworks(for ppc)下的FLASH驱动问题!请高手支招!
背景:
cpu:8260 flash:hy29lv160 问题: 在对flash进行操作时,要先写如相应的指令序列,比如要对flash中的某个地址进行“program”操作(只能对一个字或者一个字节进行操作),先得发出如下指令序列: 1、往0xaaa(偏移地址)中写入0xaa; 2、往0x555中写入0x55; 3、往0xaaa中写入0xa0; 4、往被操作的地址中写入预定的数据; 在shell中直接敲入这些指令: (基地址为:0xff500000) -> d 0xff500010 ff500010: ffff ffff ffff ffff ffff ffff ffff ffff *................* (查看0xff500010的起始数据是0xffff) -> m 0xff500aaa ff500aaa: ffff-aaaa ff500aac: ffff-q value = 0 = 0x0 -> m 0xff500555 ff500554: ffff-5555 ff500556: ffff-q value = 0 = 0x0 -> m 0xff500aaa ff500aaa: ffff-a0a0 ff500aac: ffff-q value = 0 = 0x0 (发出“program”指令) -> m 0xff500010 ff500010: ffff-3333 ff500012: ffff-q value = 0 = 0x0 (修改0xff500010中的数据为0x3333) -> d 0xff500010 ff500010: 3333 ffff ffff ffff ffff ffff ffff ffff *33..............* (查看修改后的0xff500010中的数据,可以看到操作成功) 但是我在程序中写入这些指令并不能使数据写入,代码如下: *(unsigned short *)(0xff500aaa) = 0xaaaa; *(unsigned short *)(0xff500555) = 0x5555; *(unsigned short *)(0xff500aaa) = 0xaaaa; *(unsigned short *)(0xff500010) = 0x3333; 验证分析过后,怀疑shell中的指令超作并不是简单的读写,程序中的那几行代码并不能模仿shell中的操作,请教大虾们如何解决这个问题!!! |
|
沙发#
发布于:2003-09-12 14:35
这个程序我刚刚做过,问题是,写FLASH的时候要校验的,只有校验成功,才能认为写正确了;其实校验就是延时。当你写完立即就读,很有可能读出来错误值的。
好象你的FLASH 芯片和我的一样,我就将这段校验代码贴上来: /************************************************************************/ /* PROCEDURE: Check_Toggle_Ready */ /* */ /* During the internal program cycle, any consecutive read operation */ /* on DQ6 will produce alternating 0\'s and 1\'s (i.e. toggling between */ /* 0 and 1). When the program cycle is completed, DQ6 of the data will */ /* stop toggling. After the DQ6 data bit stops toggling, the device is */ /* ready for next operation. */ /* */ /* Input: */ /* Dst must already set-up by the caller */ /* */ /* Output: */ /* None */ /************************************************************************/ int Check_Toggle_Ready (WORD *Dst) { WORD PreData; WORD CurrData; BYTE Loop = TRUE; unsigned long TimeOut = 0; PreData = *Dst; PreData = PreData & 0x4040; while ((TimeOut< 0x07FFFFFF) && (Loop)) { CurrData = *Dst; CurrData = CurrData & 0x4040; if (PreData == CurrData) Loop = FALSE; /* ready to exit the while loop */ PreData = CurrData; TimeOut++; } return 0; } 这里WORD 是unsigned short 类型 |
|
|
板凳#
发布于:2003-10-04 14:31
有3点需要注意
1. flash操作序列执行完后,一定要加入延迟 例如,for(i=0; i<FLH_DELY; i++); 2. 写flash一定要记得读回,看写成功没有 3. 一定要记得关闭data cache |
|
地板#
发布于:2003-10-04 16:20
不同的flash可能使用方法不太一样,写flash不一定要关闭cache!
|
|
地下室#
发布于:2003-10-20 18:42
延时加上,保证延时充分,就应该没有问题了!至于回读,也就是测试时,或特别重要的数据(且数据量小)才用。平常没有必要的。
|
|
5楼#
发布于:2003-11-07 12:02
请教一下如何关data cache?
|
|
|