Files
TXH1.0/User/FRam/FRam.c
T

437 lines
17 KiB
C
Raw Normal View History

2026-04-27 16:55:02 +08:00
/*C*****************************************************************************
* NAME: fRamDrive.c
*-------------------------------------------------------------------------------
*******************************************************************************/
/*_____ I N C L U D E S ______________________________________________________*/
//#define FRAM_INIT
#include "config.h" //全局声明
volatile s_uniGlobal_Typedef s_uniGlobal;
//参数初始化====================================================================
//密码
const u8 initFRam_Flag = 0x38;
const PrintInfo_Type InitPrintInfo={
" Ho So Giao Dich ",//交易记录
"TEN CUA HANG: ",//地址
"DIA CHI: ",//税号
"MA SO THUE: ",//
" ",
" ",
"SO VOL: ",//抢号
"SO TIEN: ",//金额
"SO LIT: ",//加油量
"DONGIA: ",//单价
" ",
"NGAY: ",
" ",
" ",
" ",
" ",
" ",
" ",
" ",
"CAM ON & HEN GAP LAI QUY KHACH !",
};
const MD_Port_Data_Type InitMD_Port_Data = {
//BaudRate StopBits Parity_Even POSType GunNumber MBCountTime Display_Type
{ 9600, 1, 0, 0, 0, 10, 0 ,MD_RS485,{0,0,0,0,0,0,0,0,0,0}},
{//Num Addr State Standby[35]
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
{0, 0, 0, },
}
};
/*typedef struct
{
char CMD_SOCKA[50];
char IMEI[20];
char APN[40];
char WiFIName[40];
char WiFIPassWord[20];
}WirelessData_Type;*/
//Tast URL http://test.joyfueling.com:8012/
// http://3.92.208.210:7011/
const POSData_Type InitPOSData={
//
//{"AT+SOCKA=TCP,3.92.208.210,7011\r\n"},POS_Connect_Typ_Station};
{"joyfuel.joyfueling.com,7011","","","KFB-2.4G","KFB123456"},POS_Connect_Typ_Station};
const u8 InitMD_Port_Num_Top = 0;
const ROM_UpData_Type InitROM_UpData = {{0x06},900};//主程序最大450K
const u32 InitPREXDATA_WaitUpNummber = 0;
const u32 InitPREXDATA_TTC = 0;
const PREXDATA_Type initPrintLastRecord= {0,0,0,0,0,0,0,0,0};
const POSNetSetState_TypeDef InitPOSNetSetState;
const MD_Multiplex_Port_Data_Type InitMD_Multiplex_Port_Data;//端口5,多路复用口PREXDATA_NowFrameLen
const WhiteList_Type InitWhiteList;
const PREXDATA_Upload_Type InitPREXDATA_Upload;
//==============================================================================
const framDataIndex FDITab[] =
{ ///FRAM数据1区(数据操作相对不频烦)
/// pInitData; upData pData firstAdr; len; Group Tpye; //(注意,校验增加在数据包尾)
{(u8*)&initFRam_Flag, (u8*)(&buf_FRam_Flag), (u8*)(&TXHData.FRam_Flag), FRam_Flag_FADR, FRam_Flag_LEN, FRam_Flag_Group, CF_FRam_Flag},
{(u8*)&InitROM_UpData, (u8*)(&buf_ROM_UpData), (u8*)(&TXHData.ROM_UpData), ROM_UpData_FADR, ROM_UpData_LEN, ROM_UpData_Group, CF_ROM_UpData},
{(u8*)&InitMD_Port_Data, (u8*)(&buf_MD_Port_Data), (u8*)(&TXHData.MD_Port_Data), MD_Port_Data_FADR, MD_Port_Data_LEN, MD_Port_Data_Group, CF_MD_Port_Data},
{(u8*)&InitPOSData, (u8*)(&buf_POSData), (u8*)(&TXHData.POSData), POSData_FADR, POSData_LEN, POSData_Group, CF_POSData},
{(u8*)&InitMD_Port_Num_Top, (u8*)(&buf_MD_Port_Num_Top), (u8*)(&TXHData.MD_Port_Num_Top), MD_Port_Num_Top_FADR, MD_Port_Num_Top_LEN, MD_Port_Num_Top_Group, CF_MD_Port_Num_Top},
{(u8*)&InitPREXDATA_WaitUpNummber,(u8*)(&buf_PREXDATA_WaitUpNummber), (u8*)(&TXHData.PREXDATA_WaitUpNummber),PREXDATA_WaitUpNummber_FADR, PREXDATA_WaitUpNummber_LEN, PREXDATA_WaitUpNummber_Group, CF_PREXDATA_WaitUpNummber},
{(u8*)&InitPREXDATA_TTC, (u8*)(&buf_PREXDATA_TTC), (u8*)(&TXHData.PREXDATA_TTC), PREXDATA_TTC_FADR, PREXDATA_TTC_LEN, PREXDATA_TTC_Group, CF_PREXDATA_TTC},
{(u8*)&InitPrintInfo, (u8*)(&buf_PrintInfo), (u8*)(&TXHData.PrintInfo), PrintInfo_FADR, PrintInfo_LEN, PrintInfo_Group, CF_PrintInfo},
{(u8*)&initPrintLastRecord, (u8*)(&buf_PrintLastRecord), (u8*)(&TXHData.PrintLastRecord), PrintLastRecord_FADR, PrintLastRecord_LEN, PrintLastRecord_Group, CF_PrintLastRecord},
{(u8*)&InitPOSNetSetState, (u8*)(&buf_POSNetSetState), (u8*)(&TXHData.POSNetSetState), POSNetSetState_FADR, POSNetSetState_LEN, POSNetSetState_Group, CF_POSNetSetState},
{(u8*)&InitMD_Multiplex_Port_Data,(u8*)(&buf_MD_Multiplex_Port_Data), (u8*)(&TXHData.MD_Multiplex_Port_Data),MD_Multiplex_Port_Data_FADR, MD_Multiplex_Port_Data_LEN, MD_Multiplex_Port_Data_Group, CF_MD_Multiplex_Port_Data},
{(u8*)&InitWhiteList, (u8*)(&buf_WhiteList), (u8*)(&TXHData.WhiteList), WhiteList_FADR, WhiteList_LEN, WhiteList_Group, CF_WhiteList},
{(u8*)&InitPREXDATA_Upload, (u8*)(&buf_PREXDATA_Upload), (u8*)(&TXHData.PREXDATA_Upload), PREXDATA_Upload_FADR, PREXDATA_Upload_LEN, PREXDATA_Upload_Group, CF_PREXDATA_Upload},
};
////==============================================================================
//F*****************************************************************************
//* NAME: FRamDataCheck
//* PURPOSE: 校验函数
//* PARAMS: pData需要检验的数组地址,len数据长度
//* return: 无
//******************************************************************************
u8 FRamDataCheck(volatile u8* pData, u16 len)
{
u8 result;
result = *pData;
while(len--)
{
result += *pData++;
};
return result;
}
/****************************************************
函数名:FM_IO_Configuration
功能 :FM存储部分用到的IO初始化
参数 :无
返回值:无
****************************************************/
void FM_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA ,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
/*!< Configure SPI1 pins: SCK MOSI*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*!< Configure SPI1: MISO */
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //modi
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/****************************************************
函数名:FM_SPI_Configuration
功能 :FM存储部分用到的SPI初始化
参数 :无
返回值:无
****************************************************/
void FM_SPI_Configuration(void)
{
/* SPI1 configuration */
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
SPI_I2S_DeInit(SPI1);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//???
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8?????
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//?????SCK?1
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//??????2???????
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//NSS????
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//???
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//????
SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC???
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//????
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
}
/****************************************************
函数名:FM_SPI2_SendByte
功能 :FM存储部分用到的SPI发送函数
参数 dt 要发送的数据
返回值:无
****************************************************/
u8 FM_SPI1_SendByte(u8 dt)
{
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, dt);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
/****************************************************
函数名:FM_ReadData
功能 :读取指定地址的数据
参数 *pBuff:读取缓存
addr :读取的地址
Len :数据长度
返回值:无
****************************************************/
void FM_ReadData(u8 *pBuff,u32 addr,u16 Len)
{
u16 i = 0;
CLI();
FM_CS_EN;
FM_SPI1_SendByte(0x03);
FM_SPI1_SendByte((u8)(addr>>16));
FM_SPI1_SendByte((u8)(addr>>8));
FM_SPI1_SendByte((u8)addr);
for(i = 0;i < Len;i ++)
{
*pBuff = FM_SPI1_SendByte(0x00);
pBuff ++;
}
FM_CS_DIS;
SEI();
}
/****************************************************
函数名:FM_WriteData
功能 :写取指定地址的数据
参数 *pBuff:数据缓存
addr :写入的地址
Len :数据长度
返回值:无
****************************************************/
void FM_WriteData(u8 *pBuff,u32 addr,u16 Len)
{
u16 i = 0;
CLI();
FM_CS_EN;
FM_SPI1_SendByte(0x06);
FM_CS_DIS;
FM_CS_EN;
FM_SPI1_SendByte(0x02);
FM_SPI1_SendByte((u8)(addr>>16));
FM_SPI1_SendByte((u8)(addr>>8));
FM_SPI1_SendByte((u8)addr);
for(i = 0;i < Len;i ++)
{
FM_SPI1_SendByte(*pBuff);
pBuff ++;
}
FM_CS_DIS;
SEI();
}
/****************************************************
函数名:FM_Init
功能 FM存储部分初始化
参数 :无
返回值:无
****************************************************/
u16 iiii = 0;//搞不清楚,必须是全局变量才行(可能存在隐患,标注一下)
void FM_Init(void)
{
u16 i = 0,j = 0;
u8* pBuff;
u8 Temp_Buff[1300];
u8 Temp = 0;
u32 Fristflag = 0,delay = 0;
FM_IO_Configuration(); //FM相关IO初始化
FM_SPI_Configuration(); //FM相关SPI初始化
//for(delay = 0;delay<0xfffff;delay++);//无意义延时,等待铁电稳定
delay_ms(10);
pBuff = (u8*)&Fristflag;
{
FM_CS_EN;
FM_SPI1_SendByte(0x06); //写使能
FM_CS_DIS;
FM_CS_EN;
FM_SPI1_SendByte(0x01); //清除保护位
FM_SPI1_SendByte(0x00);
FM_CS_DIS;
}
if((FDITab[FramItemEnd - 1].firstAdr + FDITab[FramItemEnd - 1].len * FDITab[FramItemEnd - 1].Group) > 0x20000)
{
__breakpoint(0); // halt program execution here
while(1);
}
#ifdef FRAM_INIT //初始化
for(iiii = 0;iiii< FramItemEnd;iiii ++) //开机写入默认存储内容
{
for(i = 0;i < FDITab[iiii].Group;i ++)
{
for(j = 0;j < FDITab[iiii].len-checkLen_1;j ++)
Temp_Buff[j]=*(FDITab[iiii].upData+j) = *(FDITab[iiii].pInitData+j);
Temp = FRamDataCheck(Temp_Buff,FDITab[iiii].len - checkLen_1);
FM_WriteData(uniGlobal.Global,FDITab[iiii].firstAdr+FDITab[iiii].len*i, FDITab[iiii].len-checkLen_1);
FM_WriteData(&Temp, FDITab[iiii].firstAdr+FDITab[iiii].len+FDITab[iiii].len*i-checkLen_1,checkLen_1);
}
}
#endif
if(SWF8 == SWF_ON)
{
FM_Data_Init();
}
for(iiii = 0;iiii< FramItemEnd;iiii ++) //开机获取存储内容
{
for(i = 0;i < FDITab[iiii].Group;i ++)
{
if(FMItemRead(iiii,i) == 0)
{
}
}
}
TXHData.SystemErr = TXHData.PREXDATA_WaitUpNummber;
}
void PCBEncryption(void)
{
STM32CPU.v.id[0] = *(u32*)0x1fff7a10;
STM32CPU.v.id[1] = *(u32*)(0x1fff7a10 + 4);
STM32CPU.v.id[2] = *(u32*)(0x1fff7a10 + 8);
TXHData.Encryption[0] = CRC_Check(&STM32CPU.v.byte[0],6);
TXHData.Encryption[1] = CRC_Check(&STM32CPU.v.byte[1],6);
TXHData.Encryption[2] = CRC_Check(&STM32CPU.v.byte[2],8);
TXHData.Encryption[3] = CRC_Check(&STM32CPU.v.byte[3],8);
FM_WriteData((u8*)TXHData.Encryption,Encryption_FADR,sizeof(TXHData.Encryption));
}
void PCBEncryption_Check(void)
{
STM32CPU.v.id[0] = *(u32*)0x1fff7a10;
STM32CPU.v.id[1] = *(u32*)(0x1fff7a10 + 4);
STM32CPU.v.id[2] = *(u32*)(0x1fff7a10 + 8);
FM_ReadData((u8*)TXHData.Encryption,Encryption_FADR,sizeof(TXHData.Encryption));
if(TXHData.Encryption[0] != CRC_Check(&STM32CPU.v.byte[0],6)) TXHData.ErrState.Flag.e_errPCBCheck = 1;
if(TXHData.Encryption[1] != CRC_Check(&STM32CPU.v.byte[1],6)) TXHData.ErrState.Flag.e_errPCBCheck = 1;
if(TXHData.Encryption[2] != CRC_Check(&STM32CPU.v.byte[2],8)) TXHData.ErrState.Flag.e_errPCBCheck = 1;
if(TXHData.Encryption[3] != CRC_Check(&STM32CPU.v.byte[3],8)) TXHData.ErrState.Flag.e_errPCBCheck = 1;
}
void FM_Data_Init(void)
{
u16 i = 0,j = 0;
u8 Temp_Buff[1300];
u8 Temp = 0;
u8 BackTemp = 0;
FMItemRead(CF_ROM_UpData,0);
BackTemp = TXHData.ROM_UpData.ROM_UpData_State.State;//IAP初始化的时候用过了,不能重复初始化
for(iiii = 0;iiii< FramItemEnd;iiii ++) //开机写入默认存储内容
{
for(i = 0;i < FDITab[iiii].Group;i ++)
{
for(j = 0;j < FDITab[iiii].len-checkLen_1;j ++)
Temp_Buff[j]=*(FDITab[iiii].upData+j) = *(FDITab[iiii].pInitData+j);
Temp = FRamDataCheck(Temp_Buff,FDITab[iiii].len - checkLen_1);
FM_WriteData(uniGlobal.Global,FDITab[iiii].firstAdr+FDITab[iiii].len*i, FDITab[iiii].len-checkLen_1);
FM_WriteData(&Temp, FDITab[iiii].firstAdr+FDITab[iiii].len+FDITab[iiii].len*i-checkLen_1,checkLen_1);
}
}
TXHData.ROM_UpData.ROM_UpData_State.State = BackTemp;
FMItemWrite(CF_ROM_UpData,0);
}
u8 FMItemWrite(FramItem Type, u16 Group)
{
u16 i = 0,j = 0,k = 0;
u8 Temp_Buff[1300];
u8 Temp = 0;
if(Group >= FDITab[Type].Group)
return 0;
if(TXHData.PowerDown.State == 0 && FMItemRead(CF_FRam_Flag,0) == 1)
{
for(i = 0;i < FDITab[Type].len;i ++)
{
*(FDITab[Type].upData + i) = *(FDITab[Type].pData + i + (FDITab[Type].len-1)*Group);
Temp_Buff[i] = *(FDITab[Type].upData + i);
}
for(j = 0;j < 6;j ++)
{
FM_WriteData(uniGlobal.Global,FDITab[Type].firstAdr+FDITab[Type].len*Group,FDITab[Type].len-1);
Temp = FRamDataCheck(Temp_Buff,FDITab[Type].len - checkLen_1);
FM_WriteData(&Temp,FDITab[Type].firstAdr+FDITab[Type].len+FDITab[Type].len*Group-1,checkLen_1);
if(FMItemRead(Type,Group) == 1)
{
return 1;
}
delay_ms(100);
}
}
// pGun.ErrState[0].Flag.e_errFramParameter = 1; //存储器错误公共错误,只判断一个
// pGun.ErrState[1].Flag.e_errFramParameter = 1; //存储器错误公共错误,只判断一个
return 0;
}
u8 FMItemRead(FramItem Type, u16 Group)
{
volatile u16 ii = 0,j = 0;
u8 Temp_Buff[1300];
u8 Temp = 0;
if(Group >= FDITab[Type].Group)
return 0;
for(j = 0;j < 6;j ++)
{
/****************************/
FM_ReadData(uniGlobal.Global,FDITab[CF_FRam_Flag].firstAdr,1);
*(Temp_Buff) = *(FDITab[CF_FRam_Flag].upData);
if(*(Temp_Buff) == 0x38)
{
FM_ReadData(uniGlobal.Global,FDITab[Type].firstAdr+FDITab[Type].len*Group,FDITab[Type].len);
for(ii = 0;ii < FDITab[Type].len;ii ++)
*(Temp_Buff+ii) = *(FDITab[Type].upData+ii);
Temp = FRamDataCheck(Temp_Buff,FDITab[Type].len - checkLen_1);
if(Temp == Temp_Buff[FDITab[Type].len - checkLen_1])
{
for(ii = 0;ii < FDITab[Type].len - checkLen_1;ii ++)
{
*(FDITab[Type].pData+ii+(FDITab[Type].len-1)*Group) = *(FDITab[Type].upData+ii);
}
return 1;
}
}
delay_ms(100);
}
// pGun.ErrState[0].Flag.e_errFramParameter = 1; //存储器错误公共错误,只判断一个
// pGun.ErrState[1].Flag.e_errFramParameter = 1; //存储器错误公共错误,只判断一个
return 0;
}