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

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

отключен аппаратный can пока что, потому что надо еще как-то менять baud, пока не придумал
This commit is contained in:
Razvalyaev 2025-08-08 12:03:08 +03:00
commit b024569ca4
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,6 +155,18 @@ 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);
@ -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 {

File diff suppressed because one or more lines are too long

149
README.md Normal file
View File

@ -0,0 +1,149 @@
# Устройство эмуляции CAN-ошибок
Устройство предназначено для генерации CAN-кадров с возможностью намеренного внесения ошибок в различные поля кадра. Это позволяет тестировать устойчивость и обработку ошибок в CAN-сетях, а также проверять поведение принимающих устройств.
---
## Основные возможности
В папке **can_emul_term** находится терминалка для генерации CAN-кадров
В вкладке setup настраивается обмен по Modbus:
- Выбирается COM порт для общения с STM
- Выбирается период опроса Modbus
- Скорость 115200 bps, 1 stop bit, none parity, none flow control
В вкладке CAN EMULATOR настраивается скорость CAN, период посылок и CAN фрейм.
Возможности:
- Передача данных по регистрам океана.
- Генерация рандомного ID в CAN-кадре.
- Генерация **стандартных** (11-бит ID) и **расширенных** (29-бит ID) CAN-кадров.
- Передача данных с заданным **битрейтом** (напр. 125 / 250 / 500 / 1000 Кбит/с).
- Возможность **внесения ошибок**:
- Инверсия полей **IDE**, **RTR**, **SRR**, **r1**, **r0**.
- Инверсия одного бита **данных** или **ID**.
- Ошибка **CRC**.
- Отключение **бит-стаффинга** (stuff bits).
- Работа в двух режимах: **одиночный кадр** или **периодическая отправка**.
---
# Для разработчика
## Структура управления
Устройство управляется через **Modbus-регистр**, состоящий из:
- **Коилов (флагов)** — включение функций и ошибок.
- **Холдинг-регистров** — задание параметров кадра.
---
### Холдинг-регистры
Настройка параметров CAN:
| Название поля | Адрес | Описание |
|----------------------------|-------|----------|
| `CAN_BITRATE_KBPS` | 0 | Битрейт CAN в Кбит/с |
| `CAN_PERIOD` | 1 | Интервал отправки в мс (если включен `START_POLLING`) |
Настройка CAN-кадра:
| Название поля | Адрес | Описание |
|----------------------------|-------|----------|
| `CAN_ID_HI` | 2 | Старшая часть CAN ID |
| `CAN_ID_LO` | 3 | Младшая часть CAN ID |
| `CAN_DLC` | 4 | Длина данных (08 байт) |
| `CAN_DATA_0` ... `CAN_DATA_7` | 1623 | Данные для передачи (до 8 байт) |
На будущее:
| Название поля | Адрес | Описание |
|----------------------------|-------|----------|
| `DATA_UNIX_HI` | 64 | Время в системе UNIX (старшое слово) |
| `DATA_UNIX_LO` | 65 | Время в системе UNIX (младшее слово) |
### Адреса коилов
Для управления CAN:
| Название поля | Адрес | Описание |
|----------------------------|------------------|----------|
| `START_POLLING` | 0 | Запуск периодической отправки |
| `START_SINGLE_FRAME` | 1 | Однократная отправка кадра |
| `HEADER_IDE` | 2 | Режим кадра: 0 = стандартный, 1 = расширенный |
| `HEADER_RTR` | 3 | Remote Transmission Request (1 = запрос) |
Для выставления ошибок:
| Название поля | Адрес | Описание |
|----------------------------|------------------|----------|
| `FLIP_SRS` | 16 | Инвертировать SRR-бит |
| `FLIP_IDE` | 17 | Инвертировать IDE |
| `FLIP_RTR` | 18 | Инвертировать RTR |
| `FLIP_R1` | 19 | Инвертировать r1 |
| `FLIP_R0` | 20 | Инвертировать r0 |
| `FLIP_MSGID_BIT` | 21 | Инвертировать старший бит ID |
| `FLIP_DATA_BIT` | 22 | Инвертировать один бит данных |
| `FLIP_CRC_BIT` | 23 | Инвертировать CRC |
| `DISABLE_STUFF_BITS` | 24 | Отключить вставку stuff-битов |
---
## Как пользоваться
### Шаг 1. Настройка параметров кадра
Заполните следующие поля:
- `CAN_BITRATE_KBPS` — битрейт шины (например, 500).
- `CAN_ID_HI`, `CAN_ID_LO` — идентификатор кадра.
- `HEADER_IDE` — выбор типа кадра:
- 0 — стандартный (11 бит).
- 1 — расширенный (29 бит).
- `HEADER_RTR` — тип кадра:
- 0 — data frame.
- 1 — remote request.
- `CAN_DLC` — количество байт данных (08).
- `CAN_DATA_0` ... `CAN_DATA_7` — данные кадра.
### Шаг 2. Включение ошибок (опционально)
Установите нужные флаги в коилах:
- Для инверсии полей (например, IDE, CRC и др.).
- Для отключения бит-стаффинга.
### Шаг 3. Отправка кадра
Выберите один из вариантов:
- Установите `START_SINGLE_FRAME` в 1 — для однократной отправки кадра.
- Установите `START_POLLING` в 1 — для периодической отправки.
- Задайте интервал через `CAN_PERIOD`.
> **Примечание:** Если задан слишком маленький `CAN_PERIOD`, он автоматически будет ограничен минимальным значением (`CAN_MIN_PERIOD` в прошивке).
---
## Примеры
### Пример 1: Стандартный кадр, ID = 0x123, 2 байта данных
```
CAN_BITRATE_KBPS = 500
CAN_ID_HI = 0x0000
CAN_ID_LO = 0x0123
HEADER_IDE = 0
HEADER_RTR = 0
CAN_DLC = 2
CAN_DATA_0 = 0x11
CAN_DATA_1 = 0x22
START_SINGLE_FRAME = 1
```
### Пример 2: Расширенный кадр с ошибкой CRC и отключенным стаффингом
```
CAN_BITRATE_KBPS = 500
CAN_ID_HI = 0x001D
CAN_ID_LO = 0xABCD
HEADER_IDE = 1
HEADER_RTR = 0
CAN_DLC = 8
CAN_DATA_0...7 = 0xAA, 0xBB, ...
FLIP_CRC_BIT = 1
DISABLE_STUFF_BITS = 1
START_SINGLE_FRAME = 1
```
---