Files
RCU_C1P_Module/MCU_Driver/check_fun.c
caocong d2d8800788 feat:新建项目文件
BLV主机C1P模块
2025-12-06 13:49:01 +08:00

236 lines
7.2 KiB
C
Raw Permalink 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.
/*
* check_fun.c
*
* Created on: Nov 8, 2025
* Author: cc
*/
#include "includes.h"
/*******************************************************************************
* Function Name : Log_CheckSum
* Description : 和校验取反数据内容从SRAM中读取
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t Log_CheckSum(uint32_t addr,uint8_t len)
{
uint8_t data_sum = 0;
for(uint8_t i = 0;i<len;i++)
{
data_sum += SRAM_Read_Byte(addr+i);
}
return ~data_sum;
}
/*******************************************************************************
* Function Name : Data_CheckSum
* Description : 和校验取反
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t Data_CheckSum(uint8_t* data,uint16_t len)
{
uint8_t data_sum = 0;
for(uint16_t i = 0;i<len;i++)
{
data_sum += data[i];
}
return ~data_sum;
}
/*******************************************************************************
* Function Name : CheckSum_Overlook_Check
* Description : 和校验取反,忽略校验字本身
* input: data: 数据指针
len :数据总长度
check_id: 校验数据所在下标
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t CheckSum_Overlook_Check(uint8_t *data, uint16_t len, uint16_t check_id)
{
uint8_t data_sum = 0;
for(uint16_t i = 0;i<len;i++)
{
if(check_id != i) data_sum += data[i];
}
return ~data_sum;
}
/*******************************************************************************
* Function Name : NetCRC16
* Description : CRC校验 - 加在数据最后两个字节上
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void NetCRC16(uint8_t *aStr ,uint16_t len)
{
uint16_t alen = len-2; //CRC16
uint16_t xda , xdapoly ;
uint16_t i,j, xdabit ;
xda = 0xFFFF ;
xdapoly = 0xA001 ; // (X**16 + X**15 + X**2 + 1)
for(i=0;i<alen;i++)
{
xda ^= aStr[i] ;
for(j=0;j<8;j++)
{
xdabit = (uint8_t )(xda & 0x01) ;
xda >>= 1 ;
if( xdabit ) xda ^= xdapoly ;
}
}
aStr[alen] = (uint8_t)(xda & 0xFF) ;
aStr[alen+1] = (uint8_t)(xda>>8) ;
}
/*******************************************************************************
* Function Name : NetCRC16_2
* Description : CRC校验 - 读取SRAM中数据
* Input :
aStr : 需要校验的数组首地址
len : 数据的长度 -- Flash中的数据校验一般是512Byte
* Return : 数据的校验值
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint16_t NetCRC16_2(uint8_t *aStr ,uint16_t len)
{
uint16_t xda , xdapoly ;
uint16_t i,j, xdabit ;
xda = 0xFFFF ;
xdapoly = 0xA001 ; // (X**16 + X**15 + X**2 + 1)
for(i=0;i<len;i++)
{
xda ^= aStr[i] ;
for(j=0;j<8;j++)
{
xdabit = (uint8_t )(xda & 0x01) ;
xda >>= 1 ;
if( xdabit ) xda ^= xdapoly ;
}
}
return xda;
}
/*******************************************************************************
* Function Name : NetCRC16_Data
* Description : CRC校验 - CRC在检验数据中
* Input :
aStr : 需要校验的数组首地址
len : 数据的长度 -- Flash中的数据校验一般是512Byte
crc_id CRC在数组中的下标位置低地址在前
* Return : 数据的校验值
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint16_t NetCRC16_Data(uint8_t *aStr ,uint16_t len,uint16_t crc_id)
{
uint16_t xda , xdapoly ;
uint16_t i,j, xdabit ;
xda = 0xFFFF ;
xdapoly = 0xA001 ; // (X**16 + X**15 + X**2 + 1)
for(i=0;i<len;i++)
{
if((i == crc_id) || (i == (crc_id + 1)))
{
xda ^= 0x00;
}else {
xda ^= aStr[i];
}
for(j=0;j<8;j++)
{
xdabit = (uint8_t )(xda & 0x01) ;
xda >>= 1 ;
if( xdabit ) xda ^= xdapoly ;
}
}
return xda;
}
/*******************************************************************************
* Function Name : DoubleData_CheckSum
* Description : 两个数组和校验取反
* Data1 数据包1
* Data1Len 数据包1的长度
* Data2 数据包2
* Data2Len 数据包2的长度
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t DoubleData_CheckSum(uint8_t *Data1, uint16_t Data1Len, uint8_t *Data2, uint16_t Data2Len)
{
uint8_t data_sum = 0;
uint16_t i;
for(i = 0; i < Data1Len;i++)
{
data_sum += Data1[i];
}
for(i = 0; i < Data2Len; i++)
{
data_sum += Data2[i];
}
return ~data_sum;
}
/*******************************************************************************
* Function Name : SOR_CRC
* Description : 和校验
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t SOR_CRC(uint8_t *Data, uint8_t DataLen)
{
uint8_t i;
uint8_t sor_data = 0;
for(i = 0; i < DataLen; i++)//i可能为0 也可以是1
{
sor_data = sor_data+Data[i];
}
return sor_data;
}
/*******************************************************************************
* Function Name : DevAction_Data_Check
* Description : 设备动作链表数据校验
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t DeAction_Data_Check(uint32_t sram_addr)
{
uint16_t data_len = SRAM_Read_Word(sram_addr + sizeof(Dev_Action_Core) + sizeof(Dev_Action_Input) + sizeof(Dev_Action_Cond) + sizeof(Dev_Action_State) + 1);
uint8_t data_sum = 0;
uint8_t check_temp_buff[SRAM_DevAction_List_Size] = {0};
if(data_len > SRAM_DevAction_List_Size)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作数据校验错误1当前地址:%08X 存储的长度,%04X",sram_addr, data_len);
return 1;
}
memset(check_temp_buff,0,SRAM_DevAction_List_Size);
SRAM_DMA_Read_Buff(check_temp_buff,data_len,sram_addr);
for(uint16_t i = 0;i<data_len;i++)
{
data_sum += check_temp_buff[i];
}
return ~data_sum;
}
/*******************************************************************************
* Function Name : Dev_CheckSum
* Description : 和校验取反数据内容从SRAM中读取
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t DevAction_CheckSum(uint32_t addr,uint16_t len)
{
uint8_t data_sum = 0;
uint8_t check_temp_buff[SRAM_DevAction_List_Size];// = {0};
if(len > SRAM_DevAction_List_Size)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作数据校验错误2当前地址:%08X 存储的长度,%04X",addr, len);
return 1;
}
memset(check_temp_buff,0,SRAM_DevAction_List_Size);
SRAM_DMA_Read_Buff(check_temp_buff,len,addr);
for(uint16_t i = 0;i<len;i++)
{
data_sum += check_temp_buff[i];
}
return ~data_sum;
}