Files
TXH1.0/User/FRam/FRam.c
T
2026-04-27 16:55:02 +08:00

437 lines
17 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*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;
}