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