📄 flash.c
字号:
BusSetOutput(); // Default is Output
FLASH_RE_HIGH;
FLASH_WE_HIGH;
FLASH_CLE_HIGH;
FlashWriteData(CMD_READ_STATUS);
FLASH_CLE_LOW;
BusSetInput();
Result = FlashReadData();
FLASH_CE_HIGH;
BusSetOutput(); // Default is Output
return Result;
}
void FlashInit()
{
FlashReset();
FlashReadDeviceInfo();
switch (FlashSizer) {
case 0xE6:
case 0x73:
case 0x75:
FlashLevel = FLASH_TYPE_32MB;
FlashPageBit = 9;
FlashPageByte = 512;
FlashBlockPage = 32;
FlashTotalBlock = 2048;
FlashTotalPage = 32 * 2048L;
break;
case 0x36:
case 0x76:
FlashLevel = FLASH_TYPE_64MB;
FlashPageBit = 9;
FlashPageByte = 512;
FlashBlockPage = 32;
FlashTotalBlock = 4096;
FlashTotalPage = 32 * 4096L;
break;
case 0x79:
FlashLevel = FLASH_TYPE_128MB;
FlashPageBit = 9;
FlashPageByte = 512;
FlashBlockPage = 32;
FlashTotalBlock = 8192;
FlashTotalPage = 32 * 8192L;
break;
case 0xA1:
case 0xF1:
FlashLevel = FLASH_TYPE_128MB;
FlashPageBit = 11;
FlashPageByte = 2048;
FlashBlockPage = 64;
FlashTotalBlock = 1024;
FlashTotalPage = 64 * 1024L;
break;
case 0xDA:
FlashLevel = FLASH_TYPE_256MB;
FlashPageBit = 11;
FlashPageByte = 2048;
FlashBlockPage = 64;
FlashTotalBlock = 2048;
FlashTotalPage = 64 * 2048L;
break;
default:
FlashSizer = 0xFF;
break;
}
}
#ifdef SUPPORT_FLASH_WRITE
BYTE FlashEraseRealPage(UINT32 PageAddr)
{
BYTE Result;
FLASH_WP_HIGH;
FLASH_CE_LOW;
BusSetOutput(); // Default is Output
FLASH_RE_HIGH;
FLASH_WE_HIGH;
FLASH_CLE_HIGH;
FlashWriteData(CMD_ERASE_1st);
FLASH_CLE_LOW;
FLASH_ALE_HIGH;
FlashWriteData((PageAddr ) & 0xFF);
FlashWriteData((PageAddr >> 8) & 0xFF);
if (FlashTotalPage > 65536L) FlashWriteData((PageAddr >> 16) & 0xFF);
FLASH_ALE_LOW;
FLASH_CLE_HIGH;
FlashWriteData(CMD_ERASE_2nd);
FLASH_CLE_LOW;
FlashWaitBusy();
Result = FlashReadStatus();
FLASH_CE_HIGH;
FLASH_WP_LOW;
return !(Result & (1 << 0));
}
BYTE FlashWriteRealPage(UINT32 PageAddr, BYTE *pSource)
{
BYTE Result;
UINT16 i;
FLASH_WP_HIGH;
FLASH_CE_LOW;
BusSetOutput(); // Default is Output
FLASH_RE_HIGH;
FLASH_WE_HIGH;
FLASH_CLE_HIGH;
FlashWriteData(CMD_PROGRAM_1st);
FLASH_CLE_LOW;
FLASH_ALE_HIGH;
FlashWriteData(0x00);
if (FlashPageByte == 2048) FlashWriteData(0x00);
FlashWriteData((PageAddr ) & 0xFF);
FlashWriteData((PageAddr >> 8) & 0xFF);
if (FlashTotalPage > 65536L) FlashWriteData((PageAddr >> 16) & 0xFF);
FLASH_ALE_LOW;
for (i = 0; i < FlashPageByte; i++) {
FlashWriteData(pSource[i]);
}
FLASH_CLE_HIGH;
FlashWriteData(CMD_PROGRAM_2nd);
FLASH_CLE_LOW;
FlashWaitBusy();
Result = FlashReadStatus();
FLASH_CE_HIGH;
FLASH_WP_LOW;
return !(Result & (1 << 0));
}
#endif
void FlashReadRealPage(UINT32 PageAddr, BYTE *pTarget)
{
UINT16 i;
FLASH_CE_LOW;
BusSetOutput(); // Default is Output
FLASH_RE_HIGH;
FLASH_WE_HIGH;
FLASH_CLE_HIGH;
FlashWriteData(CMD_READ_1_0);
FLASH_CLE_LOW;
FLASH_ALE_HIGH;
FlashWriteData(0x00);
if (FlashPageByte == 2048) FlashWriteData(0x00);
FlashWriteData((PageAddr ) & 0xFF);
FlashWriteData((PageAddr >> 8) & 0xFF);
if (FlashTotalPage > 65536L) FlashWriteData((PageAddr >> 16) & 0xFF);
FLASH_ALE_LOW;
if (FlashPageByte == 2048) {
FLASH_CLE_HIGH;
FlashWriteData(CMD_READ_3);
FLASH_CLE_LOW;
}
BusSetInput();
FlashWaitBusy();
for (i = 0; i < FlashPageByte; i++) {
pTarget[i] = FlashReadData();
}
FLASH_CE_HIGH;
BusSetOutput(); // Default is Output
}
void FlashBlockCheck()
{
unsigned char i;
FlashReadRealPage(0L, FlashBuffer);
if (FlashBuffer[100] == FLASH_TABLE_ID1 &&
FlashBuffer[101] == FLASH_TABLE_ID2 &&
FlashBuffer[102] == FLASH_TABLE_ID3 &&
FlashBuffer[103] <= FLASH_TABLE_SIZE) {
FlashBlockNumber = FlashBuffer[103];
for (i = 0; i < FlashBlockNumber; i++) {
FlashBlockBuffer[i] = ((unsigned long *)FlashBuffer)[i];
}
}
else {
FlashBlockNumber = 100;
}
}
void FlashBlockOffset(UINT32 *pAddr)
{
UINT32 BlockAddr;
BYTE i;
BlockAddr = *pAddr;
BlockAddr += FlashBlockPage;
if (BlockAddr > 0L && BlockAddr < FlashBlockPage) {
BlockAddr = FlashTotalPage - FlashBlockPage;
}
else
if (FlashBlockNumber && FlashBlockNumber <= FLASH_TABLE_SIZE) {
for (i = 0; i < FlashBlockNumber; i++) {
if (BlockAddr >= FlashBlockBuffer[i])
BlockAddr += FlashBlockPage;
else
break;
}
}
*pAddr = BlockAddr;
}
#else // Flash controlled by MCU
void FlashSendData(BYTE SendData)
{
BYTE BitMap;
BYTE i;
BitMap = 0x80;
for (i = 0; i < 8; i++) {
if (SendData & BitMap) {
FLASH_SO_HIGH;
}
else {
FLASH_SO_LOW;
}
// FlashDelay(80);
FLASH_SCK_HIGH;
BitMap >>= 1;
// FlashDelay(80);
FLASH_SCK_LOW;
// FlashDelay(80);
}
FlashDelay(280);
}
BYTE FlashReadData()
{
BYTE ReturnData = 0;
BYTE i;
for (i = 0; i < 8; i++) {
ReturnData <<= 1;
FLASH_SCK_HIGH;
// FlashDelay(40);
FLASH_SCK_LOW;
// FlashDelay(40);
if (FLASH_SI_READ)
ReturnData |= 0x01;
// FlashDelay(100);
}
FlashDelay(230);
return ReturnData;
}
BYTE FlashSendReadData(BYTE SendData)
{
BYTE BitMap;
BYTE ReturnData = 0;
BYTE i;
BitMap = 0x80;
for (i = 0; i < 8; i++) {
ReturnData <<= 1;
// FlashDelay(100);
if (SendData & BitMap) {
FLASH_SO_HIGH;
}
else {
FLASH_SO_LOW;
}
// FlashDelay(200);
FLASH_SCK_HIGH;
BitMap >>= 1;
// FlashDelay(200);
FLASH_SCK_LOW;
// FlashDelay(100);
if (FLASH_SI_READ)
ReturnData |= 0x01;
}
FlashDelay(400);
return ReturnData;
}
#define MAX_BUSY_DELAY 0x4000
void FlashWaitBusy()
{
BYTE Data;
UINT16 i;
FLASH_SCK_LOW;
FLASH_CS_LOW;
for (i = 0; i < MAX_BUSY_DELAY; i++) {
FlashDelay(500);
Data = FlashSendReadData(CMD_STATUS_REG_READ);
// psprintf(LineBuffer, "STATUS:%02x-%04x", Data, i);
// MenuPrintMessage(3);
if (Data == STATUS_NOT_BUSY) {
break;
}
}
FLASH_CS_HIGH;
if (i >= MAX_BUSY_DELAY) {
// psprintf(LineBuffer, "ERROR : FLASH Wait too long.(%04x)", i);
// MenuPrintMessage(4);
psprintf(LineBuffer, "无效卡或者卡接触不良");
MenuPrintMessage(3);
psprintf(LineBuffer, "请关机,检查卡");
MenuPrintMessage(4);
while (1);
}
}
BYTE FlashReadBusy()
{
return (FlashSendReadData(CMD_STATUS_REG_READ) != STATUS_NOT_BUSY);
}
#endif
#ifdef SUPPORT_FLASH_WRITE
#if 0
void FlashErasePage(UINT32 PageAddr)
{
#ifdef SUPPORT_GPIO_BUS_FUNCTION
FlashBlockOffset(&PageAddr);
FlashEraseRealPage(PageAddr);
#else
FlashWaitBusy();
FLASH_SCK_LOW;
FLASH_CS_LOW;
FlashSendData(CMD_MEMORY_ERASE_BUF); FlashDelay(80);
FlashSendData((PageAddr >> 24) & 0xff); FlashDelay(80);
FlashSendData((PageAddr >> 16) & 0xff); FlashDelay(80);
FlashSendData((PageAddr >> 8) & 0xff); FlashDelay(80);
FlashSendData((PageAddr ) & 0xff); FlashDelay(80);
FlashSendData(0x0b); FlashDelay(80);
FlashSendData(0xad); FlashDelay(80);
FlashSendData(0xfa); FlashDelay(80);
FlashSendData(0xce); FlashDelay(80);
FLASH_CS_HIGH;
#endif
#if 0
PollingUartRecv();
#endif
#ifdef SUPPORT_WATCH_DOG
PollingWatchDog();
#endif SUPPORT_WATCH_DOG
#ifdef SUPPORT_DSA_DEVICE
PollingDSA();
#endif
}
void FlashWritePage(UINT32 PageAddr, UINT16 BufferAddr, BYTE *pSource, UINT16 Count)
{
#ifdef SUPPORT_GPIO_BUS_FUNCTION
UINT16 i, j;
FlashBlockOffset(&PageAddr);
for (i = BufferAddr, j = 0; j < Count; i++, j++) {
FlashBuffer[i] = pSource[j];
}
FlashWriteRealPage(PageAddr, FlashBuffer);
#else
UINT16 i;
FlashWaitBusy();
FLASH_SCK_LOW;
FLASH_CS_LOW;
FlashSendData(CMD_MEMORY_PAGE_BUF1); FlashDelay(80);
FlashSendData((PageAddr >> 24) & 0xff); FlashDelay(80);
FlashSendData((PageAddr >> 16) & 0xff); FlashDelay(80);
FlashSendData((PageAddr >> 8) & 0xff); FlashDelay(80);
FlashSendData((PageAddr ) & 0xff); FlashDelay(80);
FlashSendData(0xfa); FlashDelay(80);
FlashSendData(0xce); FlashDelay(80);
FlashSendData(0x0b); FlashDelay(80);
FlashSendData(0xad); FlashDelay(80);
for (i = 0; (i < Count) && (i + BufferAddr < FLASH_PAGE_SIZE); i++) {
FlashSendData(pSource[i]);
}
FLASH_CS_HIGH;
#endif
#if 0
PollingUartRecv();
#endif
#ifdef SUPPORT_WATCH_DOG
PollingWatchDog();
#endif SUPPORT_WATCH_DOG
#ifdef SUPPORT_DSA_DEVICE
PollingDSA();
#endif
}
#endif
#ifdef SUPPORT_GPIO_BUS_FUNCTION
void FlashEraseByte(UINT32 ByteAddr)
{
ByteAddr = (INT32)ByteAddr >> FlashPageBit;
FlashBlockOffset(&ByteAddr);
FlashEraseRealPage(ByteAddr);
}
void FlashWriteByte(UINT32 ByteAddr, BYTE *pSource, UINT32 Count)
{
UINT32 i, j;
UINT32 Length;
UINT32 PageAddr;
UINT16 PageOffs;
PageOffs = ByteAddr & (FlashPageByte - 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -