📄 39sf020.c
字号:
#include <absacc.h>
#include <INTRINS.H>
#include <39SF020.h>
extern unsigned char Read39SF02abyte(unsigned char H_addr,unsigned int L_addr);//读一个字节数据
extern void Write39SF02abyte(unsigned char H_addr,unsigned int L_addr,unsigned char W_Data);//写一个字节数据
extern void SectorErase(unsigned char H_addr,unsigned int SectorAddr);//扇区擦除
extern void ChipErase();//整片擦除
void delay_10us(unsigned int us)
{
while(us--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
void delay_Nms(unsigned int ms)
{
unsigned int i;
while(ms--)
{
i=252;
while(i--);
}
}
/***********************************************************************************/
/* 选择 39C020 段地址(高位地址),seg 为段地址*/
void select_segment(unsigned char seg)
{
P1&=0xfc;
switch(seg)
{
case 0: P1|=0x00; break; // 39c020 a17a16= 000 00000-0ffff
case 1: P1|=0x01; break; // 39c020 a17a16= 001 10000-1ffff
case 2: P1|=0x02; break; // 39c020 a17a16= 010 20000-2ffff
case 3: P1|=0x03; break; // 39c020 a17a16= 011 30000-3ffff
}
}
/*
void select_segment(unsigned char seg)
{
P4&=0xfc;
switch(seg)
{
case 0: P4|=0x00; break; // 39c020 a17a16= 000 00000-0ffff
case 1: P4|=0x01; break; // 39c020 a17a16= 001 10000-1ffff
case 2: P4|=0x02; break; // 39c020 a17a16= 010 20000-2ffff
case 3: P4|=0x03; break; // 39c020 a17a16= 011 30000-3ffff
}
}
*/
void protect() //解除保护
{
select_segment(0);/*必须写到第0段*/
XBYTE[0x5555]=0xaa;
delay_10us(2);
XBYTE[0x2aaa]=0x55;
delay_10us(2);
XBYTE[0x5555]=0xa0;
delay_10us(2);
}
/*************39SF020扇区分布****************
地址从00000-3FFFF
每个扇区大小是:4Kbytes 哪么:
0扇区:0 0000-0 0FFF 1扇区:0 1000-0 1FFF
2扇区:0 2000-0 2FFF 3扇区:0 3000-0 3FFF
4扇区:0 4000-0 4FFF 5扇区:0 5000-0 5FFF
........
62扇区:3 E000-3 EFFF 63扇区:3 F000-3 FFFF
********************************************/
void SectorErase(unsigned char H_addr,unsigned int SectorAddr)//扇区擦除
{
select_segment(H_addr); /*设置高位*/
CE=0;
XBYTE[0x5555]=0xaa;
delay_10us(2);
XBYTE[0x2aaa]=0x55;
delay_10us(2);
XBYTE[0x5555]=0x80;
delay_10us(2);
XBYTE[0x5555]=0xAA;
delay_10us(2);
XBYTE[0x2AAA]=0x55;
delay_10us(2);
XBYTE[SectorAddr]=0x30;
delay_10us(2);
CE=1;
delay_Nms(30);
}
void ChipErase()//整片擦除
{
select_segment(0);/*必须写到第0段*/
CE=0;
XBYTE[0x5555]=0xaa;
delay_10us(4);
XBYTE[0x2aaa]=0x55;
delay_10us(4);
XBYTE[0x5555]=0x80;
delay_10us(4);
XBYTE[0x5555]=0xAA;
delay_10us(4);
XBYTE[0x2AAA]=0x55;
delay_10us(4);
XBYTE[0x5555]=0x10;
delay_10us(4);
CE=1;
delay_Nms(100);
}
unsigned char Read39SF02abyte(unsigned char H_addr,unsigned int L_addr)//读数据
{
unsigned char Data;
//unsigned char i;
CE=0;
select_segment(H_addr&0x03); /*s_sector 是256的整数倍*/
_nop_();_nop_();_nop_();_nop_();_nop_();
Data=XBYTE[L_addr];
CE=1;
return Data;
}
void Write39SF02abyte(unsigned char H_addr,unsigned int L_addr,unsigned char W_Data) //写数据
{
CE=0;
protect(); //解除保护
select_segment(H_addr&0x03); /*s_sector 是256的整数倍*/
XBYTE[L_addr]=W_Data; //高位
delay_10us(2);
CE=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -