/*=======================================================*/
/* Filename: EEPROM.cpp */
/* Description: */
/*=======================================================*/
/************************************************************************************
函数名: App_EEPROMAction()
功能描述: EEPROM读写操作
函数调用: Drv_EEPROMPageWrite()、App_ParamEEPROMW()、App_HistoryEEPROMW()
***********************************************************************************/
void Class_EEPROM::App_EEPROMAction(void)
{
if(objSystem.m_st_FlagSystem.bTimer1ms == 1)
{
m_i16_t1msCnt ++;
if(m_i16_t1msCnt > 5)
{
m_i16_t1msCnt = 0;
if(m_st_ParamFresh.bDefaultFresh == 1)
{
Drv_EEPROMWordWrite(DedaultValue, 0x2010);
m_st_ParamFresh.bDefaultFresh = 0;
}
else if(m_st_ParamFresh.bMainFaultFlagFresh == 1)
{
Drv_EEPROMWordWrite(MainFaultFlagAddr,objUtility.m_u16_MainFaultFlag);
m_st_ParamFresh.bMainFaultFlagFresh = 0;
}
else if(m_st_ParamFresh.bUPSIDFresh == 1)
{
Drv_EEPROMWordWrite(UpsIdSetAddr, objDigitalIO.m_st_HardwareSignalAdd.bUpsID);
m_st_ParamFresh.bUPSIDFresh = 0;
}
else if(objEEPROM.m_st_AdjSetFresh.bIoutAdjFresh == 1)
{
Drv_EEPROMWordWrite(IoutAdjAddr, objSettings.m_i16_KsIoutSet);
objEEPROM.m_st_AdjSetFresh.bIoutAdjFresh = 0;
}
else if (m_st_ParamFresh.bUPSFreqOutSetFresh == 1)
{
Drv_EEPROMWordWrite(UPSFreqOutSetAddr, objSettings.m_i16_UPSFreqOut);
m_st_ParamFresh.bUPSFreqOutSetFresh = 0;
}
else if (m_st_ParamFresh.bInvAutoOnDelayFresh == 1)
{
Drv_EEPROMWordWrite(InvAutoOnDelayAddr, objSettings.m_i16_InvAutoOnDelay);
m_st_ParamFresh.bInvAutoOnDelayFresh = 0;
}
else if (m_st_ParamFresh.bSelfAgingActionFresh == 1)
{
Drv_EEPROMWordWrite(SelfAgingActionAddr, objSystem.m_st_FlagSystem.bSelfAgingAction);
m_st_ParamFresh.bSelfAgingActionFresh = 0;
}
else if (m_st_ParamFresh.bCurrOutSetFresh == 1)
{
Drv_EEPROMWordWrite(CurrOutSetAddr, objSettings.m_st_UPSModeRun.bCurrOut);
m_st_ParamFresh.bCurrOutSetFresh = 0;
}
else if (m_st_ParamFresh.bVoutPrtSetFresh == 1)
{
Drv_EEPROMWordWrite(VoutPrtSetAddr, objSettings.m_i16_VoutPrtSet);
m_st_ParamFresh.bVoutPrtSetFresh = 0;
}
}
}
}
/************************************************************************************
函数名称: Drv_EEPROMPageWrite()
功能描述: EEPROM页数据写入函数
把*pSource指向的缓冲区的m_i16_Num(<=7)个数据存入以m_u16_Addr为首地址的EEPROM
空间
函数调用: 无
************************************************************************************/
void Class_EEPROM::Drv_EEPROMPageWrite(UINT16 m_u16_Addr, INT16 m_i16_Num, UINT16 *pSource)
{
INT16 m_i16_DataCnt,m_i16_Temp;
m_i16_DataCnt = m_i16_Num << 1;
I2caRegs.I2CCNT = m_i16_DataCnt + 2;
I2caRegs.I2CDXR = m_u16_Addr >> 8;
I2caRegs.I2CDXR = m_u16_Addr & 0x00FF;
for(m_i16_Temp = 0;m_i16_Temp < m_i16_Num;m_i16_Temp ++)
{
I2caRegs.I2CDXR = *(pSource + m_i16_Temp) >> 8;
I2caRegs.I2CDXR = *(pSource + m_i16_Temp) & 0x00FF;
}
I2caRegs.I2CMDR.all = 0x6E20; // I2C模块配置为:master,有停止位的发送
}
/************************************************************************************
函数名称: Drv_EEPROMWordWrite()
功能描述: EEPROM字数据写入函数
写入16位数据m_u16_Data到指定地址m_u16_Addr
函数调用: 无
************************************************************************************/
void Class_EEPROM::Drv_EEPROMWordWrite(UINT16 m_u16_Addr, UINT16 m_u16_Data)
{
I2caRegs.I2CCNT = 4; // 发送4个字节
I2caRegs.I2CDXR = m_u16_Addr >> 8; // 发送16位的地址和数据,先发高8位,后发低8位
I2caRegs.I2CDXR = m_u16_Addr & 0x00FF;
I2caRegs.I2CDXR = m_u16_Data >> 8;
I2caRegs.I2CDXR = m_u16_Data & 0x00FF;
I2caRegs.I2CMDR.all = 0x6E20; // I2C模块配置为:master,有停止位的发送
}
/************************************************************************************
函数名: App_DataRead()
功能描述: 读出以u16_Addr为首地址的1个校正参数
函数调用: Drv_EEPROMRead();
***********************************************************************************/
inline UINT16 Class_EEPROM::App_DataRead(UINT16 m_u16_Addr)
{
UINT16 u16ParamTemp;
Drv_EEPROMRead(m_u16_Addr, 1, &u16ParamTemp);
return(u16ParamTemp);
}
/************************************************************************************
函数名称: Drv_EEPROMRead()
功能描述: EEPROM数据读取函数
读出指定首地址m_u16_Addr中的m_i16_Num个16位数据存入*pDest指向的缓冲区
函数调用: 无
************************************************************************************/
void Class_EEPROM::Drv_EEPROMRead(UINT16 m_u16_Addr, INT16 m_i16_Num, UINT16 *pDest)
{
INT16 m_i16_Temp0,m_i16_Temp1,m_i16_Temp2;
UINT16 m_i16_DataL,m_i16_DataH,m_i16_DataCnt; // 存放读出的数据的临时变量
m_i16_Temp1 = 0;
m_i16_Temp2 = 0;
m_i16_DataCnt = m_i16_Num << 1;
I2caRegs.I2CCNT = 2; // 发送2个字节的地址
I2caRegs.I2CDXR = m_u16_Addr >> 8;
I2caRegs.I2CDXR = m_u16_Addr & 0x00FF;
I2caRegs.I2CMDR.all = 0x6620; // I2C模块配置为master,无停止位的发送方式
while (I2caRegs.I2CSTR.bit.ARDY != 1) // 寄存器不可读
{
m_i16_Temp1 ++;
if(m_i16_Temp1 > 5000)
{
return; // 错误返回
}
}
I2caRegs.I2CCNT = m_i16_DataCnt; // 读回2个字节的数据
I2caRegs.I2CMDR.all = 0x6C20; // I2C模块配置为master,有停止位的接收
while(I2caRegs.I2CMDR.bit.STP == 1) // 数据接收没有结束
{
m_i16_Temp2 ++;
if(m_i16_Temp2 > 5000)
{
return; // 错误返回
}
}
for(m_i16_Temp0 = 0;m_i16_Temp0 < m_i16_Num;m_i16_Temp0 ++)// 数据读取
{
m_i16_DataH = I2caRegs.I2CDRR; // 读取数据的高8位
m_i16_DataL = I2caRegs.I2CDRR; // 读取数据的低8位
*(pDest + m_i16_Temp0) = (m_i16_DataH << 8) | m_i16_DataL;
}
I2caRegs.I2CSTR.bit.ARDY = 1; // 清寄存器可读标志位
}
/****************************************************************************
函数名称: Drv_EEPROMWriteAll()
功能描述: EEPROM页数据写入函数
把*pSource指向的缓冲区的*pNum(任意)个数据存入以*pStartAddr为首地址的EEPROM
空间,并返回改变后的pSource
函数调用: Drv_EEPROMPageWrite(*pStartAddr, m_i16_PageWords, pSourceTemp)
****************************************************************************/
UINT16 *Class_EEPROM::Drv_EEPROMWriteAll(UINT16 *pStartAddr, INT16 *pNum, UINT16 *pSource)
{
INT16 m_i16_PageWords; // 本页还剩多少字节可写
UINT16 *pSourceTemp;
m_i16_PageWords = (MaxPageBytes - (*pStartAddr % MaxPageBytes)) >> 1;
pSourceTemp = pSource;
if(*pNum >= MaxWordsWrite)
{
if(m_i16_PageWords > MaxWordsWrite)
{
Drv_EEPROMPageWrite(*pStartAddr, MaxWordsWrite, pSourceTemp);
pSourceTemp = pSourceTemp + MaxWordsWrite;
*pStartAddr = *pStartAddr + (MaxWordsWrite << 1);
*pNum = *pNum - MaxWordsWrite;
}
else
{
Drv_EEPROMPageWrite(*pStartAddr, m_i16_PageWords, pSourceTemp);
pSourceTemp = pSourceTemp + m_i16_PageWords;
*pStartAddr = *pStartAddr + (m_i16_PageWords << 1);
*pNum = *pNum - m_i16_PageWords;
}
}
else
{
if(*pNum < m_i16_PageWords)
{
Drv_EEPROMPageWrite(*pStartAddr, *pNum, pSourceTemp);
pSourceTemp = pSourceTemp + *pNum;
*pStartAddr = *pStartAddr + (*pNum << 1);
*pNum = 0;
}
else
{
Drv_EEPROMPageWrite(*pStartAddr, m_i16_PageWords, pSourceTemp);
pSourceTemp = pSourceTemp + m_i16_PageWords;
*pStartAddr = *pStartAddr + (m_i16_PageWords << 1);
*pNum = *pNum -m_i16_PageWords;
}
}
return(pSourceTemp);
}
//===========================================================================
// End of file.
//===========================================================================
评论0