上海凯治电子NAND的测试例子
#ifndef __TEST_H__
#define __TEST_H__
#include"def.h"
#define MAX_NAND_BLOCK 2048 //一共2048块
#define NAND_PAGE_SIZE 2048 //每块main区2k字节=2048
typedef struct nand_id_info //芯片的ID信息
{
U8 IDm; //需修改,厂商ID,ATO的厂商ID,9Bh
U8 IDd; //需修改,设备ID,ATO的设备ID,F1h
U8 ID3rd;
U8 ID4th;
U8 ID5th;
} nand_id_info;
typedef struct bad_block_info //登记坏块
{
U8 area[MAX_NAND_BLOCK]; //0表示非坏块,1表示坏块
U32 sum; //坏块的总数
} bad_block_info;
//NAND 操作指令
#define
NAND_CMD_READ_1st
0x00
#define NAND_CMD_READ_2st
0x30
#define NAND_CMD_RANDOM_WRITE
0x85 //随机写
#define NAND_CMD_RANDOM_READ_1st 0x05
#define NAND_CMD_RANDOM_READ_2st 0xe0
#define
NAND_CMD_READ_CB_1st
0x00 //将NAND里一块内容写进另一块
#define NAND_CMD_READ_CB_2st
0x35
#define
NAND_CMD_READ_ID
0x90
#define
NAND_CMD_RES
0xff //复位命令
#define NAND_CMD_WRITE_PAGE_1st 0x80
#define NAND_CMD_WRITE_PAGE_2st 0x10
#define NAND_CMD_BLOCK_ERASE_1st 0x60 //擦除命令
#define NAND_CMD_BLOCK_ERASE_2st 0xd0
#define
NAND_CMD_READ_STATUS 0x70
//NAND 中断向量
#define INT_NFCON 24
//NFCONF HCLK=100MHZ
#define S3C2440_NFCONF_TACLS_init
(1<<12)
#define S3C2440_NFCONF_TWRPH0_init
(4<<8)
#define S3C2440_NFCONF_TWRPH1_init
(0<<4)
#define S3C2440_NFCONF_BusWidth_init
(0)
#define S3C2440_NFCONF_init()
( rNFCONF = S3C2440_NFCONF_TACLS_init
|
S3C2440_NFCONF_TWRPH0_init |
S3C2440_NFCONF_TWRPH1_init |
S3C2440_NFCONF_BusWidth_init )
//NFCONT
#define S3C2440_NFCONT_LockTight_init
(0<<13)
#define S3C2440_NFCONT_SoftLock_init
(0<<12)
#define S3C2440_NFCONT_EnbIllegalAccINT_init
(1<<10)
#define S3C2440_NFCONT_EnbRnBINT_init
(0<<9)
#define S3C2440_NFCONT_RnB_TransMode_init
(0<<8)
#define S3C2440_NFCONT_SpareECCLock_init
(1<<6)
#define S3C2440_NFCONT_MainECCLock_init
(1<<5)
#define S3C2440_NFCONT_InitECC_init
(1<<4)
#define S3C2440_NFCONT_Reg_nCE_init
(1<<1) //初始配置片选无效
#define S3C2440_NFCONT_MODE_init
(0)
#define S3C2440_NFCONT_init()
( rNFCONT = S3C2440_NFCONT_LockTight_init
|
S3C2440_NFCONT_SoftLock_init |
S3C2440_NFCONT_EnbIllegalAccINT_init
|
S3C2440_NFCONT_EnbRnBINT_init |
S3C2440_NFCONT_RnB_TransMode_init
|
S3C2440_NFCONT_SpareECCLock_init
|
S3C2440_NFCONT_MainECCLock_init
|
S3C2440_NFCONT_InitECC_init |
S3C2440_NFCONT_Reg_nCE_init |
S3C2440_NFCONT_MODE_init )
//NFSTAT
#define S3C2440_NFSTAT_init()
( rNFSTAT &= 0x3 )
//NFESTAT0
#define S3C2440_NFESTAT0_init()
( rNFESTAT0 = 0 )
//NFESTAT1
#define S3C2440_NFESTAT1_init()
( rNFESTAT1 = 0 )
#define select_nand() ( rNFCONT &= ~(1<<1) )
#define dis_select_nand() ( rNFCONT |= 1<<1 )
#define controller_enable() ( rNFCONT |= 1 )
#define controller_disable() ( rNFCONT &= ~1 )
void nand_flash_init(void); //初始化
void nand_read_id(void);
extern int nand_block_erase(U32 num); //num要删除的块号
extern int nand_page_write(U32 addr,U8 *buffer,U32 size); //addr要写的起始页地址,buffer要写的缓存,size要写的字节大小最大为4G
extern int nand_page_read(U32 addr,U8
*buffer,U32 size); //addr开始页地址,从每页00地址开始读
extern int nand_random_read(U32 paddr,U32 offset,U8 *data); //随机读数据 paddr页地址,offset页内偏移地址
extern int nand_random_write(U32 paddr,U32 offset,U8 data); //随机写,paddr页地址,offset页内区最后一个地偏移地址
extern void nand_test_bad_block(void); //测试坏块函数,并标记在nand_bbi变量里和spare里(如果非0xff则为坏块)
注:如需使用我们的nand flash 只修改如上红色部分所示的厂商ID,设备ID。
Copyright © 2009-2014,www.KAWHK.com,All rights reserved
版权所有 © 上海凯治电子科技有限公司未经许可 严禁复制 建议使用1024X768分辨率浏览本站