📄 k9f2808.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 + -