[国嵌攻略][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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术