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