📄 nflash_1.h
字号:
#ifndef _NFLASH_1_H
#define _NFLASH_1_H
#ifdef __cplusplus
extern "C" {
#endif
#include "ioep9315.h"
#include "PUBLIC.h"
/*硬件连接描述
NAND_CE# portG3 cs2 =0x20000000
NAND_ALE a14
NAND_CLE a15
NAND_WE WE|STRIB
NAND_RD RD|STRIB
NAND_RB READY 或者portG2
WP VCC 不允许保护
*/
#define NAND_BASE 0x30000000
#define DEV0_K9F_COMMAND (*(unsigned char *)(NAND_BASE+0x8000)) //写命令 A25=0,A15/CLE=1,A14/ALE=0,
#define DEV0_K9F_ADDR (*(unsigned char *)(NAND_BASE+0x4000)) //写地址 A25=0,A15/CLE=0,A14/ALE=1,
#define DEV0_K9F_DATA (*(unsigned char *)(NAND_BASE+0x0000)) //读写数据A25=0,AD15/CLE=0,A14/ALE=0,
//卡上的NAND-FLASH
#define NAND1_BASE 0x32000000
#define DEV1_K9F_COMMAND (*(unsigned char *)(NAND1_BASE+0x8000)) //写命令 A25=1,A15/CLE=1,A14/ALE=0,
#define DEV1_K9F_ADDR (*(unsigned char *)(NAND1_BASE+0x4000)) //写地址 A25=1,A15/CLE=0,A14/ALE=1,
#define DEV1_K9F_DATA (*(unsigned char *)(NAND1_BASE+0x0000)) //读写数据A25=1,AD15/CLE=0,A14/ALE=0,
//硬件忙判别
//#define NAND_WAIT_READY(nand) { while((GPIO_PGDR)&0x08==0); } //等待PORTG2=1
#define DEV0_K9F_ENABLE GPIO_PGDR &= ~0x04 //PORTG3=0;set to 0 enable
#define DEV0_K9F_DISABLE GPIO_PGDR |= 0x04 //PORTG3=1;set to 1 disable
//卡上的NAND-FLASH--EN.EGPIO9,PB1
#define SET_K9F_ENABLE GPIO_PBDDR |= 0x02 //PORTB1=1;set to 1 enable
#define DEV1_K9F_ENABLE GPIO_PBDR &= ~0x02 //PORTB1=0;set to 0 enable
#define DEV1_K9F_DISABLE GPIO_PBDR |= 0x02 //PORTB1=1;set to 1 disable
//定义命令标识.控制K9f1208命令
#define K9F_RESET 0x0FF //RESET
#define READ_K9F_ID 0x90 //READ ID
#define READ_STATUS 0x70 //READ BUSY OR READY
#define WRITE_START 0x80 //PRO_START_COMMOND
#define WRITE_END 0x10 //PRO_END_COMMOND
#define ERASE_START 0x60 //ERASE_START_COMMOND
#define ERASE_END 0x0d0 //ERASE_END_COMMOND
#define READ_FIRST_ARRAY 0x00 //first half array 0-255
#define READ_SECOND_ARRAY 0x01 //second half array 256-512
#define READ_SPARE_ARRAY 0x50 //spare array 512-527
#define K9F1208_ID (0x0ec76A5C0)
#define K9F5608_ID (0x0ec75A5BD)
#define NandAllPageSize 528
//NAND_FLASH结构定义(该结构存放于第0块,第4PAGE)
struct _K9fInfo{
unsigned short IsCreat; //0x55aa,表示建立了坏块表
unsigned short BlockAmount; //块总数目4096/k9f1208 2048/k9f5608(标志设备号)
unsigned short BlockUsed; //可利用块数目,4016/k9f1208,2008/k9f5608
unsigned short BadBlockAmount;//坏块总数目
unsigned short BadBlockNum[80]; //最大支持80个坏块,超过该数目不在使用。
unsigned short BlockTableNum; //坏块替换表项数
unsigned short BlockNextMux; //下一个可替换的坏块号,初始为BlockUsed。
unsigned short BlockTable[160]; //坏块替换表,超过80个块不再使用
unsigned short AppLen; //应用程序的长度,占用BLOCK的数目(255占用4MBYTE空间)
unsigned short AppFlag;
unsigned short Reserved[8];
};
union _K9fUnion
{
struct _K9fInfo K9fInfo;
unsigned char Dbuf[512];
};
/*K9f1208应用函数声明*/
void K9F_Init(unsigned char dev);
unsigned char K9F_Erase_Block(unsigned char dev,unsigned int block);
void K9F_ReadPage(unsigned char dev,unsigned int block,unsigned int page,unsigned char *pData);
unsigned char K9F_WritePage(unsigned char dev,unsigned int block,unsigned int page,unsigned char *pData);
unsigned char K9F_ReadInfo(unsigned char dev);
unsigned char K9F_WriteInfo(unsigned char dev);
unsigned int K9F_GetBlock(unsigned char dev,unsigned int block);
void K9F_CreatInfo(unsigned char dev);
void AddToBadBlock(unsigned char dev,unsigned int block);
void TestNandFlash(unsigned char dev);
extern union _K9fUnion DEV[2]; //支持0/1两个设备
//--------------------------------------------------
//write for file32 system
//07.10.25
#define CS373 0x18003
#define DATA 0x18001
#define SEQUENTIAL_DATA_INPUT_CMD 0x80
#define READ1_CMD 0x00
#define READ2_CMD 0x50
#define READID_CMD 0x90
#define RESET_CMD 0xff
#define PAGE_PROGRAM_CMD 0x10
#define BLOCK_ERASE_CMD 0x60
#define BLOCK_ERASE_CONFIRM_CMD 0xd0
#define READ_STATUS_CMD 0x70
typedef struct stNandFlash
{
uint16 device_maker; // 0xec:samsung, 0x98:toshiba
uint16 device_type; // 1:1M, 2:2M, 4:4M, 8:8M, 16:16M, 32:32M ...bytes
uint16 blocks_disk; // blocks in a disk
uint16 pages_block; // pages in a block
uint16 page_size; // page_size in bytes
uint16 data_size; // data_size in bytes
uint16 spare_size; // spare_size in bytes
} stNandFlash;
extern stNandFlash _Nand_Flash;
uint8 BlockErase (uint32 in_page_add); // Erasing single block
uint8 BlockRead (uint8 *in_page_data, uint32 in_page_add);
uint8 PageOneWrite (uint8 *in_write_data, uint32 in_page_add);
uint8 PageRead (uint8 *in_page_data, uint32 in_page_add);
uint8 PageWrite (uint8 *in_write_data, uint32 in_page_add);
#ifdef __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -