哪位好心人解释下vivi 中的 nand_read_ll的NFADDR设置这段啊

wangxinxin999   2007-4-17 19:21 楼主
void nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
    int i, j;

    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
        return ; /* invalid alignment */
    }

    /* chip Enable */
    NFCONF &= ~0x800;
    for(i=0; i<10; i++);

    for(i=start_addr; i < (start_addr + size);) {
      /* READ0 */
      NFCMD = 0;

      /* Write Address */                               //这段是什么意思?
      NFADDR = i & 0xff;
      NFADDR = (i >> 9) & 0xff;
      NFADDR = (i >> 17) & 0xff;
      NFADDR = (i >> 25) & 0xff;

      wait_idle();

      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
*buf = (NFDATA & 0xff);
buf++;
      }
    }

    /* chip Disable */
    NFCONF |= 0x800; /* chip disable */

    return ;
}

回复评论 (5)

/* Write Address */                               //这段是什么意思?
      NFADDR = i & 0xff;
      NFADDR = (i >> 9) & 0xff;
      NFADDR = (i >> 17) & 0xff;
      NFADDR = (i >> 25) & 0xff;

i是一个三十二位数,按八位给截开...

有可能是存放还有点自己定义的因素
点赞  2007-4-17 19:36
NFADDR 是地址寄存器,像这样写,NFADDR 的值最后不就是只有这条语句
NFADDR = (i >> 25) & 0xff;
的值了吗?前面的那三条都没有用啊!
点赞  2007-4-17 19:41
NFADDR = (i >> 25) & 0xff;
的值了吗?前面的那三条都没有用啊!

有的器件是这样的,完成了一个读写,会自动跳指针,指向第一个存储空间,但是对上面的读写入口没变的
& 0xff;//感觉这个操作就是为了把i的低八位弄出来,然后弄到成八位的宽度...

当然,我没有你的硬件,我只是相当然,仅供参考
点赞  2007-4-17 19:49
基本上弄明白了,应该就是每设置一次寄存器会跳一次,每次写8位,但是NFADDR = (i >> 9) & 0xff;很奇怪,有的文章说是根据芯片的定义右移了9位,但是这样不是有位丢失了吗?
点赞  2007-4-17 21:23
根据芯片手册,第8位没有使用。

问题解决完毕
点赞  2007-4-18 10:49
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复