From a373695c4bb1df4f93008eaf7abe5a077ce812b1 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Fri, 12 Sep 2025 14:51:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=20bit=20stuff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (он другой стмкой определялся как form error, а не stuff error) --- Core/CANEmu/canConfig.h | 2 +- Core/CANEmu/canform.c | 41 ++++++++++++++++++++++------------------- MDK-ARM/CANEmu.uvoptx | 17 +++++++++++++++++ 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/Core/CANEmu/canConfig.h b/Core/CANEmu/canConfig.h index 1871b71..5aca7c2 100644 --- a/Core/CANEmu/canConfig.h +++ b/Core/CANEmu/canConfig.h @@ -2,7 +2,7 @@ #define CANCONFIG_H #define CAN_ONLY_EMULATING -//#define CAN_ERROR_WITH_CORRECT_CRC +#define CAN_ERROR_WITH_CORRECT_CRC // Настройки GPIO и таймера diff --git a/Core/CANEmu/canform.c b/Core/CANEmu/canform.c index 1c1a3eb..07ca72c 100644 --- a/Core/CANEmu/canform.c +++ b/Core/CANEmu/canform.c @@ -36,29 +36,32 @@ uint16_t compute_crc15(const uint8_t *bits, uint32_t len) { } return crc; } +int stuff_to_skip = 1; void apply_bit_stuffing_with_error(const uint8_t *src, uint32_t src_len, uint8_t *dst, uint32_t *dst_len, uint8_t skip_stuff) { - *dst_len = 0; - uint8_t last_bit = src[0]; - uint8_t count = 1; - append_bit(dst, dst_len, last_bit); + *dst_len = 0; + uint8_t last_bit = src[0]; + uint8_t count = 1; + append_bit(dst, dst_len, last_bit); - for (uint32_t i = 1; i < src_len; i++) { - uint8_t bit = src[i]; - append_bit(dst, dst_len, bit); + for (uint32_t i = 1; i < src_len; i++) { + uint8_t bit = src[i]; + append_bit(dst, dst_len, bit); - if (bit == last_bit) { - count++; - if (count == 5) { - if (!skip_stuff) { - append_bit(dst, dst_len, !bit); // вставляем противоположный бит - } - count = 0; - } - } else { - count = 1; - last_bit = bit; - } + if (bit == last_bit) { + count++; + if (count == 5) { + if(skip_stuff != stuff_to_skip) + append_bit(dst, dst_len, !bit); // вставляем противоположный бит + count = 0; + if (skip_stuff) { + skip_stuff++; + } + } + } else { + count = 1; + last_bit = bit; } + } } // Вспомогательная функция для инверсии бита diff --git a/MDK-ARM/CANEmu.uvoptx b/MDK-ARM/CANEmu.uvoptx index a646347..ed67492 100644 --- a/MDK-ARM/CANEmu.uvoptx +++ b/MDK-ARM/CANEmu.uvoptx @@ -180,7 +180,24 @@ 1 raw_bits + + 6 + 1 + can_bits + + + 7 + 1 + stuff_to_skip + + + + 0 + 2 + stuff_to_skip + + 0