⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k9f2808.c

📁 在VC6环境下开发
💻 C
字号:
#include "44b.h"
#include "def.h"
#include "K9F2808.h"
#include <string.h>


/*KM29U128 IO 定义*/
//RB  ->GPE0
//CLE ->GPA8
//ALE ->GPA9
//CE ->GPA5

#define RB		(0x01)
#define CLE		(0x100)
#define ALE		(0x200)	
#define CE		(0x20)

#define rKF28UXDATA		(*(volatile unsigned char *)0x02000000)

#define FC_CMD			{rPDATA |= CLE;	rPDATA &= ~(ALE|CE);}
#define FC_ADDR			{rPDATA |= ALE;	rPDATA&=~(CLE|CE);}
#define FC_DATA			{rPDATA &= ~(ALE|CLE|CE);}

#define _WRB(X)			{rKF28UXDATA = (unsigned char)(X);}
#define _WR(X)			{(*(volatile unsigned int *)0x02000000) = (unsigned int)(X);}

#define _RDB()			rKF28UXDATA
#define _RD()			(*(volatile unsigned int *)0x02000000)

#define FC_INACTIVE		{rPDATA |= CE;	rPDATA&=~(ALE|CLE);}       
#define WAITRB			{while(!(rPDATE & RB));}  //wait tWB and check R/B pin. 
#define CHECK_IO0		(rKF28UXDATA & 0x01)  

#define K9F2808U_ID		(0xec73)
#define WRITEVERIFY		(1)  //Verifing is enable when writing flash

extern void Uart_Printf(char *fmt,...);
void ReadPage(unsigned int block,unsigned int page,unsigned char *pPage){
	int i,addr;
	u32 *pBuf = (u32 *)pPage;
	addr = (block << 5) + page;
	
	FC_CMD
	_WRB(0x00)
	
	FC_ADDR
	_WRB(0x0)
	_WRB(addr&0xff);
	_WRB((addr>>8)&0xff);
	for(i=0;i<3;i++);
	
	FC_DATA
	WAITRB			// wait R/B 
	
	for(i=0;i<528/4;i++){
		pBuf[i] = _RD();
	}
	
	FC_INACTIVE
}

int WritePage(unsigned int block,unsigned int page,unsigned char *pPage){
	int i,addr;
	u8 VBuf[528];
	u32 *pBuf = (u32 *)pPage;
	addr = (block << 5) + page;
	
	FC_CMD
	_WRB(0x80)
	
	FC_ADDR
	_WRB(0x0);
	_WRB(addr&0xff);
	_WRB((addr>>8)&0xff);
		
	FC_DATA	
	for(i=0;i<528/4;i++){
		_WR(pBuf[i]);
	}
	
	FC_CMD
	_WRB(0x10);
		
	for(i=0;i<10;i++);		
	WAITRB;
	
	_WRB(0x70);
	FC_DATA
	for(i=0;i<3;i++);
	
	if(CHECK_IO0){		// Program Error
		
		FC_INACTIVE
		Uart_Printf("Program %x Block %x Page Error\n",block,page);
		return 1;
		
	}else{	
		FC_INACTIVE
		
		//for(i=0;i<10;i++);
		ReadPage(block,page,VBuf);
		
		if(memcmp(pPage,VBuf,528)){
			Uart_Printf("Program %x Block %x Page Verify Error\n",block,page);
			return 1;
		}else{
			return 0;
		}
	}
	
}


unsigned char Erase_Cluster(unsigned int block){
	int i,addr;
	addr = block << 5;
	FC_CMD
	_WRB(0x60)
	
	FC_ADDR
	_WRB(addr&0xff)
	_WRB((addr>>8)&0xff)	
	for(i=0;i<3;i++);	
				
	FC_CMD
	_WRB(0xd0)	
	for(i=0;i<3;i++);
	
	FC_DATA	
	WAITRB
		
	FC_CMD
	_WRB(0x70)
	
	FC_DATA
	if(CHECK_IO0){	// Erase Error
		
		FC_INACTIVE
		Uart_Printf("Erase %x Block Error\n",block);
		return 1;
	}else{
		FC_INACTIVE
		return 0;
	}
}

unsigned int Check_Flash_Id(){
	unsigned int i,id;
	
	FC_CMD
	_WRB(0x90);
	
	FC_ADDR
	_WRB(0x00)
	
	FC_DATA
	for(i=0;i<10;i++);
	
	id = _RDB();
	id = id << 8 | _RDB();
	
	FC_INACTIVE
	
	return id;
		
}

void Flash_Reset(){
	int i;
	FC_CMD
	_WRB(0xff)
	for(i=0;i<0xbb8;i++);
}

void Flash_Tools(){

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -