完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我看到这个版面很多朋友在问OK6410的2G MLC NAND问题,在第15和16个实验那过不去了。我这两天也在调试这个问题,终于通过了。跟大家分享一下。
主要注意点有三个: 1.时间参数需要更改一下,可以都设置为7 /* 设置时间参数 */ #define TACLS 0 #define TWRPH0 2 #define TWRPH1 1 2.6410中,nand里面的前4页,每页只存了2k,所以读的时候需要注意 3.当然了,将程序烧入nand时也需要注意第2点了,在ok6410可以用命令nand write.uboot命令来做,这个命令会在前面4页的时候,只写入2k的数据。 附上代码,虽然代码不太严谨,但可以参考
#define MEM_SYS_CFG (*((volatile unsigned long *)0x7E00F120)) #define NFCONF (*((volatile unsigned long *)0x70200000)) #define NFCONT (*((volatile unsigned long *)0x70200004)) #define NFCMMD (*((volatile unsigned long *)0x70200008)) #define NFADDR (*((volatile unsigned long *)0x7020000C)) #define NFDATA (*((volatile unsigned char *)0x70200010)) #define NFSTAT (*((volatile unsigned long *)0x70200028)) void nand_select(void) { NFCONT &= ~(1<<1); } void nand_deselect(void) { NFCONT |= (1<<1); } void nand_cmd(unsigned char cmd) { NFCMMD = cmd; } void nand_addr(unsigned char addr) { NFADDR = addr; } unsigned char nand_get_data(void) { return NFDATA; } void nand_send_data(unsigned char data) { NFDATA = data; } void wait_ready(void) { while ((NFSTAT & 0x1) == 0); } void nand_reset(void) { /* ???D */ nand_select(); /* ·¢3?0xff?üá? */ nand_cmd(0xff); /* μè?y?íD÷ */ wait_ready(); /* è??????D */ nand_deselect(); } void nand_init(void) { /* è?xm0csn2ó?×÷nand flash cs0 ????òy?? */ MEM_SYS_CFG &= ~(1<<1); /* éè??ê±??2?êy */ #define TACLS 0 #define TWRPH0 2 #define TWRPH1 1 NFCONF &= ~((1<<30) | (7<<12) | (7<<8) | (7<<4)); NFCONF |= ((TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4)); /* ê1?ünand flash controller */ NFCONT |= 1; NFCONT &= ~(1<<16); /* é-?1soft lock */ nand_reset(); } void nand_send_addr(unsigned int addr) { #if 1 unsigned int page = addr / 4096; unsigned int colunm = addr & (4096 - 1); /* ?aá???μ??·±íê??óò3?ú??à??aê? */ nand_addr(colunm & 0xff); nand_addr((colunm >> 8) & 0xff); /* ????èy??μ??·±íê???ò?ò3 */ nand_addr(page & 0xff); nand_addr((page >> 8) & 0xff); nand_addr((page >> 16) & 0xff); #else nand_addr(addr & 0xff); /* a0~a7 */ nand_addr((addr >> 8) & 0x1f); /* 3ìDòμ????è: a8~a12 */ nand_addr((addr >> 13) & 0xff); /* 3ìDòμ????è: a13~a20 */ nand_addr((addr >> 21) & 0xff); /* 3ìDòμ????è: a21~a28 */ nand_addr((addr >> 29) & 0x7); /* 3ìDòμ????è: a29 ~ */ #endif } int nand_read(unsigned int nand_start, unsigned int ddr_start, unsigned int len) { unsigned int addr = nand_start; int i = nand_start % 4096; int left = i; int count = 0; unsigned char *dest = (unsigned char *)ddr_start; unsigned char data = 0; /* ???DD??? */ nand_select(); while (count < len) { /* ·¢3??üá?0x00 */ nand_cmd(0x00); /* ·¢3?μ??· */ nand_send_addr(addr); /* ·¢3??üá?0x30 */ nand_cmd(0x30); /* μè?y?íD÷ */ wait_ready(); /* ?áêy?Y */ for (; i < (4096-left) && count < len; i++) { data = nand_get_data(); if(addr<16384) { if(i<(2048-left)) { dest[count++] = data; } } else { dest[count++] = data; } //dest[count++] = nand_get_data(); addr++; } i = 0; left = i; } /* è??????? */ nand_deselect(); return 0; } int nand_erase_block(unsigned long addr) { int page = addr / 4096; nand_select(); nand_cmd(0x60); nand_addr(page & 0xff); nand_addr((page >> 8) & 0xff); nand_addr((page >> 16) & 0xff); nand_cmd(0xd0); wait_ready(); nand_deselect(); } int nand_write(unsigned int nand_start, unsigned char * buf, unsigned int len) { unsigned long count = 0; unsigned long addr = nand_start; int i = nand_start % 4096; int left = i; nand_select(); while (count < len) { nand_cmd(0x80); nand_send_addr(addr); for (; i < (4096-left) && count < len; i++) { if(addr<16384) { if(i<(2048-left)) { nand_send_data(buf[count++]); } } else { nand_send_data(buf[count++]); } //nand_send_data(buf[count++]); addr++; } nand_cmd(0x10); wait_ready(); i = 0; left = i; } nand_deselect(); } int copy2ddr(unsigned int nand_start, unsigned int ddr_start, unsigned int len) { int ret; /* 3?ê??ˉnand flash controller */ nand_init(); /* ?ánand flash */ ret = nand_read(nand_start, ddr_start, len); return ret; } |
|
相关推荐
14个回答
|
|
必须精华!
|
|
|
|
回复 1楼CAPCHER0110的帖子
兄弟,想跟你探讨下。nand flash地址发送为什么是: nand_addr(addr & 0xff); /* a0~a7 */ nand_addr((addr >> 8) & 0x1f); /* 3ìDòμ????è: a8~a12 ,使用了地址A12,这岂不访问到了NAND flash的 OOB空间了?*/ nand_addr((addr >> 13) & 0xff); /* 3ìDòμ????è: a13~a20 */ nand_addr((addr >> 21) & 0xff); /* 3ìDòμ????è: a21~a28 */ nand_addr((addr >> 29) & 0x7); /* 3ìDòμ????è: a29 ~ */ 我觉得地址应该是: nand_addr(addr & 0xff); /* a0~a7 */ nand_addr((addr >> 8) & 0xf); /* 程序的角度: a8~a11 */ nand_addr((addr >> 12) & 0xff); /* 程序的角度: a12~a19 */ nand_addr((addr >> 20) & 0xff); /* 程序的角度: a20~a27 */ nand_addr((addr >> 28) & 0xff); /* 程序的角度: a28 ~ */ addr是我们程序发出的地址,对于程序发出的地址而言,连续的这32为地址只想访问nand flash每页的前4k,而不想访问每页的OOB区域,也就是说程序所发出的地址根本就不包括NAND FLASH列地址的A12位。 不知道我的理解是否正确? |
|
|
|
楼主你好 我也为了这个问题搞了一周了,按你的方法改了nand。c 。结果还是无法启动!在uboot下写nand的时候用此种方法写:tftp c0008000 uart.bin nand erase 0 nand write c0008000 0 1000 nand write c0008800 1000 1000 。。。 nand write c000a000 4000 100000最后还是启动不起来,气死我了。楼主你有打包好改好的nand15th源码么。
|
|
|
|
我用的write.uboot命令直接写进去的,用的dnw的u***来烧的。附件代码给您参考
|
|
|
|
|
|
|
|
lz你能不能讲清楚一点啊!我下载了你的文件代码,你的这个代码编译过没有啊,我用dnw 5008000 下载uart.bin 然后nand erase 0 10000 擦除nandflash , nand write.uboot 50008000 0 100000 烧写。 最后还是启动不起来,你能不能将清楚一点啊,还有nand write.e 与nand write.uboot有什么本质区别啊, 我用的nandflash里面的uboot!
可否留下QQ 讨论一下啊,我发现了新的问题!谢谢啊! |
|
|
|
lz为什么我把uart.bin改名u-boot.bin然后放入SD卡,一键烧写就可以啊!用dnw 5008000 下载uart.bin 然后nand erase 0 10000 擦除nandflash , nand write.uboot 50008000 0 100000 烧写 就不行啊! 楼主你的烧写方法是什么啊,可否详细讲解一下啊!急需啊,谢谢。希望这贴可以成为精华贴!
|
|
|
|
你好楼主我看你这段代码擦除块那段的时候还是有些不解,请教下 nand_addr(page & 0xff); nand_addr((page >> 8) & 0xff); nand_addr((page >> 16) & 0xff); 第三个周期的地址发送nand_addr((page >> 16) & 0xff); 看芯片手册是A29-A31位啊 应该3位啊,那3位的话应该这么写吧nand_addr((page >> 16) & 0x07); 但是为什么是nand_addr((page >> 16) & 0xff)呢??
|
|
|
|
楼主,是否可以加QQ指导下,我也卡在这里了............
|
|
|
|
QQ1187128247
|
|
|
|
|
|
|
|
用了楼主的代码 还是没成功
我也不知道 那里错了 halt后 pc没进入ddr运行 还是0x00000.... 感觉nand_send_addr 和coy2ddr可能有些问题阿 |
|
|
|
学习中。。。
|
|
|
|
tiny6410按照修改实验成功~~!
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2188 浏览 6 评论
1988 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4545 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 15:01 , Processed in 1.042325 second(s), Total 103, Slave 84 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号