236 lines
7.2 KiB
C
236 lines
7.2 KiB
C
/*
|
||
* 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;
|
||
}
|
||
|
||
|