[国嵌攻略][054][NandFlash驱动设计_写]

Nand Flash支持按页写和随机写两种方式,在下面实现的是按页写。闪存在写数据时,只能写入1,不能写入0,所以写函数必须和擦除函数一起使用,并且擦除函数是按块擦除。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/********************************************************************
*名称:write_page_flash
*参数:
*   page   页号
*   buf    写缓存,2048字节
*返回:
*   state  成功:0
*          失败:1
*功能:按页写闪存
*********************************************************************/
int write_page_flash(unsigned long page, unsigned char *buf){
    int i;   //循环计数器
    int state;   //写入状态,0表示成功,1表示失败
 
    //选中闪存芯片
    NFCONT &= ~(1<<1);   //设置Reg_nCE:0
     
    //清除忙信号
    NFSTAT |= (1<<2);    //设置RnB_TransDetect:0
 
    //发送写命令(0x80)
    NFCMMD = 0x80;
     
    //发送列地址(页内偏移)
    NFADDR = 0x00;   //Col.Add1,按页写忽略页内偏移
    NFADDR = 0x00;   //Col.Add2
     
    //发送行地址(页号)
    NFADDR = (page>>0)&0xFF;    //Row.Add1
    NFADDR = (page>>8)&0xFF;    //Row.Add2
    NFADDR = (page>>16)&0xFF;   //Row.Add3
     
    //写入数据
    for(i = 0; i < PAGE_SIZE; i++){
        NFDATA = buf[i];   //注意,NFDATA寄存器数据类型要和buf匹配,一个写周期写入一个字节
    }
     
    //发送写命令(0x10)
    NFCMMD = 0x10;
     
    //等待忙信号
    while( !(NFSTAT&(1<<2)) );   //当RnB_TransDetect等于1时,结束循环
     
    //发送读状态命令(0x70)
    NFCMMD = 0x70;
     
    //读取状态
    state = NFDATA&0x00000001;   //取出数据端口I/O的0位,否则返回随机值
     
    //释放闪存芯片
    NFCONT |= 1<<1;   //设置Reg_nCE:1
     
    return state;
}
 
/********************************************************************
*名称:erase_block_flash
*参数:
*   page   页号
*返回:
*   state  成功:0
*          失败:1
*功能:按块擦除闪存。提供页的地址,擦除所在的块。
*********************************************************************/
int erase_block_flash(unsigned long page){
    int state;   //写入状态,0表示成功,1表示失败
     
    //选中闪存芯片
    NFCONT &= ~(1<<1);   //设置Reg_nCE:0
     
    //清除忙信号
    NFSTAT |= (1<<2);    //设置RnB_TransDetect:0
 
    //发送擦除命令(0x60)
    NFCMMD = 0x60;
     
    //发送行地址(页号)
    NFADDR = (page>>0)&0xFF;    //Row.Add1
    NFADDR = (page>>8)&0xFF;    //Row.Add2
    NFADDR = (page>>16)&0xFF;   //Row.Add3
     
    //发送擦除命令(0xD0)
    NFCMMD = 0xD0;
     
    //等待忙信号
    while( !(NFSTAT&(1<<2)) );   //当RnB_TransDetect等于1时,结束循环
     
    //发送读状态命令(0x70)
    NFCMMD = 0x70;
     
    //读取状态
    state = NFDATA&0x00000001;   //取出数据端口I/O的0位,否则返回随机值
     
    //释放闪存芯片
    NFCONT |= 1<<1;   //设置Reg_nCE:1
 
    return state;
}

 

posted @   盛夏夜  阅读(294)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示