完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
关于裸板程序nandflash中:首先是光盘的代码和备注:
col = addr & NAND_BLOCK_MASK_LP; page = addr / NAND_SECTOR_SIZE_LP; *p = col & 0xff; /* Column Address A0~A7 */ for(i=0; i<10; i++); *p = (col >> 8) & 0x0f; /* Column Address A8~A11 */ for(i=0; i<10; i++); *p = page & 0xff; /* Row Address A12~A19 */ for(i=0; i<10; i++); *p = (page >> 8) & 0xff; /* Row Address A20~A27 */ for(i=0; i<10; i++); *p = (page >> 16) & 0x03; /* Row Address A28~A29 */ for(i=0; i<10; i++); 我个人的理解: 我修改后的代码和备注: *p = col & 0xff; /* Column Address A0~A7 */ for(i=0; i<10; i++); *p = (col >> 8) & 0x07 ; /* Column Address A8~A10 */ for(i=0; i<10; i++); *p = page & 0xff; /* Row Address A11~A18 */ for(i=0; i<10; i++); *p = (page >> 8) & 0xff; /* Row Address A19~A26 */ for(i=0; i<10; i++); *p = (page >> 16) & 0x03; /* Row Address A27~A28 */ for(i=0; i<10; i++); 又仔细看了一下视频:视频上讲的时候nandflash用到了两个型号的文档,代码是按照K9k4G08U1M写的,按照K9k4G08U1M来写的话应该是: *p = col & 0xff; /* Column Address A0~A7 */ for(i=0; i<10; i++); *p = (col >> 8) & 0x07 ; /* Column Address A8~A10 */ for(i=0; i<10; i++); *p = page & 0xff; /* Row Address A11~A18 */ for(i=0; i<10; i++); *p = (page >> 8) & 0xff; /* Row Address A19~A26 */ for(i=0; i<10; i++); *p = (page >> 16) & 0x01; /* Row Address A27 */ for(i=0; i<10; i++); 给的光盘上的nandflash是K9F2G08U0C,在问了群里答疑说就是这个,按照这个的写地址顺序改的话应该是: *p = addr & 0xff; /* Column Address A0~A7 */ for(i=0; i<10; i++); *p = (addr >> 8) & 0x0f; /* Column Address A8~A11 */ for(i=0; i<10; i++); *p = (addr >> 12) & 0xff; /* Row Address A12~A19 */ for(i=0; i<10; i++); *p = (addr >> 20) & 0xff; /* Row Address A20~A27 */ for(i=0; i<10; i++); *p = (addr >> 28) & 0x01; /* Row Address A28 */ for(i=0; i<10; i++); 今天晚上回去看看 板子到底用的那个型号的nandflash? |
|
相关推荐
6个回答
|
|
不管使用哪一个型号的NAND,我们只需要关心2个问题:
1.page多大? 2.发出的地址序列有多少个:多少个col地址、多少个row地址 以K9F2G08U0C为例,它的芯片手册里: 页大小是2048, 2个col地址、3个row地址,那么对于地址addr,就可以这样发出地址: int col = addr & 2047; int row = addr / 2048; *p = col & 0xff; *p = (col>>8) & 0xff; *p = row & 0xff; *p = (row >>8) & 0xff; *p = (row >>16) & 0xff; 我们根本不关心它发出的是a8-a10还是a8-a11: 当页大小是2048时,col需要11位来表示,即a0-a10,所以第二次发出col地址时,发出的是a8-a10; 当页大小是4096时,col需要12位来表示,即a0-a11,所以第二次发出col地址时,发出的是a8-a11; |
|
|
|
如果按上面的图:2nd Cycle是A8-A11
那下面这段代码应该有错吧 int col = addr & 2047; *p = col & 0xff; //这里是对的,A0-A7 *p = (col>>8) & 0xff; //这里就错了,只发送了A8-A10,而实际要发A8-A11的吧 我不清楚是不是我哪里理解错了。 正常代码不应该是如下的吗: int col = addr & 4095; *p = col & 0xff; //这里是对的,A0-A7 *p = (col>>8) & 0xff; |
|
|
|
|
|
|
|
*p = (col>>8) & 0xff; 发出的是8位的地址数据,a8-a15;
对于page = 2048的nand flash,a8-a10含有有效数据,a11-a15恒为0 对于page = 4096的nand flash,a8-a11含有有效数据,a12-a15恒为0 不用再管那些注释 |
|
|
|
*p = (col>>8) & 0xff; //这里就错了,只发送了A8-A10,而实际要发A8-A11的吧
有什么错呢?它发出的是a8-a15,不涉及的位是0而已 ------------------------------------------ int col = addr & 2047; 要结合上面这句的,才能看出*p = (col>>8) & 0xff; 这句是错的 ------------------------------------------ addr & 2047 相当于只保留bit0~bit10,也就是只保留了A0~A10,注意这里A11是被直接清0了。 之时col & 0xff; 发送的是A0~A7,没错 之后 (col>>8) & 0xff; 应该只发送了A8~A10 ------------------------------------------ 如果addr & 4095 那相当于保留了bit0~bit11,注意这里A11是会保留。 ------------------------------------------ 不清楚我有没有理解错 |
|
|
|
我知道我们的理解在哪里出错了,
1.NAND的访问有2个地址:col地址、row地址 2. col地址分为2个地址周期发出去,有A0-A15,标为: Acol0-Acol15 3. row地址分为3个地址周期发出去,有A0-A23,标为:Arow0-Arow23 我们不要混淆Acol与Arow了。 对于一个给定的addr, col = addr % PAGE_SIZE,我们要发出去16位,恰好,注意了,只是恰好,这低10位或低11位,跟addr里的低10位、低11位恰好相同;而Acol12, 13, 14等等恒为0,跟addr的bit12,13无关 |
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2187 浏览 6 评论
1987 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4545 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 22:30 , Processed in 1.956493 second(s), Total 89, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号