Обновление
This commit is contained in:
parent
4b349574a5
commit
dfb801a5a8
25
CanUds.c
25
CanUds.c
|
|
@ -994,9 +994,12 @@ static uint16_t vUDS_routine_Compare_Checksum(tCanUds *env, eUdsRoutineControlTy
|
||||||
|
|
||||||
setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending);
|
setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending);
|
||||||
|
|
||||||
uint32_t crc32_calc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) env->CurrentBlockAdr, env->CurrentBlockSize,
|
// uint32_t crc32_calc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) env->CurrentBlockAdr, env->CurrentBlockSize,
|
||||||
SendUpdatePendingCrc, env, 200);
|
// SendUpdatePendingCrc, env, 200);
|
||||||
crc32_calc = UdsCrc32Finalize(crc32_calc);
|
// crc32_calc = UdsCrc32Finalize(crc32_calc);
|
||||||
|
|
||||||
|
uint32_t crc32_calc = UdsCrc32Update_Hardware(0xFFFFFFFF, (uint8_t *) env->CurrentBlockAdr, env->CurrentBlockSize,
|
||||||
|
SendUpdatePendingCrc, env, 200);
|
||||||
|
|
||||||
uint32_t crc32_received =
|
uint32_t crc32_received =
|
||||||
(env->data->data[4] << 24) | (env->data->data[5] << 16) | (env->data->data[6] << 8) | env->data->data[7];
|
(env->data->data[4] << 24) | (env->data->data[5] << 16) | (env->data->data[6] << 8) | env->data->data[7];
|
||||||
|
|
@ -1089,9 +1092,12 @@ vUDS_routine_Check_Programming_Dependancies(tCanUds *env, eUdsRoutineControlType
|
||||||
|
|
||||||
|
|
||||||
setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending);
|
setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending);
|
||||||
uint32_t crc32_calc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) ADR_HEX_Mapped_BlockMain, SIZE_HEX_BlockMain - 4,
|
// uint32_t crc32_calc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) ADR_HEX_Mapped_BlockMain, SIZE_HEX_BlockMain - 4,
|
||||||
|
// SendUpdatePendingCrc, env, 200);
|
||||||
|
// crc32_calc = UdsCrc32Finalize(crc32_calc);
|
||||||
|
|
||||||
|
uint32_t crc32_calc = UdsCrc32Update_Hardware(0xFFFFFFFF, (uint8_t *) ADR_HEX_Mapped_BlockMain, SIZE_HEX_BlockMain - 4,
|
||||||
SendUpdatePendingCrc, env, 200);
|
SendUpdatePendingCrc, env, 200);
|
||||||
crc32_calc = UdsCrc32Finalize(crc32_calc);
|
|
||||||
|
|
||||||
uint32_t crc32_file = (*(uint32_t *) (ADR_HEX_Mapped_BlockMain + SIZE_HEX_BlockMain - 4));
|
uint32_t crc32_file = (*(uint32_t *) (ADR_HEX_Mapped_BlockMain + SIZE_HEX_BlockMain - 4));
|
||||||
|
|
||||||
|
|
@ -1102,9 +1108,12 @@ vUDS_routine_Check_Programming_Dependancies(tCanUds *env, eUdsRoutineControlType
|
||||||
}
|
}
|
||||||
|
|
||||||
setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending);
|
setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending);
|
||||||
crc32_calc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) ADR_HEX_Mapped_BlockCalib, SIZE_HEX_BlockCalib - 4,
|
// crc32_calc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) ADR_HEX_Mapped_BlockCalib, SIZE_HEX_BlockCalib - 4,
|
||||||
|
// SendUpdatePendingCrc, env, 200);
|
||||||
|
// crc32_calc = UdsCrc32Finalize(crc32_calc);
|
||||||
|
|
||||||
|
crc32_calc = UdsCrc32Update_Hardware(0xFFFFFFFF, (uint8_t *) ADR_HEX_Mapped_BlockCalib, SIZE_HEX_BlockCalib - 4,
|
||||||
SendUpdatePendingCrc, env, 200);
|
SendUpdatePendingCrc, env, 200);
|
||||||
crc32_calc = UdsCrc32Finalize(crc32_calc);
|
|
||||||
|
|
||||||
crc32_file = (*(uint32_t *) (ADR_HEX_Mapped_BlockCalib + SIZE_HEX_BlockCalib - 4));
|
crc32_file = (*(uint32_t *) (ADR_HEX_Mapped_BlockCalib + SIZE_HEX_BlockCalib - 4));
|
||||||
|
|
||||||
|
|
@ -1879,7 +1888,7 @@ void ReceivedTP_func(void *arg, tCanTP_data *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (env->isEcuReset) {
|
if (env->isEcuReset) {
|
||||||
SystemDelayMs(100);
|
// SystemDelayMs(100);
|
||||||
NVIC_SystemReset();
|
NVIC_SystemReset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
82
crc32_uds.c
82
crc32_uds.c
|
|
@ -2,6 +2,7 @@
|
||||||
// Created by cfif on 21.04.2026.
|
// Created by cfif on 21.04.2026.
|
||||||
//
|
//
|
||||||
#include "crc32_uds.h"
|
#include "crc32_uds.h"
|
||||||
|
#include "fc7xxx_driver_crc.h"
|
||||||
#include "SystemDelayInterface.h"
|
#include "SystemDelayInterface.h"
|
||||||
|
|
||||||
// Таблица CRC32, предвычисленная для полинома 0xEDB88320UL (отражённая форма 0x04C11DB7)
|
// Таблица CRC32, предвычисленная для полинома 0xEDB88320UL (отражённая форма 0x04C11DB7)
|
||||||
|
|
@ -86,4 +87,83 @@ UdsCrc32Update(uint32_t crc, const uint8_t *data, uint32_t len, crc32_update_fun
|
||||||
|
|
||||||
uint32_t UdsCrc32Finalize(uint32_t crc) {
|
uint32_t UdsCrc32Finalize(uint32_t crc) {
|
||||||
return crc ^ 0xFFFFFFFF;
|
return crc ^ 0xFFFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "fc7xxx_driver_crc.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Hardware CRC-32 update function
|
||||||
|
*
|
||||||
|
* Configuration that works (Test 2):
|
||||||
|
* - Polynomial: 0x04C11DB7 (direct form)
|
||||||
|
* - Write data swap: BYTE_BIT (byte + bit reflection on input)
|
||||||
|
* - Read data swap: BYTE_BIT (byte + bit reflection on output)
|
||||||
|
* - Read data FXOR: FXOR (final XOR with 0xFFFFFFFF)
|
||||||
|
*
|
||||||
|
* This matches the software implementation that uses reflected polynomial 0xEDB88320.
|
||||||
|
*
|
||||||
|
* @param crc Initial CRC value (0xFFFFFFFF for new calculation)
|
||||||
|
* @param data Pointer to data buffer
|
||||||
|
* @param len Length of data in bytes
|
||||||
|
* @param update_func Callback for timeout (can be NULL)
|
||||||
|
* @param update_func_env Environment for callback
|
||||||
|
* @param timeout Timeout in milliseconds
|
||||||
|
* @return uint32_t Updated CRC value
|
||||||
|
*/
|
||||||
|
uint32_t UdsCrc32Update_Hardware(uint32_t crc, const uint8_t *data, uint32_t len,
|
||||||
|
crc32_update_func update_func, void *update_func_env,
|
||||||
|
uint32_t timeout)
|
||||||
|
{
|
||||||
|
CRC_InitType tInitCfg = {0};
|
||||||
|
uint32_t u32Time = SystemGetMs() + timeout;
|
||||||
|
uint32_t u32Result;
|
||||||
|
|
||||||
|
/* Конфигурация из Test 2 */
|
||||||
|
tInitCfg.u32Polynomial = 0x04C11DB7UL; /* Прямой полином */
|
||||||
|
tInitCfg.u32SeedValue = crc; /* Начальное значение */
|
||||||
|
tInitCfg.eBitWidth = CRC_BIT_32; /* 32-битный режим */
|
||||||
|
tInitCfg.eWriteDataSwap = WRITE_DATASWAP_BIT_BYTE; /* Байтовый + битовый swap на входе */
|
||||||
|
tInitCfg.eReadDataSwap = READ_DATASWAP_BIT_BYTE; /* Байтовый + битовый swap на выходе */
|
||||||
|
tInitCfg.eReadDataFXOR = READ_DATA_FXOR; /* Финальная инверсия (XOR 0xFFFFFFFF) */
|
||||||
|
|
||||||
|
CRC_Init(CRC_INSTANCE, &tInitCfg);
|
||||||
|
|
||||||
|
/* Обработка данных 32-битными словами для скорости */
|
||||||
|
while (len >= 4)
|
||||||
|
{
|
||||||
|
uint32_t u32Word = *(const uint32_t*)data;
|
||||||
|
CRC_SetCalcData_U32(CRC_INSTANCE, u32Word);
|
||||||
|
|
||||||
|
if (update_func != NULL)
|
||||||
|
{
|
||||||
|
if (SystemGetMs() > u32Time)
|
||||||
|
{
|
||||||
|
update_func(update_func_env);
|
||||||
|
u32Time = SystemGetMs() + timeout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data += 4;
|
||||||
|
len -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Обработка оставшихся байтов (0-3) */
|
||||||
|
while (len--)
|
||||||
|
{
|
||||||
|
CRC_SetCalcData_U8(CRC_INSTANCE, *data++);
|
||||||
|
|
||||||
|
if (update_func != NULL)
|
||||||
|
{
|
||||||
|
if (SystemGetMs() > u32Time)
|
||||||
|
{
|
||||||
|
update_func(update_func_env);
|
||||||
|
u32Time = SystemGetMs() + timeout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Получаем результат (уже с FXOR) */
|
||||||
|
u32Result = CRC_GetCrcResult(CRC_INSTANCE);
|
||||||
|
|
||||||
|
return u32Result;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,5 +10,8 @@ typedef void (crc32_update_func)(void *update_func_env);
|
||||||
|
|
||||||
uint32_t UdsCrc32Update(uint32_t crc, const uint8_t *data, uint32_t len, crc32_update_func update_func, void *update_func_env, uint32_t timeout);
|
uint32_t UdsCrc32Update(uint32_t crc, const uint8_t *data, uint32_t len, crc32_update_func update_func, void *update_func_env, uint32_t timeout);
|
||||||
uint32_t UdsCrc32Finalize(uint32_t crc);
|
uint32_t UdsCrc32Finalize(uint32_t crc);
|
||||||
|
uint32_t UdsCrc32Update_Hardware(uint32_t crc, const uint8_t *data, uint32_t len,
|
||||||
|
crc32_update_func update_func, void *update_func_env,
|
||||||
|
uint32_t timeout);
|
||||||
|
|
||||||
#endif //HVAC_M7_CRC32_UDS_H
|
#endif //HVAC_M7_CRC32_UDS_H
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue