上海凯治电子NAND的测试案例
来源: | 作者:prod301a6 | 发布时间: 2014-06-23 | 2015 次浏览 | 分享到:

上海凯治电子NAND的测试例子

#ifndef __TEST_H__
#define __TEST_H__
#include"def.h"

#define MAX_NAND_BLOCK 2048  //
一共2048
#define NAND_PAGE_SIZE 2048  //
每块main2k字节=2048
typedef struct nand_id_info   //
芯片的ID信息
{
 U8 IDm; //
需修改,厂商IDATO的厂商ID9Bh
 U8 IDd; //
需修改,设备IDATO的设备IDF1h
 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。