历史上的今天
今天是:2024年12月03日(星期二)
2019年12月03日 | nandflash的读写(2440)
2019-12-03 来源:eefocus
说明:
根据物理结构上的区别 , NandFlash主要分为如下两类:
1)•SLC (Single Level Cell): 单层式存储
2)•MLC (Multi Level Cell): 多层式存储
@:SLC在存储格上只存一位数据, 而MLC则存放两位数据。
1.nand.c
#define NFCONF (*(volatile unsigned long*)0x4E000000)
#define NFCONT (*(volatile unsigned long*)0x4E000004)
#define NFCMD (*(volatile unsigned char*)0x4E000008)
#define NFADDR (*(volatile unsigned char*)0x4E00000C)
#define NFDATA (*(volatile unsigned char*)0x4E000010)
#define NFSTAT (*(volatile unsigned char*)0x4E000020)
#define TACLS 1
#define TWRPH0 2
#define TWRPH1 1
void select_chip()
{
NFCONT &= ~(1<<1);
}
void deselect_chip()
{
NFCONT |= (1<<1);
}
void clear_RnB()
{
NFSTAT |= (1<<2);
}
void send_cmd(unsigned cmd)
{
NFCMD = cmd;
}
void send_addr(unsigned addr)
{
NFADDR = addr;
}
void wait_RnB()
{
while (!(NFSTAT&(1<<2)))
{
;
}
}
void nand_reset()
{
//选中flash
select_chip();
//清除RnB
clear_RnB();
//发送0xff命令
send_cmd(0xff);
//等待RnB
wait_RnB();
//取消选中flash
deselect_chip();
}
void nandflash_init()
{
//初始化NFCONF
NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);
//初始化NFCONT
NFCONT = (1<<0) | (1<<1);
//复位
nand_reset();
}
void NF_PageRead(unsigned long addr,unsigned char* buff)
{
int i;
//选中nandflash芯片
select_chip();
//清除RnB
clear_RnB();
//发送命令0x00
send_cmd(0x00);
//发送列地址
send_addr(0x00);
send_addr(0x00);
//发送行地址
send_addr(addr&0xff);
send_addr((addr>>8)&0xff);
send_addr((addr>>16)&0xff);
//发送命令0x30
send_cmd(0x30);
//等待RnB
wait_RnB();
//读取数据
for(i=0;i<2048;i++)
{
buff[i] = NFDATA;
}
//取消选中nandflash芯片
deselect_chip();
}
void nand_to_ram(unsigned long start_addr, unsigned char* sdram_addr, int size)
{
int i;
for( i=(start_addr >>11); size>0;)
{
NF_PageRead(i,sdram_addr);
size -= 2048;
sdram_addr += 2048;
i++;
}
}
int NF_Erase(unsigned long addr)
{
int ret;
//选中flash芯片
select_chip();
//清除RnB
clear_RnB();
//发送命令0x60
send_cmd(0x60);
//发送行地址
send_addr(addr&0xff);
send_addr((addr>>8)&0xff);
send_addr((addr>>16)&0xff);
//发送命令D0
send_cmd(0xD0);
//等待RnB
wait_RnB();
//发送命令0x70
send_cmd(0x70);
//读取擦除结果
ret = NFDATA;
//取消选中flash芯片
deselect_chip();
return ret;
}
int NF_WritePage(unsigned long addr,unsigned char *buff)
{
unsigned int i,ret = 0;
//选中nandflash
select_chip();
//清除RnB
clear_RnB();
//发送0x80命令
send_cmd(0x80);
//发送2个列地址
send_addr(0x00);
send_addr(0x00);
//发送3个行地址
send_addr(addr&0xff);
send_addr((addr>>8)&0xff);
send_addr((addr>>16)&0xff);
//发送数据
for(i=0;i<2048;i++)
{
NFDATA = buff[i];
}
//发送0x10命令
send_cmd(0x10);
//等待RnB
wait_RnB();
//发送0x70命令
send_cmd(0x70);
//读取写入结果
ret = NFDATA;
//关闭nandflash
deselect_chip();
return ret;
}
2.uart.c
#define GPHCON (*(volatile unsigned long*)0x56000070)
#define ULCON0 (*(volatile unsigned long*)0x50000000)
#define UCON0 (*(volatile unsigned long*)0x50000004)
#define UBRDIV0 (*(volatile unsigned long*)0x50000028)
#define UTRSTAT0 (*(volatile unsigned long*)0x50000010)
#define UTXH0 (*(volatile unsigned long*)0x50000020)
#define URXH0 (*(volatile unsigned long*)0x50000024)
#define PCLK 50000000
#define BAUD 115200
void uart_init()
{
//1.配置引脚功能
GPHCON &= ~(0xf<<4);
GPHCON |= (0xa<<4);
//2.1 设置数据格式
ULCON0 = 0b11;
//2.2 设置工作模式
UCON0 = 0b0101;
//3. 设置波特率
UBRDIV0 =(int)(PCLK/(BAUD*16)-1);
}
void putc(unsigned char ch)
{
while (!(UTRSTAT0 & (1<<1)));
UTXH0 = ch;
}
unsigned char getc(void)
{
unsigned char ret;
while (!(UTRSTAT0 & (1<<0)));
// 取数据
ret = URXH0;
if ( (ret == 0x0d) || (ret == 0x0a) )
{
putc(0x0d);
putc(0x0a);
}
else
putc(ret);
return ret;
}
上一篇:ARM-汇编指令集(总结)
下一篇:ARM详细指令集
史海拾趣
|
天祥 十天学会CPLD FPGA VHDL视频教程(3.12G完整版) 第一讲:主要讲解CPLD系统开发的基本概念,介绍了CPLD和FPGA的各自特点、生产厂家和相应的软件以及开发相关的硬件描述语言。以分频器为例,让大家了解Altera公司的Quartus II软件的基本使用方法和VHDL描述的基本结构。 第二讲:主要以moore状态 ...… 查看全部问答> |
|
前两天看见论坛上有一个老帖子讲6410用VGA输出屏幕会抖动的。正好前些日子我正试摄像头采集然后给硬件编解码器编码,也遇到了这个问题,不过已经稀里糊涂的解决了,希望大家针对如下问题来讨论。 看那个帖子上说,这是“ram总线竞争”导致。那么大 ...… 查看全部问答> |
|
平台:S3C2440 + WINCE5.0 驱动使用中断EINT0和EINT5,大概20ms就一个中断,来了中断后就在IST中从3根GPIO口线读取300Bytes的数据 测试发现,在Wince有其他操作时,驱动IST中接收的数据会随机出现误码或者0,在IST中增加了计数器,测得中断是每次 ...… 查看全部问答> |
|
【连载】【ALIENTEK MiniSTM32 开发板】STM32不完全手册--跑马灯实验(实验一) ALIENTEK开发板购买地址:http://shop62103354.taobao.com/ [ 本帖最后由 正点原子 于 2010-8-30 09:31 编辑 ]… 查看全部问答> |
|
1. 1. 串口的基本概念 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用 ...… 查看全部问答> |




