добавлен дефайн для ошибок с корректным crc

т.к. при инверсии любого бита - автоматом появляется ошибка crc, может имеет смысл пересчитывать crc для инвертированных битов?

отключен аппаратный can пока что, потому что надо еще как-то менять baud, пока не придумал
This commit is contained in:
2025-08-08 12:03:08 +03:00
6 changed files with 198 additions and 35 deletions

View File

@@ -2,6 +2,7 @@
#define CANCONFIG_H
#define CAN_ONLY_EMULATING
//#define CAN_ERROR_WITH_CORRECT_CRC
// Настройки GPIO и таймера

View File

@@ -10,7 +10,6 @@ int transmit_prev = 0;
void CAN_Init(CANEmu_HandleTypeDef *canemu)
{
#ifdef CAN_ONLY_EMULATING
CANEmu_SendFrame(canemu);
if(canemu->EmuFlag == 0)
{
CANEmu_Init(canemu, canemu->bitrate_bps);
@@ -33,7 +32,7 @@ void CAN_SendFrame(CANEmu_HandleTypeDef *canemu)
#ifdef CAN_ONLY_EMULATING
CANEmu_SendFrame(canemu);
#else
if(canemu->errors.all)
if(canemu->EmuFlag)
CANEmu_SendFrame(canemu);
else
HAL_CAN_AddTxMessage(&hcan, &canemu->header, canemu->data, &mbox);
@@ -42,7 +41,6 @@ void CAN_SendFrame(CANEmu_HandleTypeDef *canemu)
void CANEmu_Working(CANEmu_HandleTypeDef *canemu)
{
if(flag_manual == 0)
{
canemu->start_poll = MB_DATA.Coils.START_POLLING;

View File

@@ -155,7 +155,19 @@ void form_CAN_bitstream_full(const CAN_TxHeaderTypeDef *header, const uint8_t *d
}
}
}
#ifdef CAN_ERROR_WITH_CORRECT_CRC
// Ошибки
if (errors.bit.FF_SRS) flip_bit(srr_idx);
if (errors.bit.FF_IDE) flip_bit(ide_idx);
if (errors.bit.FF_RTR) flip_bit(rtr_idx);
if (errors.bit.FF_R1) flip_bit(r1_idx);
if (errors.bit.FF_R0) flip_bit(r0_idx);
if (errors.bit.DATA) flip_bit(data_idx);
// MSGID_ERR — переворачиваем 1-й бит ID (MSB ID[10]) для примера
if (errors.bit.MSGID) flip_bit(id_start);
#endif
// 5. CRC
uint16_t crc = compute_crc15(raw_bits, raw_len);
uint32_t crc_start = raw_len;
@@ -168,6 +180,7 @@ void form_CAN_bitstream_full(const CAN_TxHeaderTypeDef *header, const uint8_t *d
// 6. CRC Delimiter (recessive)
append_bit(raw_bits, &raw_len, 1);
#ifndef CAN_ERROR_WITH_CORRECT_CRC
// Ошибки
if (errors.bit.FF_SRS) flip_bit(srr_idx);
if (errors.bit.FF_IDE) flip_bit(ide_idx);
@@ -177,6 +190,7 @@ void form_CAN_bitstream_full(const CAN_TxHeaderTypeDef *header, const uint8_t *d
if (errors.bit.DATA) flip_bit(data_idx);
// MSGID_ERR — переворачиваем 1-й бит ID (MSB ID[10]) для примера
if (errors.bit.MSGID) flip_bit(id_start);
#endif
// 10. Apply bit stuffing, пропускаем вставку stuff bits если ошибка ERR_STUFF_BITS
apply_bit_stuffing_with_error(raw_bits, raw_len, can_bits, &can_bits_len, errors.bit.STUFF_BITS);

View File

@@ -5,6 +5,7 @@
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include "canConfig.h"
typedef union {