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