|
代码贴着如下:
#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读命令字,所以就加上了这三句。这一点还不是太明白,希望有人赐教。 |
|