mini2440开发板上带有2M的norflash,norflash可以像访问普通内存的方式来做读访问(写就要复杂些),norflash还可以在其中直接执行代码。这些在nandflash里面是不可能做到的,norflash还具有掉电信息不丢失的特点。
Nor Flash 采用了 A1-A22 总共 22 条地址总线和 16 条数据总线与 CPU 连接,请注意地址是从 A1 开始的,这意味着它每次最小的读写单位是 2-byte。由于地址线A0悬空所以norflash只认识偶数的地址线。
这里仅讲解norflash 的扇区擦除与读写的操作:
扇区擦除的操作顺序是:
对应的代码
int erase_one_sector(uint32 dst) { uint32 destbuf = dst; int return_status; // Issue the Sector Erase command to 39VF160X *sys_address(0x5555) = 0x00AA; // write data 0x00AA to device addr 0x5555 *sys_address(0x2AAA) = 0x0055; // write data 0x0055 to device addr 0x2AAA *sys_address(0x5555) = 0x0080; // write data 0x0080 to device addr 0x5555 *sys_address(0x5555) = 0x00AA; // write data 0x00AA to device addr 0x5555 *sys_address(0x2AAA) = 0x0055; // write data 0x0055 to device addr 0x2AAA *sys_address(destbuf) = 0x0030; // write data 0x0030 to device sector addr return_status = check_toggle_ready(destbuf); // wait for TOGGLE bit ready return return_status; }
写2个字节的操作顺序是
对应的代码:
int program_one_word (uint16 *srcword, uint32 dst) { uint32 destbuf = dst; uint16 *sourcebuf = srcword; int return_status; *sys_address(0x5555) = 0x00AA; // write data 0x00AA to device addr 0x5555 *sys_address(0x2AAA) = 0x0055; // write data 0x0055 to device addr 0x2AAA *sys_address(0x5555) = 0x00A0; // write data 0x00A0 to device addr 0x5555 *sys_address(destbuf) = *sourcebuf; // transfer the uint16 to destination return_status = check_toggle_ready(destbuf); // wait for TOGGLE bit ready return return_status; }
读2个字节的代码
void read_one_word(uint16 *src_word, uint32 dst)
{
uint32 destbuf = dst;
*src_word = *(volatile uint16 *)(system_base|destbuf);
}
可以看出norflash的读操作可以像访问普通的内存一样来访问,另外正如在开头说过的 norflash 由于把 A0 地址线悬空,因此只能识别偶数的地址请求,因此下面的两个读操作读出来的内容是一样的。
#define target_addr 0x000010 read_one_word(&temp[0],target_addr); read_one_word(&temp[1],target_addr+1);
使用下面给出的代码测试,并使用openjtag调试可验证上面的推测正确。
http://s.yunio.com/tuwaSd
关于norflash的相关资料可以见下面链接:
http://s.yunio.com/OF!h0b