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

song x 2007-04-17 07:21:24
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 ;
}
...全文
444 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jlbo2004 2010-08-31
  • 打赏
  • 举报
回复
NFCMD = 0;

/* Write Address */
NFADDR = i & 0xff;
NFADDR = (i > > 9) & 0xff;
NFADDR = (i > > 17) & 0xff;
NFADDR = (i > > 25) & 0xff;
第八位是由NFCMD来决定的,不是没有用,其实也算是没用上吧,NFCMD = 0x00,A8为低电平,访问前256字节,NFCMD = 0x01时,A8为高电平,访问后256,否则的话有256个字节访问不到
song x 2007-04-18
  • 打赏
  • 举报
回复
根据芯片手册,第8位没有使用。

问题解决完毕
song x 2007-04-17
  • 打赏
  • 举报
回复
基本上弄明白了,应该就是每设置一次寄存器会跳一次,每次写8位,但是NFADDR = (i >> 9) & 0xff;很奇怪,有的文章说是根据芯片的定义右移了9位,但是这样不是有位丢失了吗?
lbing7 2007-04-17
  • 打赏
  • 举报
回复
NFADDR = (i >> 25) & 0xff;
的值了吗?前面的那三条都没有用啊!

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

当然,我没有你的硬件,我只是相当然,仅供参考
song x 2007-04-17
  • 打赏
  • 举报
回复
NFADDR 是地址寄存器,像这样写,NFADDR 的值最后不就是只有这条语句
NFADDR = (i >> 25) & 0xff;
的值了吗?前面的那三条都没有用啊!
lbing7 2007-04-17
  • 打赏
  • 举报
回复
/* Write Address */ //这段是什么意思?
NFADDR = i & 0xff;
NFADDR = (i >> 9) & 0xff;
NFADDR = (i >> 17) & 0xff;
NFADDR = (i >> 25) & 0xff;

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

有可能是存放还有点自己定义的因素

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧