добавлен дефайн для ошибок с корректным crc
т.к. при инверсии любого бита - автоматом появляется ошибка crc, может имеет смысл пересчитывать crc для инвертированных битов? отключен аппаратный can пока что, потому что надо еще как-то менять baud, пока не придумал
This commit is contained in:
commit
b024569ca4
@ -2,6 +2,7 @@
|
||||
#define CANCONFIG_H
|
||||
|
||||
#define CAN_ONLY_EMULATING
|
||||
//#define CAN_ERROR_WITH_CORRECT_CRC
|
||||
|
||||
|
||||
// Настройки GPIO и таймера
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
149
README.md
Normal 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 | Длина данных (0–8 байт) |
|
||||
| `CAN_DATA_0` ... `CAN_DATA_7` | 16–23 | Данные для передачи (до 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` — количество байт данных (0–8).
|
||||
- `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
|
||||
```
|
||||
|
||||
---
|
Loading…
Reference in New Issue
Block a user