官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 40|回复: 2

关于Nand Flash初始化

[复制链接]

4

主题

6

帖子

38

积分

新手上路

Rank: 1

积分
38
发表于 2020-1-26 23:24:09 | 显示全部楼层 |阅读模式
注意:如果点击空白处无法输入,则点击字会有输入提示符 | 则可以使用键盘进行输入!

此板块为  [ARM裸机加强版]
  • 问题所在章节:16课5节
  • 发生问题的运行环境:
  • 问题发生描述:
老师好!我的nand flash初始化代码如下:
  1. NFCONF &= ~(1 << 12);        //TACLS = 0
  2. NFCONF |= (1 << 8);                //10 * (TWRPH0 + 1) >= 12,TWRPH0取1
  3. NFCONF &= ~(1 << 4);        //10 * (TWRPH1 + 1)>= 5,TWRPH1取0
  4. NFCONT |= (1 << 0);                //nand flash controller enable
  5. NFCONT |= (1 << 1);                //disable chip select
  6. NFCONT |= (1 << 4);                //ECC initialized
复制代码
但是按照这个代码初始化后,读取操作正常没问题,烧写操作数据就无法烧写进去,将其替换为教程内的代码:
  1. #define  TACLS   0
  2. #define  TWRPH0  1
  3. #define  TWRPH1  0
  4. /*设置NAND FLASH的时序*/
  5. NFCONF = (TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4);
  6. /*使能NAND FLASH控制器,初始化ECC,禁止片选*/
  7. NFCONT = (1 << 4) | (1 << 1) | (1 << 0);
复制代码
所有操作都没有问题。

但是以上两个代码实现的效果应该是一样的呀,为什么会造成这样的差别呢?
望老师解答!谢谢!


  • 输出的错误信息:

回复

使用道具 举报

0

主题

35

帖子

106

积分

超级版主

Rank: 8Rank: 8

积分
106
发表于 7 天前 | 显示全部楼层
本帖最后由 百问网-周老师 于 2020-2-15 10:11 编辑

你的寄存器配置不正确,建议将其展开运算对比,如下所示:
/*
#define  NFCONF                   __REG(0x4E000000)  //NAND flash configuration
#define  TACLS   0
#define  TWRPH0  1
#define  TWRPH1  0

          0x4E000000 = 0100 1110 0000 0000 0000 0000 0000 0000‬
// CPU三星S3C2440A芯片手册.pdf  225页
NFCONF = (TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4);
        ==> NFCONF = (0 << 12) | (1 << 8) | (0 << 4);
        ==> NFCONF = ‭0‬ | 1000 0000 | 0
        ==> NFCONF = 0000‬ 0000‬ 0000‬ 0000‬ 0000‬ 0000 1000 0000

====================
NFCONF &= ~(1 << 12);  
        ==> NFCONF = NFCONF & ~(1 << 12);  
        ==> NFCONF = 0100 1110 0000 0000 0000 0000 0000 0000‬ & ~(1 0000 0000 0000)
        ==> NFCONF = 0100 1110 0000 0000 0000 0000 0000 0000‬ &   0 1111 1111 1111
        ==> NFCONF = 0100 1110 0000 0000 0000 1111 1111 1111
NFCONF |= (1 << 8);
        ==> NFCONF = 0100 1110 0000 0000 0000 1111 1111 1111 | 1 0000 0000
        ==> NFCONF = 0100 1110 0000 0000 0000 1111 1111 1111
NFCONF &= ~(1 << 4);
        ==> NFCONF = NFCONF &  ~(1 << 4);
        ==> NFCONF = 0100 1110 0000 0000 0000 1111 1111 1111 & 0 1111
        ==> NFCONF = 0100 1110 0000 0000 0000 1111 1111 1111
*/
我是百问网www.100ask.org答疑助手,有关站务问题请与我联系。
韦东山视频开发板购买店铺:https://100ask.taobao.com/
微信公众平台:baiwenkeji
回复 支持 反对

使用道具 举报

4

主题

6

帖子

38

积分

新手上路

Rank: 1

积分
38
 楼主| 发表于 7 天前 | 显示全部楼层
百问网-周老师 发表于 2020-2-15 10:06
你的寄存器配置不正确,建议将其展开运算对比,如下所示:
/*
#define  NFCONF                   __REG( ...

周老师你好,
你回复内容中,
第一种方法结果应该是1左移8位,所以应该是
==> NFCONF = 0000‬ 0000‬ 0000‬ 0000‬ 0000‬ 0001 0000 0000

第二种方法:
第一步应该是位与吧:

NFCONF &= ~(1 << 12);  
        ==> NFCONF = NFCONF & ~(1 << 12);  
        ==> NFCONF = 0100 1110 0000 0000 0000 0000 0000 0000‬ & ~(1 0000 0000 0000)
        ==> NFCONF = 0100 1110 0000 0000 0000 0000 0000 0000‬ &   0 1111 1111 1111
        ==> NFCONF = 0100 1110 0000 0000 0000 0000 0000 0000
NFCONF |= (1 << 8);
        ==> NFCONF = 0100 1110 0000 0000 0000 0000 0000 0000 | 1 0000 0000
        ==> NFCONF = 0100 1110 0000 0000 0000 0001 0000 0000
NFCONF &= ~(1 << 4);
        ==> NFCONF = NFCONF &  ~(1 << 4);
        ==> NFCONF = 0100 1110 0000 0000 0000 0001 0000 0000 & 0 1111
        ==> NFCONF = 0100 1110 0000 0000 0000 0001 0000 0000

所以两次计算结果差别只在高位出现差别,运算内容应该是没有问题的
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2020-2-22 10:48 , Processed in 0.090095 second(s), 12 queries , File On.

Powered by Discuz! X3.3 Licensed

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表