diff --git a/CanUds.c b/CanUds.c index 1e8b640..32d6662 100644 --- a/CanUds.c +++ b/CanUds.c @@ -994,9 +994,12 @@ static uint16_t vUDS_routine_Compare_Checksum(tCanUds *env, eUdsRoutineControlTy setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending); - uint32_t crc32_calc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) env->CurrentBlockAdr, env->CurrentBlockSize, - SendUpdatePendingCrc, env, 200); - crc32_calc = UdsCrc32Finalize(crc32_calc); +// uint32_t crc32_calc = UdsCrc32Update(0xFFFFFFFF, (uint8_t *) env->CurrentBlockAdr, env->CurrentBlockSize, +// SendUpdatePendingCrc, env, 200); +// 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 = (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); - 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); - crc32_calc = UdsCrc32Finalize(crc32_calc); 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); - 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); - crc32_calc = UdsCrc32Finalize(crc32_calc); 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) { - SystemDelayMs(100); +// SystemDelayMs(100); NVIC_SystemReset(); } diff --git a/crc32_uds.c b/crc32_uds.c index d12a1a3..1b6b622 100644 --- a/crc32_uds.c +++ b/crc32_uds.c @@ -2,6 +2,7 @@ // Created by cfif on 21.04.2026. // #include "crc32_uds.h" +#include "fc7xxx_driver_crc.h" #include "SystemDelayInterface.h" // Таблица 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) { return crc ^ 0xFFFFFFFF; -} \ No newline at end of file +} + +#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; +} diff --git a/crc32_uds.h b/crc32_uds.h index 02a2512..9dd04d4 100644 --- a/crc32_uds.h +++ b/crc32_uds.h @@ -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 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