NorFlash原理及硬件操作
资料来自:韦东山嵌入式linux
NorFlash硬件连接图:
可以看出数据线有16根,则位宽16位,地址线ADDR1接A0,ADDR2接A1。根据A0的值判断16位数据高低位
UBOOT操作:
1.读数据
md.b 0
2.读ID
根据手册的读取方法:
往地址555H写AAH
往地址2AAH写55H
往地址555H写90H
读0地址得到厂家ID: C2H
读1地址得到设备ID: 22DAH或225BH
退出读ID状态: 给任意地址写F0H
因为地址线的接线方式,555H是写给Norflash接口上的数据,那么在2440发出来的应该是555h<<1,Norflash才能收到555h
所以Uboot应该写入:
往地址AAAH写AAH mw.w aaa aa
往地址554写55H mw.w 554 55
往地址AAAH写90H mw.w aaa 90
读0地址得到厂家ID: C2H md.w 0 1
读2地址得到设备ID: 22DAH或225BH md.w 2 1
退出读ID状态: mw.w 0 f0
3.Nor有两种规范。如果需要获得norflash的信息(容量大小,电压大小等)1.jedec,通过读取flash的ID与uboot内核中比较获得信息,该方法适用于比较老的norflash。2.cfi模式,直接读取norflash中的CFI信息,其中就包含了flash的各种信息。
进入CFI模式 往55H写入98H
读数据: 读10H得到0051
读11H得到0052
读12H得到0059 //51 52 59对应QRY设备名称
读27H得到容量
2440的A1接到NOR的A0,所以2440发出(555h<<1), NOR才能收到555h这个地址
UBOOT怎么操作?
进入CFI模式 往AAH写入98H mw.w aa 98
读数据: 读20H得到0051 md.w 20 1
读22H得到0052 md.w 22 1
读24H得到0059 md.w 24 1
读4EH得到容量 md.w 4e 1
退出CFI模式 mw.w 0 f0
上述md.w 4e 1返回0015h,即2^21Byte,那么flash一共2M
4.写数据。
Nor启动时,norflash接在bank0,基地址0,2440读取Nor中的0地址作为0地址,所以Nor共占有地址2*1024*1024=0x200000,0x200000以外的地址便是内存地址,可以直接读写,但是0x200000以下的地址可直接读,但是不可直接写。写数据步骤:如果源地址中的内容已经被擦除(擦除后是0xff),则:
往地址555H写AAH
往地址2AAH写55H
往地址555H写A0H
往地址PA写PD
2440的A1接到NOR的A0,所以2440发出(555h<<1), NOR才能收到555h这个地址
UBOOT怎么操作?
往地址AAAH写AAH mw.w aaa aa
往地址554H写55H mw.w 554 55
往地址AAAH写A0H mw.w aaa a0
往地址0x100000写1234h mw.w 100000 1234
如果源地址内容未擦除,则先擦除,后写入:
先擦除
mw.w aaa aa //aaa对应Sector Erase中的555<<1
mw.w 554 55
mw.w aaa 80mw.w aaa aa
mw.w 554 55
mw.w 100000 30
再烧写
mw.w aaa aa
mw.w 554 55
mw.w aaa a0
mw.w 100000 5678
Nor_编程
根据NorFlash的读取规则,可以实现Nor上的测试:
* 1. 识别nor flash
* 2. 擦除nor flash某个扇区
* 3. 编写某个地址
* 4. 读某个地址
1. 添加norflash_test测试
void nor_flash_test(void)
{
char c;
while(1)