⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 39sf020.c

📁 SST39SF020驱动代码
💻 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 + -