这次大概介绍了一下nand flash,以及在asf中使用它的方法。
一、 接线
这个开发板搭载了一个256 mb,8位的nand flash(mt29f2g08abaea)。引脚接线如下:
偷个懒,直接上引脚复用的图。其中pc14表明该nand flash需要作为smc的外设0使用。通过使用nandoe和nandwe引脚说明需要使用芯片的nand flash控制逻辑。另外,pc18复用为输入引脚,用以查询芯片的状态。
二、 nand flash
组织结构与寻址
nand flash的容量较大。整片flash分为若干个块(block),每个block分为若干个页(page)。在每个页中,除了数据区域,也包含若干“多余”的区域,用来进行ecc等操作。在进行擦除操作是,基本单位是“块”;而编程的基本单位是“页”。
另外,nand flash的物理特性决定了其在编程时,每个bit只能从1变成0。所以在写入前,必须先对该块进行擦除(擦除时把所有位置为1)。
该flash的结构如下(忽略plane):
在寻址时,是通过行地址和列地址指定储存单元的。其中行地址表示页的编号,列地址表示指定在目标地址在该页的位置。
读写时序
因为没有地址线,所以读写较为复杂。读写时,需要先发送相应操作命令,然后发送地址,才能进行数据传输。一个简单的“页读取”操作时序图如下:
该命令首先拷贝整个页到nand flash的cache寄存器中,然后在需要输出的时候,再从指定的列地址开始输出。
ps,该nand flash支持在上电的时候自动送出第一页的数据,所以经过适当的配置,也是可以通过它进行boot的。
ce# don’t care
在给nand flash发送完命令后,flash需要一个准备的过程。在这个过程中,需要保持片选信号的有效。(据说否则flash就会进入低功耗状态)
一个简单的方法是使用gpio直接控制这个引脚。在asf中使用的即是这个方法。
另外的方法即是使用flash的“ce# don’t care”功能。开启这个功能后,即使片选无效,flash也会进行工作。这样做的好处是不用再手动控制片选信号线外;同时可以在flash进行内部操作时,可以进行其他的片选。比如在一块flash忙时,可以给另外一块flash发送命令。但是,开启这个功能可能会增加flash的功耗。
三、 asf中nand flash使用
准备
在asf wizard中添加“nand flash on ebi”模块。
在conf_board.h中进行如下声明,记得调用board_init():
1#define conf_board_nand
flash 初始化
在board_init()之后,调用nand_flash_raw_initialize()即可完成nand flash的初始化工作。
12345678structnand_flash_raw nf_raw;memset((void*)&nf_raw, 0, sizeof(nf_raw));// init nand flash, and get informations into nf_rawif(nand_flash_raw_initialize(&nf_raw, 0,board_nf_command_addr, board_nf_address_addr, board_nf_data_addr)) {mainexit();}
该函数中,会对smc和若干引脚进行配置;同时对bus matrix进行设置,以使用芯片提供的nand flash逻辑功能。
然后会对nand flash进行重置。接着就会读取该flash的id,并根据该id检测flash的参数,如page大小,block数目等。
基本操作
在nand_flash_raw.h中还提供了一些比较基础的操作。
以下代码对所有的块进行擦除,若在擦除中碰到错误,则打印出来(这里printf会通过uart0口打印,以后有机会会说怎么实现):
12345678910111213// get nand‘s information from nf_rawconststructnand_flash_model* nf_mod = &(nf_raw.model);intnum_block = nand_flash_model_get_device_size_in_blocks(nf_mod);// erase all blockprintf(“erasing nand flash.。.\n\r”);interror;for(inti = 0; i 《 num_block; i++) {error = nand_flash_raw_erase_block(&nf_raw, i);if(error == nand_common_error_badblock) {printf(“-e- block %u is bad block. \n\r”, i);}}
还有page的写入、读取和拷贝等操作就不一一列举了。
感谢同行者|携手相伴前行路,共筑开源创未来
用RFID技术获取精准零售数据,检测率很重要
数字器件选择与EMC电路设计
智能园区数字孪生怎么样?
RISC-V MCU电源系统概述
STM32单片机对NAND Flash的读写以及在ASF中的使用
Cadence本地库搭建从0到1的过程
细数阿里巴巴电商的营销模式,涨知识!
无线网络变慢wifi卡顿的解决办法
三星Galaxy Z Flip 5G引领无性别化手机新风尚
智慧医疗如何破解老年人看病难问题
灯光远程控制系统方案
led恒流驱动电源坏了有什么表现?
荣耀V20体验 新的体验诚意的定价
三星苹果化 可穿戴设备未来大预测
基于自适应卡尔曼滤波算法的电池SOC估算研究
lifi为什么没普及 ifi可见光通信的优缺点
锂电池制造中的线性马达有什么优点
555定时器稳态触发器电路原理讲解
学会导入样例 快速上手应用开发