📄 smallflash.c
字号:
#include "SmallFlash.h"
#define OS_EXIT_CRITICAL()
#define OS_ENTER_CRITICAL()
#define DQ7 0x80
#define DQ6 0x40
#define DQ54 0x60
void FlashWriteCell(UDWORD dwOffset,UWORD wdData)
{
UWORD* pAddr = (UWORD*)FLASH_BASE;
OS_ENTER_CRITICAL();
pAddr += dwOffset;
*pAddr = wdData;
OS_EXIT_CRITICAL();
return;
}
void FlashReadCell(UDWORD dwOffset,UWORD* pData)
{
UWORD* pAddr = (UWORD*)FLASH_BASE;
pAddr += dwOffset;
OS_ENTER_CRITICAL();
*pData = *pAddr;
OS_EXIT_CRITICAL();
}
BOOL FlashUnlock(UDWORD dwOffset)
{
//FlashWriteCell(0x5555, 0xAA);
//FlashWriteCell(0x2AAA, 0x55);
//FlashWriteCell(0x5555, 0xA0);
FlashWriteCell(dwOffset, 0x40);
return TRUE;
}
void FlashReset()
{
//向任意地址写0xFF
FlashWriteCell(0x0000,0xFFFF);
}
BOOL FlashErasePollToggleBit(UDWORD dwOffset)
{
UWORD btData0;
int i,j;
for(i=0;i<0x1000;i++)
{
for(j=0;j<0x10;j++)
asm("NOP;");
//发送0x70命令
FlashWriteCell(dwOffset,0x70);
for(j=0;j<0x10;j++)
asm("NOP;");
//读状态
FlashReadCell(dwOffset,&btData0);
if(!(btData0 & DQ7))
{
continue;
}
//btData0=0x80;
if(!(btData0 & DQ54))
{
//bit5bit4==00成功擦除
return TRUE;
}
}
return FALSE;
}
BOOL FlashPollToggleBit(UDWORD dwOffset)
{
UWORD btData0;
int i,j;
for(i=0;i<0x100;i++)
{
for(j=0;j<0x10;j++)
asm("NOP;");
//发送0x70命令
FlashWriteCell(dwOffset,0x70);
for(j=0;j<0x10;j++)
asm("NOP;");
//读状态
FlashReadCell(dwOffset,&btData0);
if(!(btData0 & DQ7))
{
continue;
}
//btData0=0x80;
if(!(btData0 & DQ54))
{
//bit5bit4==00成功擦除
return TRUE;
}
}
return FALSE;
}
/***********************************************
// 函数名称: FlashEraseChip
// 函数说明: 删除整个芯片数据
// 返回值 : BOOL :
***********************************************/
BOOL FlashEraseChip()
{
UDWORD i;
for(i=0;i<FLASH_SIZE / FLASH_BLOCK_SIZE;i++)
{
if(!FlashEraseBlock(i))
{
return FALSE;
}
}
return TRUE;
}
/***********************************************
// 函数名称: FlashEraseBlock
// 函数说明: 删除指定块数据
// 返回值 : BOOL :
// 参数说明: UDWORD dwBlockNum : 待删除的块号,从0开始编号
***********************************************/
BOOL FlashEraseBlock(UDWORD dwBlockNum)
{
UDWORD dwOffset;
UDWORD i;
if(dwBlockNum >= FLASH_SIZE / FLASH_BLOCK_SIZE)
return FALSE;//非法块号
dwOffset = dwBlockNum * FLASH_BLOCK_SIZE;
dwOffset >>= 1;
FlashWriteCell(dwOffset, 0x20);
FlashWriteCell(dwOffset, 0xD0);
FlashErasePollToggleBit(dwOffset);
for(i=0;i<0xc00000;i++)
asm("NOP;");
FlashReset();
return TRUE;
}
/***********************************************
// 函数名称: FlashGetID
// 函数说明: 得到FlashID
// 返回值 : UWORD : 返回设备ID
***********************************************/
UWORD FlashGetID()
{
UWORD wdDeviceCode = 0,wdManCode = 0;
//FlashWriteCell(0x5555, 0xaa);
//FlashWriteCell(0x2AAA, 0x55);
FlashWriteCell(0x5555, 0x90);
FlashReadCell(0,&wdManCode);
FlashReadCell(1,&wdDeviceCode);
FlashReset();
return (wdDeviceCode|(wdManCode<<8));
}
/***********************************************
// 函数名称: FlashWriteData
// 函数说明: 向Flash写入数据
// 返回值 : BOOL :
// 参数说明: UDWORD dwOffset : Flash偏移量,以字节计,且必须是2的整数倍
// 参数说明: UDWORD dwCount : 写入的数据个数,以字节计,且必须是2的整数倍
// 参数说明: UDWORD dwStride : 无效,且只能使用1
// 参数说明: const UWORD *pData : 待写数据缓冲区
***********************************************/
BOOL FlashWriteData(UDWORD dwOffset,UDWORD dwCount,UDWORD dwStride,void *pData)
{
UDWORD i,j;
UWORD *pwdData = (UWORD*)pData;
//将字节操作转换为UWORD操作
dwOffset >>= 1;
dwCount >>= 1;
dwStride = 1;
for (i = 0; i < dwCount; i++)
{
FlashWriteCell(dwOffset, 0x40);//准备写flash
FlashWriteCell(dwOffset, pwdData[i]);
if(!FlashPollToggleBit(dwOffset))
{
//FlashReset();
//return FALSE;
}
dwOffset += dwStride;
}
FlashReset();
return TRUE;
}
/***********************************************
// 函数名称: FlashReadData
// 函数说明: 从Flash中读数据
// 返回值 : BOOL :
// 参数说明: UDWORD dwOffset : Flash偏移量,以字节计,且必须是2的整数倍
// 参数说明: UDWORD dwCount : 读数据个数,以字节计,且必须是2的整数倍
// 参数说明: UDWORD dwStride : 无效,且只能使用1
// 参数说明: void *pData : 存放所读数据缓冲区,以节对齐
***********************************************/
BOOL FlashReadData(UDWORD dwOffset,UDWORD dwCount,UDWORD dwStride,void *pData)
{
UDWORD i,j;
UWORD *pwdData = (UWORD*)pData;
//将字节操作转换为UWORD操作
dwOffset >>= 1;
dwCount >>= 1;
dwStride = 1;
for (i = 0; i < dwCount; i++)
{
FlashReadCell(dwOffset, &pwdData[i]);
dwOffset += dwStride;
}
FlashReset();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -