ZDBMS/code_drv/McuFlash.c

369 lines
8.5 KiB
C
Raw Permalink Normal View History

2025-02-06 07:35:32 +00:00
/********************************************************************************
Copyright (C), Sinowealth Electronic. Ltd.
Author: Sino
Version: V0.0
Date: 2020/04/26
History:
V2.0 2020/04/26 Preliminary
********************************************************************************/
#include "Main.h"
BOOL bMcuFlashWrWaitFlg;
BOOL bMcuFlashWrFlg;
BOOL bMcuFlashErr;
U8 xdata ucMcuFlashWrValid;
U8 xdata bMcuFlashWrWaitCnt;
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashWrOneByte
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: McuFlashAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>WrData<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: д1<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
*************************************************************************************************/
void McuFlashWrOneByte(U16 McuFlashAddr, U8 WrData)
{
IrqDis();
McuFlashEn();
XPAGE = McuFlashAddr>>8;
IB_OFFSET = McuFlashAddr % 256;
IB_DATA = WrData;
IB_CON1 = 0x6E;
IB_CON2 = 0x05;
IB_CON3 = 0x0A;
IB_CON4 = 0x09;
if(XPAGE == (McuFlashAddr>>8))
{
IB_CON5 = 0x06;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
McuFlashDis();
IrqEn();
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashBlankCheck
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: McuFlashAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: 0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ0<EFBFBD><EFBFBD>Eraseʧ<EFBFBD>ܣ<EFBFBD>1<EFBFBD><EFBFBD>ȫ0<EFBFBD><EFBFBD>Erase<EFBFBD>ɹ<EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>Erase<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>Sector<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ȫΪ0
*************************************************************************************************/
BOOL McuFlashBlankCheck(U16 McuFlashAddr)
{
BOOL Result = 1;
U16 i;
for(i=0; i<MCUFLASH_SECTOR_SIZE; i++)
{
if(CBYTE[McuFlashAddr+i] != 0x00)
{
Result = 0;
break;
}
}
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashDataCheck
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: McuFlashAddr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: 0<EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: У<EFBFBD>д<EFBFBD><EFBFBD>Sector<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>XRAM<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
*************************************************************************************************/
BOOL McuFlashDataCheck(U16 McuFlashAddr, U16 XramAddr)
{
BOOL Result = 1;
U8 xdata *ptr = (U8 xdata *)XramAddr; //ǿ<>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ϊ<EFBFBD><CEAA>ַ<EFBFBD><D6B7>ֵ<EFBFBD><D6B5>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
U16 i;
for(i=0; i<MCUFLASH_SECTOR_SIZE; i++)
{
if(CBYTE[McuFlashAddr+i] != *(ptr+i))
{
Result = 0;
break;
}
}
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashWrSector
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: д1<EFBFBD><EFBFBD>Sector<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
BOOL McuFlashWrSector(U16 McuFlashAddr, U16 XramAddr)
{
BOOL Result = 0;
U16 i;
U8 xdata *ptr = (U8 xdata *)XramAddr; //ǿ<>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ϊ<EFBFBD><CEAA>ַ<EFBFBD><D6B7>ֵ<EFBFBD><D6B5>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0; i<MCUFLASH_SECTOR_SIZE; i++)
{
IB_OFFSET = McuFlashAddr+i;
XPAGE = (McuFlashAddr+i)>>8;
IB_DATA = *(ptr+i);
IB_CON1 = 0x6E;
if(!EA)
{
IB_CON2 = 0x05;
if(FLASHCON)
{
IB_CON3 = 0x0A;
if(ucMcuFlashWrValid == 0x55)
{
IB_CON4 = 0x09;
if(XPAGE == ((McuFlashAddr+i)>>8))
{
IB_CON5 = 0x06;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Result = 1;
}
else
{
Result = 0;
break;
}
}
else
{
Result = 0;
break;
}
}
else
{
Result = 0;
break;
}
}
else
{
Result = 0;
break;
}
}
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashWrite
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: McuFlashAddr<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȹ̶<EFBFBD>Ϊ1<EFBFBD><EFBFBD>Sector
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: 0<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>1<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: дMCU Flash<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>Sector:
1.Erase Sector
2.<EFBFBD><EFBFBD><EFBFBD>ǰSector<EFBFBD>Ƿ<EFBFBD>ȫΪ0
3.<EFBFBD><EFBFBD>XRAM<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
4.У<EFBFBD><EFBFBD>XRAM<EFBFBD><EFBFBD>MCU Flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>һ<EFBFBD><EFBFBD>
*************************************************************************************************/
BOOL McuFlashWrite(U16 McuFlashAddr, U16 XramAddr)
{
BOOL Result = 0;
McuWDTClear(); //<2F><EFBFBD>Ź<EFBFBD>
IrqDis(); //<2F>ر<EFBFBD><D8B1>ж<EFBFBD>Դ
McuFlashEn();
XPAGE = McuFlashAddr >> 8;
IB_CON1 = 0xE6;
if(!EA)
{
IB_CON2 = 0x05;
if(FLASHCON)
{
IB_CON3 = 0x0A;
if(ucMcuFlashWrValid == 0x55)
{
IB_CON4 = 0x09;
if(XPAGE == (McuFlashAddr >> 8))
{
IB_CON5 = 0x06;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(McuFlashBlankCheck(McuFlashAddr)) //<2F><><EFBFBD><EFBFBD>
{
if(McuFlashWrSector(McuFlashAddr, XramAddr)) //д<><D0B4>
{
if(McuFlashDataCheck(McuFlashAddr, XramAddr)) //У<><D0A3>
{
Result = 1;
}
}
}
}
}
}
}
IB_CON1 = 0;
IB_CON2 = 0;
IB_CON3 = 0;
IB_CON4 = 0;
IB_CON5 = 0;
McuFlashDis();
XPAGE = 0x00;
IrqEn();
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashProcess
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: дMCU Flash<EFBFBD><EFBFBD>ͬʱ<EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>
*************************************************************************************************/
void McuFlashProcess(void)
{
BOOL McuFlashBk1WrFailFlg = 0, McuFlashBk2WrFailFlg = 0;
U16 VoltageMin;
if(bMcuFlashWrFlg)
{
bMcuFlashWrFlg = 0;
ucMcuFlashWrValid = 0x55; //<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
if(ucCellNum > 5) //6~10<31><30>Ӧ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD>Ҫ<EFBFBD>ܵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>10V
{
VoltageMin = 10000;
}
else //3~5<><35>Ӧ<EFBFBD>ã<EFBFBD><C3A3><EFBFBD>Ҫ<EFBFBD>ܵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>5V
{
VoltageMin = 5000;
}
if((Info.ulVoltage>=VoltageMin) && (E2uiCheckFlag==0x5AA5))
{
if(!McuFlashWrite(MCUFLASH_BK1_ADDR, XRAM_MAP_ADDR)) //<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
{
if(!McuFlashWrite(MCUFLASH_BK1_ADDR, XRAM_MAP_ADDR))
{
McuFlashBk1WrFailFlg = 1;
E2uiCheckFlag = 0xFFFF;
McuFlashWrOneByte(MCUFLASH_BK1_ADDR+510,0xFF);
McuFlashWrOneByte(MCUFLASH_BK1_ADDR+511,0xFF);
}
}
if(!McuFlashWrite(MCUFLASH_BK2_ADDR, XRAM_MAP_ADDR))
{
if(!McuFlashWrite(MCUFLASH_BK2_ADDR, XRAM_MAP_ADDR))
{
McuFlashBk2WrFailFlg = 1;
E2uiCheckFlag = 0xFFFF;
McuFlashWrOneByte(MCUFLASH_BK2_ADDR+510,0xFF);
McuFlashWrOneByte(MCUFLASH_BK2_ADDR+511,0xFF);
}
}
}
else
{
McuFlashBk1WrFailFlg = 1;
McuFlashBk2WrFailFlg = 1;
}
ucMcuFlashWrValid = 0x00;
if(McuFlashBk1WrFailFlg && McuFlashBk2WrFailFlg) //<2F><><EFBFBD><EFBFBD>Flash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λFlash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
{
bMcuFlashErr = 1;
}
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashRead
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: SourceAddr<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>TargetAddr<EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Length<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: 0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD>ж<EFBFBD>MCU Flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ0x5AA5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>
*************************************************************************************************/
BOOL McuFlashRead(U16 SourceAddr, U8 xdata *TargetAddr, U16 Length)
{
U16 i;
BOOL Result = 1;
U8 xdata *data TargetAddr1 = TargetAddr; //*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>data<74>ؼ<EFBFBD><D8BC>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ã<EFBFBD><C3A3>ǰ<EFBFBD>ָ<EFBFBD><D6B8>TargetAddr1<72><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>data<74><61><EFBFBD><EFBFBD>
IrqDis();
McuFlashEn();
McuWDTClear();
for(i=0; i<Length; i++)
{
*TargetAddr1 = CBYTE[SourceAddr+i];
TargetAddr1++;
}
McuFlashDis();
IrqEn();
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashWrWaitCheck
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪдMCU Flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ʱ2<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>޸IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д
*************************************************************************************************/
void McuFlashWrWaitCheck(void)
{
if(bMcuFlashWrWaitFlg)
{
if(++bMcuFlashWrWaitCnt >= MCU_FLASH_WATI_DELAY)
{
bMcuFlashWrWaitFlg = 0;
bMcuFlashWrWaitCnt = 0;
bMcuFlashWrFlg = 1;
}
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: McuFlashCheckFlg
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: McuFlashAddr<EFBFBD><EFBFBD>MCU Flash<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: 0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD>ж<EFBFBD>MCU Flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ0x5AA5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>
*************************************************************************************************/
BOOL McuFlashCheckFlg(U16 McuFlashAddr)
{
BOOL Result = 0;
McuFlashEn();
if(CWORD[McuFlashAddr/2] == 0x5AA5)
{
Result = 1;
}
McuFlashDis();
return Result;
}