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 ;
}
/* Write Address */ //这段是什么意思?
NFADDR = i & 0xff;
NFADDR = (i >> 9) & 0xff;
NFADDR = (i >> 17) & 0xff;
NFADDR = (i >> 25) & 0xff;
i是一个三十二位数,按八位给截开...
有可能是存放还有点自己定义的因素
NFADDR 是地址寄存器,像这样写,NFADDR 的值最后不就是只有这条语句
NFADDR = (i >> 25) & 0xff;
的值了吗?前面的那三条都没有用啊!
NFADDR = (i >> 25) & 0xff;
的值了吗?前面的那三条都没有用啊!
有的器件是这样的,完成了一个读写,会自动跳指针,指向第一个存储空间,但是对上面的读写入口没变的
& 0xff;//感觉这个操作就是为了把i的低八位弄出来,然后弄到成八位的宽度...
当然,我没有你的硬件,我只是相当然,仅供参考
基本上弄明白了,应该就是每设置一次寄存器会跳一次,每次写8位,但是NFADDR = (i >> 9) & 0xff;很奇怪,有的文章说是根据芯片的定义右移了9位,但是这样不是有位丢失了吗?