?? flash.c
字號:
#include "head.h"
#include "AT89X52.H"
sfr ISP_DATA =0xe2;
sfr ISP_ADDRH =0xe3;
sfr ISP_ADDRL =0xe4;
sfr ISP_CMD =0xe5;
sfr ISP_TRIG =0xe6;
sfr ISP_CONTR =0xe7;
#define ISP_BYTE_READ 0x01
#define ISP_BYTE_PROGRAM 0x02
#define ISP_SECTOR_ERASE 0x03
#define WAIT_TIME 0x01
#define FLASH_BASE_ADD 0x8000
void flashB(uint dataadd ) //讀寫操作
{
ISP_ADDRH=(uchar)(dataadd>>8); //傳遞高地址
ISP_ADDRL=(uchar)(dataadd&0x00ff); //傳遞低地址
ISP_CONTR=WAIT_TIME; //設置等待時間
ISP_CONTR|=0x80; //允許ISP_IAP操作
ISP_TRIG=0X46; //觸發
ISP_TRIG=0XB9; //觸發
_nop_();
ISP_CONTR=0;
ISP_TRIG=0;
ISP_ADDRH=0xff;
ISP_ADDRL=0xff;
}
void flashByteR(uchar *buf,uchar sq,uint sta,uint len) //字節讀
{
uint fdaadd;
uint ty;
fdaadd =FLASH_BASE_ADD+sq*512+sta;
ISP_CMD =ISP_BYTE_READ;
for(ty=0;ty<len;ty++)
{
flashB(fdaadd);
buf[ty]=ISP_DATA;
fdaadd++;
}
}
void flashWB(uchar*buf,uchar sq,uint len)//字節寫
{
uint dataadd;
uint ty;
uchar t=0;
for(ty=0;ty<len;ty++)
{
if(ty==512*t)
{
dataadd =FLASH_BASE_ADD+sq*0X200;
ISP_CMD =ISP_SECTOR_ERASE;
flashB(dataadd);
sq++;
t++;
}
ISP_DATA =buf[ty];
ISP_CMD =ISP_BYTE_PROGRAM;
flashB(dataadd);
dataadd++;
}
ISP_DATA =0x55;
ISP_CMD =ISP_BYTE_PROGRAM;
flashB(dataadd);
dataadd++;
ISP_DATA =0xaa;
ISP_CMD =ISP_BYTE_PROGRAM;
flashB(dataadd);
}
void flashFByteR(float *buf,uchar sq,uint sta,uint len) //4字節讀
{
uint fdaadd;
uint ty;
union ITOC
{
uchar cda[4];
float ida;
} crc;
fdaadd =FLASH_BASE_ADD+sq*512+sta;
ISP_CMD =ISP_BYTE_READ;
for(ty=0;ty<len;ty++)
{
flashB(fdaadd);
crc.cda[0]=ISP_DATA;
fdaadd++;
flashB(fdaadd);
crc.cda[1]=ISP_DATA;
fdaadd++;
flashB(fdaadd);
crc.cda[2]=ISP_DATA;
fdaadd++;
flashB(fdaadd);
crc.cda[3]=ISP_DATA;
buf[ty]=crc.ida;
fdaadd++;
}
}
void flashW(float*buf,uchar sq,uint len) //四個字節寫
{
uint dataadd;
uchar tt=0;
union ITOC
{
uchar cda[4];
float ida;
} crc;
uint ty;
for(ty=0;ty<len;ty++)
{
if((ty*4)==512*tt)
{
dataadd =FLASH_BASE_ADD+sq*0X200;
ISP_CMD =ISP_SECTOR_ERASE;
flashB(dataadd);
sq++;
tt++;
}
crc.ida=buf[ty];
ISP_DATA =crc.cda[0];
ISP_CMD =ISP_BYTE_PROGRAM;
flashB(dataadd);
dataadd++;
ISP_DATA =crc.cda[1];
ISP_CMD =ISP_BYTE_PROGRAM;
flashB(dataadd);
dataadd++;
ISP_DATA =crc.cda[2];
ISP_CMD =ISP_BYTE_PROGRAM;
flashB(dataadd);
dataadd++;
ISP_DATA =crc.cda[3];
ISP_CMD =ISP_BYTE_PROGRAM;
flashB(dataadd);
dataadd++;
}
ISP_DATA =0x55;
ISP_CMD =ISP_BYTE_PROGRAM;
flashB(dataadd);
dataadd++;
ISP_DATA =0xaa;
ISP_CMD =ISP_BYTE_PROGRAM;
flashB(dataadd);
}
void flashtW(int *buf,uchar sq,uint len)
{
uint dataadd;
uchar t=0;
uint Tn;
union ITOC
{
char cda[2];
int ida;
} crc;
for(Tn=0;Tn<len;Tn++)
{
if(Tn==128*t)
{
dataadd =FLASH_BASE_ADD+sq*0X200;
ISP_CMD =ISP_SECTOR_ERASE;//擦除一個扇區
flashB(dataadd);//擦除
sq++;
}
crc.ida=buf[Tn];
ISP_DATA =crc.cda[0];
ISP_CMD =ISP_BYTE_PROGRAM; //寫入操作
flashB(dataadd);
dataadd++;
ISP_DATA =crc.cda[1];
ISP_CMD =ISP_BYTE_PROGRAM; //寫入操作
flashB(dataadd);
dataadd++;
}
ISP_DATA =0x55;
ISP_CMD =ISP_BYTE_PROGRAM; //寫入操作
flashB(dataadd);
dataadd++;
ISP_DATA =0xaa;
ISP_CMD =ISP_BYTE_PROGRAM; //寫入操作
flashB(dataadd);
}
void flashtR(int*buf,uchar sq,uint sta,uint len)
{
uint fdaadd;
uint ty;
union ITOC
{
char cda[2];
int ida;
} crc;
fdaadd =FLASH_BASE_ADD+sq*512+sta;
ISP_CMD =ISP_BYTE_READ;
for(ty=0;ty<len;ty++)
{
flashB(fdaadd);
crc.cda[0]=ISP_DATA;
fdaadd++;
flashB(fdaadd);
crc.cda[1]=ISP_DATA;
buf[ty]=crc.ida;
fdaadd++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -