天嵌 ARM开发社区

 找回密码
 注册
查看: 1894|回复: 4

norflash的读取ID问题

[复制链接]
有理想的咸鱼 发表于 2013-6-13 16:21:23 | 显示全部楼层 |阅读模式
本帖最后由 有理想的咸鱼 于 2013-6-17 18:37 编辑

读取ID的代码如下:
#define    flash_base        0x00000000
#define    CMD_ADDR0         *((volatile U16 *)((0x555<<1)+flash_base))
#define    CMD_ADDR1         *((volatile U16 *)((0x2AA<<1)+flash_base))
               
U16 manu_id;
U16 device_id;

Uart_Init( 0,115200 );
               
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x90;               
manu_id = (*(volatile U16 *)(flash_base+(0x00<<1)));
        
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x90;
device_id = *(volatile U16 *)(flash_base + (0x1<<1));
               
Uart_Printf("\nmanuf_id:0x%x-----device_id:0x%x\n",manu_id,device_id);

运行串口打印结果为:manuf_id:0x45-----device_id:0xea00
与EN29LV160AB的数据手册上都不一致,数据手册上为:7F与2249

然后我在代码中去掉了MMU_Init()函数,就会输出manuf_id:0x7f-----device_id:0xea00,manufacture ID对了,但device ID还是错的!!

求解,为什么???

--------------------------------------------------------分割线-------------------------------------------------------------
2013年6月17日结帖。
解决办法见5楼。
亚瑟王 发表于 2013-6-14 08:48:34 | 显示全部楼层
ID号,你用Jflash或H-Jtag开看吧,这个看到的ID才是真正的。
 楼主| 有理想的咸鱼 发表于 2013-6-15 13:44:57 | 显示全部楼层
亚瑟王 发表于 2013-6-14 08:48
ID号,你用Jflash或H-Jtag开看吧,这个看到的ID才是真正的。

经修改代码后,已经可以正确读取manufacturer ID以及Device ID,与数据手册上一致。
也谢谢亚瑟王的回答,我是在学习编写norflash的读写函数,所以就先写个读ID的函数试试。。。
亚瑟王 发表于 2013-6-17 08:51:35 | 显示全部楼层
有理想的咸鱼 发表于 2013-6-15 13:44
经修改代码后,已经可以正确读取manufacturer ID以及Device ID,与数据手册上一致。
也谢谢亚瑟王的回答 ...

好的,问题解决了就好。学会了发个总结的帖子,如何?
亲,记得将帖子类型改为“已解决”哦(请参考:http://www.armbbs.net/forum.php?mod=viewthread&tid=15200)。
 楼主| 有理想的咸鱼 发表于 2013-6-17 18:49:32 | 显示全部楼层
代码贴着如下:
#include "def.h"
#include "2440lib.h"

#define    flash_base        0x00000000
#define    CMD_ADDR0         *((volatile U16 *)((0x555<<1)+flash_base))
#define    CMD_ADDR1         *((volatile U16 *)((0x2AA<<1)+flash_base))

/*========================================================
读NORFLASH ID
========================================================*/
void nor_ReadID(void)
{
        U16 manu_id0;
        U16 manu_id1;
        U16 device_id;       
        CMD_ADDR0 = 0xaa;
        CMD_ADDR1 = 0x55;
        CMD_ADDR0 = 0x90;
                       
        manu_id0 = (*(volatile U16 *)(flash_base+(0x00<<1)));
        manu_id1 = (*(volatile U16 *)(flash_base+(0x100<<1)));
        device_id = *(volatile U16 *)(flash_base + (0x001<<1));
                       
        Uart_Printf("\nmanuf_id:0x%x%x-----0x%x\n",manu_id0,manu_id1,device_id);
               
        CMD_ADDR0 = 0xaa;
        CMD_ADDR1 = 0x55;
        CMD_ADDR0 = 0x90;
}

另外在主函数里去掉MMU_Init(),原因本人不知,MMU对flash的访问会造成什么样的影响以及解决办法我不知道,还望高手指教!

EN29LV160AB这个nor flash默认的是进入读状态,所以不需要输入读命令字,而ID命令字依次为(16bit):
        CMD_ADDR0 = 0xaa;
        CMD_ADDR1 = 0x55;
        CMD_ADDR0 = 0x90;
代码里调用一次后,flash进入读ID状态,再调用一下就取消读ID状态,所以导致我之前读deviceID错(见一楼代码),所以将其调到后面执行,这样就可以正确读取ID了,然后再调用flash读函数,可以正确读取flash内容。
感觉很奇怪,函数最后还得加上这么三句,但是感觉如果不加的话就不知道怎么取消读ID命令状态,而nor flash又没有专门的进入flash读命令字,所以就加上了这三句。这一点还不是太明白,希望有人赐教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-18 18:07 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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