📄 flash.c
字号:
//**********************************************************************
//功能 : SST39VF160操作子程序
//作者 : lihj
//创建日期 : 2004-06-19
//版本 : V1.0
//修改记录 :
//***********************************************************************
//单位:1us
void delay_n_us(unsigned int n)
{
unsigned int i,j;
for (j=0; j<n; j++)
{
for (i=0; i<5; i++);
}
}
//单位:1ms
void delay_n_ms(unsigned int n)
{
unsigned int i,j;
for (j=0; j<n; j++)
{
for (i=0; i<5600; i++);
}
}
// erase one sector(04K bytes)
void SectorErase(void *addr)
{
unsigned int i;
volatile unsigned short *Temp1,*Temp2 ;
i = (unsigned int)addr;
Temp1 = (unsigned short *)(((0x5555)<<1) | (i & 0xffc00000));
Temp2 = (unsigned short *)(((0x2aaa)<<1) | (i & 0xffc00000));
*Temp1 = 0xaa;
*Temp2 = 0x55;
*Temp1 = 0x80;
*Temp1 = 0xaa;
*Temp2 = 0x55;
Temp1 = (unsigned short *)(addr);
*Temp1 = 0x30;
delay_n_ms(18); //waiting for 18ms
}
// erase one block(64K bytes)
void BlockErase(void *addr)
{
unsigned int i;
volatile unsigned short *Temp1,*Temp2 ;
i = (unsigned int)addr;
Temp1 = (unsigned short *)(((0x5555)<<1) | (i & 0xffc00000));
Temp2 = (unsigned short *)(((0x2aaa)<<1) | (i & 0xffc00000));
*Temp1 = 0xaa;
*Temp2 = 0x55;
*Temp1 = 0x80;
*Temp1 = 0xaa;
*Temp2 = 0x55;
Temp1 = (unsigned short *)(addr);
*Temp1 = 0x50;
delay_n_ms(18); //waiting for 18ms
}
// erase one chip (02M bytes)
void ChipErase(void)
{
volatile unsigned short *Temp1,*Temp2 ;
Temp1 = (unsigned short *)(((0x5555)<<1) | 0x1000000);
Temp2 = (unsigned short *)(((0x2aaa)<<1) | 0x1000000);
*Temp1 = 0xaa;
*Temp2 = 0x55;
*Temp1 = 0x80;
*Temp1 = 0xaa;
*Temp2 = 0x55;
*Temp1 = 0x10;
delay_n_ms(70); //waiting for 70ms
}
//write one word(2 bytes)
char WordProgram(void *addr, unsigned short inDat)
{
unsigned int i;
volatile unsigned short *Temp1,*Temp2 ;
i = (unsigned int)addr;
Temp1 = (unsigned short *)(((0x5555)<<1) | (i & 0xffc00000));
Temp2 = (unsigned short *)(((0x2aaa)<<1) | (i & 0xffc00000));
*Temp1 = 0xaa;
*Temp2 = 0x55;
*Temp1 = 0xa0;
*((unsigned short *)addr) = inDat;
delay_n_us(15); // Waiting for 15 us
if (*((unsigned short *)addr) == inDat)
{
return 0;
}
else
{
return 1;
}
}
/****************************************************************************************/
/* Function Name : WriteFlash */
/* Object : write flash */
/* Input Parameters : <Des> = the Destination Address */
/* : <Src> = the Source Address */
/* : <Num> = quantity of bytes that to be write */
/* Output Parameters : 0 - right, 1 - wrong */
/****************************************************************************************/
char WriteFlash(void *Des, void *Src, unsigned int Num)
{
unsigned int i;
unsigned short *DesAddr, *SrcAddr, *BaseAddr;
i = (unsigned int)Src;
SrcAddr = (unsigned short *)(i & 0xfffffffe);
i = (unsigned int)Des;
DesAddr = (unsigned short *)(i & 0xfffffffe);
BaseAddr= (unsigned short *)(i & 0xfffff000);
for (i=0; i<Num; i+=2)
{
if ((((unsigned int)DesAddr-(unsigned int)BaseAddr)&0XFFF)==0)
{
SectorErase(DesAddr);
}
if (WordProgram(DesAddr++,*SrcAddr++))
{
return 1;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -