📄 flash.c
字号:
/*
;************************************************************************************************************
;* 北京精仪达盛科技有限公司
;* 研 发 部
;*
;* http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------
;* 文件名称 : flash.c
;* 文件功能 : 该文件用于烧写SST39VF160所用的源函数
;* 补充说明 :
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM开发小组
;* 修改日期 : 2004/04/25
;* 版本声明 : V1.0.1
;**------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : XXXX
;* 创建日期 : XXXX
;* 版本声明 : XXXX
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
#include "../inc/44blib.h"
#include "../inc/flash.h"
static unsigned char state = 0;
/*
*************************************************************************************************************
- 函数名称 : static void CFIQueryExit(void)
- 函数说明 : CFI查询退出函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
static void CFIQueryExit(void)
{
CMD_ADDR0 = 0xaaaa;
CMD_ADDR1 = 0x5555;
CMD_ADDR0 = 0xf0f0;
state &= 0xfc;
}
/*
*************************************************************************************************************
- 函数名称 : static void SWPIDExit(void)
- 函数说明 : 退出函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
static void SWPIDExit(void)
{
CMD_ADDR0 = 0xf0f0;
state &= 0xfc;
}
/*
*************************************************************************************************************
- 函数名称 : static void CFIQueryEntry(void)
- 函数说明 : 请求访问函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
static void CFIQueryEntry(void)
{
if(state&1)
{
if(state&2)
SWPIDExit();
else
return;
}
CMD_ADDR0 = 0xaaaa;
CMD_ADDR1 = 0x5555;
CMD_ADDR0 = 0x9898;
state |= 1;
}
/*
*************************************************************************************************************
- 函数名称 : static void SWPIDEntry(void)
- 函数说明 : 请求ID访问函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
static void SWPIDEntry(void)
{
if(state&1)
{
if(state&2)
return;
else
CFIQueryExit();
}
CMD_ADDR0 = 0xaaaa;
CMD_ADDR1 = 0x5555;
CMD_ADDR0 = 0x9090;
state |= 3;
}
/*
*************************************************************************************************************
- 函数名称 : unsigned int GetFlashID(void)
- 函数说明 : 读取ID号函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
unsigned int GetFlashID(void)
{
unsigned int i;
SWPIDEntry();
i = *(unsigned short *)(0+ROM_BASE);
i |= (*(unsigned short *)(2+ROM_BASE))<<16;
SWPIDExit();
return i;
}
/*
*************************************************************************************************************
- 函数名称 : void GetFlashCFI(unsigned short *DataPtr)
- 函数说明 : 得到CFI
- 输入参数 : unsigned short *DataPtr
- 输出参数 : 无
*************************************************************************************************************
*/
void GetFlashCFI(unsigned short *DataPtr)
{
unsigned short i;
CFIQueryEntry();
for(i = 0x10; i<0x35; DataPtr++, i++)
*DataPtr = *(unsigned short *)(i*2+ROM_BASE);
CFIQueryExit();
}
/*
*************************************************************************************************************
- 函数名称 : void ChipErase(void)
- 函数说明 : 整片擦除函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void ChipErase(void)
{
if(state&1)
{
if(state&2)
SWPIDExit();
else
CFIQueryExit();
}
CMD_ADDR0 = 0xaaaa;
CMD_ADDR1 = 0x5555;
CMD_ADDR0 = 0x8080;
CMD_ADDR0 = 0xaaaa;
CMD_ADDR1 = 0x5555;
CMD_ADDR0 = 0x1010;
while(1)
{
unsigned short i;
i = *((volatile unsigned short *)0x6666)&0x40;
if(i!=*((volatile unsigned short *)0x6666)&0x40) //D6 == D6
continue;
if(*((volatile unsigned short *)0x8888)&0x80)
break; //D7 == 1
}
}
/*
*************************************************************************************************************
- 函数名称 : void SectorErase(unsigned int sector)
- 函数说明 : 块擦除
- 输入参数 : unsigned int sector
- 输出参数 : 无
*************************************************************************************************************
*/
void SectorErase(unsigned int sector)
{
unsigned short ok, count;
if(state&1)
{
if(state&2)
SWPIDExit();
else
CFIQueryExit();
}
sector += ROM_BASE;
CMD_ADDR0 = 0xaaaa;
CMD_ADDR1 = 0x5555;
CMD_ADDR0 = 0x8080;
CMD_ADDR0 = 0xaaaa;
CMD_ADDR1 = 0x5555;
*(volatile unsigned short *)sector = 0x3030;
ok = 0;
count = 60000;
while(count--)
{
unsigned short i;
i = *((volatile unsigned short *)sector)&0x40;
if(i!=*((volatile unsigned short *)sector)&0x40) //D6 == D6
continue;
if(*((volatile unsigned short *)sector)&0x80)
{
ok = 1;
break; //D7 == 1
}
}
Uart_Printf("Erase sector 0x%x ", sector-ROM_BASE);
if(ok)
Uart_Printf("ok\n");
else
Uart_Printf("failed\n");
}
/*
*************************************************************************************************************
- 函数名称 : void FlashProg(unsigned int ProgStart, unsigned short *DataPtr, unsigned int WordCnt)
- 函数说明 : flash烧写函数
- 输入参数 : unsigned int ProgStart, unsigned short *DataPtr, unsigned int WordCnt
- 输出参数 : 无
*************************************************************************************************************
*/
void FlashProg(unsigned int ProgStart, unsigned short *DataPtr, unsigned int WordCnt)
{
unsigned short ok, count;
unsigned short i, j;
ProgStart += ROM_BASE;
ok = 1;
for( ; WordCnt && ok; ProgStart+=2, DataPtr++, WordCnt--)
{
j = *DataPtr;
CMD_ADDR0 = 0xaaaa;
CMD_ADDR1 = 0x5555;
CMD_ADDR0 = 0xa0a0;
*(volatile unsigned short *)ProgStart = j;
count = 10000;
while(count --)
{
i = *(volatile unsigned short *)ProgStart&0x40;
if(i!=*(volatile unsigned short *)ProgStart&0x40) //D6 == D6
continue;
if((*(volatile unsigned short *)ProgStart&0x80)==(j&0x80))
break; //D7 == D7
}
if(count == 0) ok = 0;
}
if(ok)
Uart_Printf("program ok\n");
else
Uart_Printf("program failed\n");
}
/*
*************************************************************************************************************
- 函数名称 : void FlashRead(unsigned int ReadStart, unsigned short *DataPtr, unsigned int Size)
- 函数说明 : 读flash内容
- 输入参数 : unsigned int ReadStart, unsigned short *DataPtr, unsigned int Size
- 输出参数 : 无
*************************************************************************************************************
*/
void FlashRead(unsigned int ReadStart, unsigned short *DataPtr, unsigned int Size)
{
int i;
ReadStart += ROM_BASE;
for(i=0; i<Size/2; i++)
*(DataPtr+i) = *((unsigned short *)ReadStart+i);
}
/*
*************************************************************************************************************
- 函数名称 : int SectorProg(unsigned int begin, unsigned short *data, unsigned int size)
- 函数说明 : 块编程
- 输入参数 : unsigned int begin, unsigned short *data, unsigned int size
- 输出参数 : 无
*************************************************************************************************************
*/
int SectorProg(unsigned int begin, unsigned short *data, unsigned int size)
{
unsigned int tmp = 0x1000-(begin&0xfff);
if(tmp>size)
tmp = size;
for(; size;)
{
SectorErase(begin&0xfffff000); //4K Bytes boudary
FlashProg(begin, data, tmp/2);
size -= tmp;
begin += tmp;
data += tmp/2;
tmp = (size>0x1000)?0x1000:size;
}
return 0;
}
/*
*************************************************************************************************************
*- 结束文件 -*
*************************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -