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