历史上的今天
今天是:2024年10月11日(星期五)
2021年10月11日 | S3C2440裸机------NandFlash编程_擦除与烧写
2021-10-11 来源:eefocus
1.擦除

NandFlash是以块为单位进行擦除的,一个块是128K,从上面的时序图我们可以看到,首先我们要发出60命令,然后发出三个行地址,然后发送D0H,然后等待擦除结束。
int nand_erase(unsigned int addr, unsigned int len)
{
int page = addr / 2048;
if (addr & (0x1FFFF))
{
printf("nand_erase err, addr is not block alignnr");
return -1;
}
if (len & (0x1FFFF))
{
printf("nand_erase err, len is not block alignnr");
return -1;
}
nand_select();
while (1)
{
page = addr / 2048;
nand_cmd(0x60);
/* row/page addr */
nand_addr_byte(page & 0xff);
nand_addr_byte((page>>8) & 0xff);
nand_addr_byte((page>>16) & 0xff);
nand_cmd(0xD0);
wait_ready();
len -= (128*1024);
if (len == 0)
break;
addr += (128*1024);
}
nand_deselect();
return 0;
}
2.烧写

从上面的时序图可以看到,要想烧写NandFlash,我们首先发出80命令,然后发出五个地址,然后开始写数据,数据写完之后发出10命令,然后开始等待烧写完成。
void nand_write(unsigned int addr, unsigned char *buf, unsigned int len)
{
int page = addr / 2048;
int col = addr & (2048 - 1);
int i = 0;
nand_select();
while (1)
{
nand_cmd(0x80);
/* 发出地址 */
/* col addr */
nand_addr_byte(col & 0xff);
nand_addr_byte((col>>8) & 0xff);
/* row/page addr */
nand_addr_byte(page & 0xff);
nand_addr_byte((page>>8) & 0xff);
nand_addr_byte((page>>16) & 0xff);
/* 发出数据 */
for (; (col < 2048) && (i < len); )
{
nand_w_data(buf[i++]);
}
nand_cmd(0x10);
wait_ready();
if (i == len)
break;
else
{
/* 开始下一个循环page */
col = 0;
page++;
}
}
nand_deselect();
}
史海拾趣
|
目前越来越多的电子产品结合高速发展的感测技术,以期改善消费者使用感受,如增加对预测使用者需求的智能化功能,以及通过触摸和直觉式手势实现人机互动,这些先进的人机界面功能往往需要牺牲功耗和性能,并导致更高的软件复杂度,因而对设计环境 ...… 查看全部问答> |
|
Linux内核IP Queue机制的分析(二)——用户态处理并回传数据包 序 笔者将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析。三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)——用户态接收数据包 Linux内核IP Queue机制的分析(二)—— ...… 查看全部问答> |
|
求助:怎样编程实现89c51控制320240液晶屏显示的问题 用51控制一个320×240的液晶屏,该液晶屏的驱动芯片是ra8835,需要在屏幕上显示四个设备名称,单片机51的P2口通过继电器连接那四个设备,另有两个按键接在51的2个管脚上,要实现的功能是一个按键用来选择哪个设备,同时能在屏幕上显示当前选择的设 ...… 查看全部问答> |
|
[求助]LaunchPad自带的虚拟串口识别为COM5,用什么软件连接啊? [求助]LaunchPad自带的虚拟串口识别为COM5,用什么软件连接啊?试了几个串口工具都只支持COM1-COM4……… 查看全部问答> |




