使用at91sam9260在uboot下直接对nandflash操作

来源:互联网 发布:mysql如何更改密码 编辑:程序博客网 时间:2024/06/06 12:41

声明:这里面的对nandflash的操作是在韦东山老师的linux视频启发下所写的

一,at91sam9260里面有对nandflash的支持,主要是通过三个寄存器实现的;

 (1). DataRegister 数据寄存器 位置在offset 0x000000 ,起始地址就是nandflash的地址空间,所以实际的寄存器地址也就是0x40000000;
 (2).CommandRegister 命令寄存器 位置在offset 0x400000,也就是0x40400000
 (3). AddressRegister 地址寄存器 位置在offset 0x200000,既0x40200000

这里需要说明的是,里面的具体的操作nandflash时序已经由9260芯片完成,我们要做的只是操作寄存器而已。

二,我们首先来实现读取nandflash ID的操作
通过nand的芯片手册可以得知 read ID的操作流程为
enable------>command 0x90 -------> address 0x00 ----->data1 ----> data2 ------>data3 ------>data4-----> date5
最后5个读取数据操作会得到 ec f1 00 15 40 

公司的at91sam9260开发板的nandflash使能引脚是接到了PC14引脚上(这是atmel公司推荐的接法),而nand芯片的使能电平为低,所以需要将芯片的PC14引脚置地。通过查看at91sam9260的datasheet可知PC的寄存器空间是在0xFFFFF800 --0xFFFFFA00之间的,然后PC的输出寄存器分别为置位寄存器 offset 0x30 和清零寄存器 offset 0x34,也就是我们需要到清零寄存器里面将第14为置位来是使能nandflash芯片。

Emfuture> mw.l 0xFFFFF834 0x00004000
通过查看输出状态寄存器 (offset 0x38)来看PC14是否为低
Emfuture> md.l 0xFFFFF838 1
fffff838: 00000000 ....            可见nandflash已经使能
这里需要注意的是需要配置PC14引脚为IO使能和输出使能,这样才能操作引脚输出功能

然后发送0x90命令到命令寄存器中
Emfuture> mw.b 0x40400000 0x90
接着是地址寄存器中输出 0x00地址
Emfuture> mw.b 0x40200000 0x00

现在就可以读取数据寄存器的值了,连续读取5个值 ,因为第二个就是chip id 
Emfuture> md.b 0x40000000 1
40000000: ec .
Emfuture> md.b 0x40000000 1
40000000: f1 .                                    /////Device Code   每次9260uboot启动是打印的chipID就是0xecf1就是这个
Emfuture> md.b 0x40000000 1
40000000: 00 .
Emfuture> md.b 0x40000000 1
40000000: 95 .                                         ////和芯片手册稍微有点出入,不过效果已经达到了
Emfuture> md.b 0x40000000 1
40000000: 40 @
Emfuture> md.b 0x40000000 1
40000000: ec .              ///继续读的话就会循环输出上面的数据

退出读取ID的状态  0xff命令
Emfuture> mw.b 0x40400000 0xff

三, 现在来读取nandflash第一个字节的数据
我们使用nand dump 0 命令先读取出来第一页的命令做对比
Emfuture> nand dump 0           //nand dump 命令
Page 00000000 dump:
        0d 00 00 ea 05 00 00 ea 05 00 00 ea 05 00 00 ea     ///对比的数据
        05 00 00 ea c8 0f 00 00 05 00 00 ea 05 00 00 ea


具体的操作流程为
enable------>command 0x00 -------> address 0x00 ----->address 0x00 ----->address 0x00 ----->address 0x00 ----->data1 ----> data2 ------>data3 ------>data4 ------->cammand 0xff

Emfuture> mw.l 0xFFFFF834 0x00004000     ////使能nandflash芯片
Emfuture> md.l 0xFFFFF838                 /////查看输出是否为0
fffff838: 00000000 ....
Emfuture> mw.b 0x40400000 0x00                //////command  0x00
Emfuture> mw.b 0x40200000 0x00              ////address 0x00
Emfuture> mw.b 0x40200000 0x00
Emfuture> mw.b 0x40200000 0x00
Emfuture> mw.b 0x40200000 0x00
Emfuture> mw.b 0x40200000 0x00
Emfuture> mw.b 0x40400000 0x30                ////命令  command 0x30

Emfuture> md.b 0x40000000 1                 ////开始读数据
40000000: 0d .
Emfuture> md.b 0x40000000 1
40000000: 00 .
Emfuture> md.b 0x40000000 1
40000000: 00 .
Emfuture> md.b 0x40000000 1
40000000: ea .
Emfuture> mw.b 0x40400000 0xff            ////退出