fancery
驱动牛犊
驱动牛犊
  • 注册日期2003-07-24
  • 最后登录2005-09-07
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1930回复:5

vxworks(for ppc)下的FLASH驱动问题!请高手支招!

楼主#
更多 发布于:2003-08-29 18:55
背景:
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中的操作,请教大虾们如何解决这个问题!!!
seven
驱动小牛
驱动小牛
  • 注册日期2001-04-03
  • 最后登录2007-03-28
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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 类型
我爱中医:http://www.ngotcm.com/forum/index.php
sataotao
驱动牛犊
驱动牛犊
  • 注册日期2003-10-04
  • 最后登录2004-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-04 14:31
有3点需要注意
1. flash操作序列执行完后,一定要加入延迟
   例如,for(i=0; i<FLH_DELY; i++);

2. 写flash一定要记得读回,看写成功没有

3. 一定要记得关闭data cache
jyc_1
驱动小牛
驱动小牛
  • 注册日期2003-09-13
  • 最后登录2009-01-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望110点
  • 贡献值0点
  • 好评度110点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-04 16:20
不同的flash可能使用方法不太一样,写flash不一定要关闭cache!
pshong
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2007-05-11
  • 粉丝0
  • 关注0
  • 积分-5分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-20 18:42
延时加上,保证延时充分,就应该没有问题了!至于回读,也就是测试时,或特别重要的数据(且数据量小)才用。平常没有必要的。
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-07 12:02
请教一下如何关data cache?
有了驱动,人才有了力量。
游客

返回顶部