Добавил DS_Accord_8_F-CAN #1

Merged
Mikhail merged 1 commits from Dev into main 2026-07-10 01:38:59 -04:00
2 changed files with 97 additions and 0 deletions
+6
View File
@@ -59,6 +59,12 @@ git submodule add https://domstudent.ru Library/DS_ST7789V
---
## 🚗 Автомобильные интерфейсы
| Компонент | Документация | Исходный код |
| :--- | :--- | :--- |
| **DS_Accord_8_F-CAN** | [Инструкция](./docs/DS_Accord_8_F-CAN.md) | [Репозиторий](https://git.domstudent.ru/Library/DS_Accord_8_F-CAN) |
## 🛠 Утилиты
| Компонент | Документация | Исходный код |
+91
View File
@@ -0,0 +1,91 @@
# Библиотека симуляции шины F-CAN (Honda Accord 8) для STM32
Техническая документация программного модуля циклической симуляции пакетов высокоскоростной автомобильной шины F-CAN (500 кбит/с) автомобиля **Honda Accord 8-го поколения** с аппаратной поддержкой стека **HAL CAN**.
---
## 📌 Общие сведения
Библиотека предоставляет планировщик задач (Scheduler) для имитации присутствия электронных блоков управления (ECU, ABS/VSA, MICU) в бортовой сети. Особенностью шины F-CAN Honda является валидация каждого пакета принимающими узлами по динамическому счетчику сообщений (`Alive Counter`) и контрольной сумме (`Checksum`). При некорректных значениях принимающий блок (например, приборная панель) игнорирует данные.
## 📂 Структура данных
Основным элементом планировщика является структура `CanTaskTypeDef`, описывающая конфигурацию каждого CAN-кадра [source: 1]:
```c
typedef struct {
uint16_t id; // 11-битный стандартный CAN ID пакета
uint8_t dlc; // Длина кадра данных (Data Length Code, обычно 8)
uint32_t period; // Период циклической отправки в миллисекундах (мс)
uint32_t last_time; // Системный таймер последнего запуска (GetTick)
uint8_t alive_cnt; // Текущий шаг Alive Counter (принимает значения 0..3)
uint32_t start_phase; // Изначальный сдвиг фазы запуска (для десинхронизации)
uint8_t data[8]; // Полезная нагрузка (Payload) пакета
} CanTaskTypeDef;
```
---
## ⚡ Описание API функции
### 1. `void run_honda_simulation(void)`
**Назначение**: Главный диспетчер (планировщик) симуляции. Вызывается строго внутри основного бесконечного цикла `while(1)` в `main.c`.
* **Принцип работы**:
* Проверяет текущее системное время с помощью `HAL_GetTick()`.
* Контролирует фазовый сдвиг `start_phase` при инициализации.
* Проверяет наличие свободных почтовых ящиков (`Mailbox`) в TX-буфере CAN-контроллера.
* Инкрементирует циклический счетчик `alive_cnt` от 0 до 3.
* Автоматически рассчитывает контрольную сумму и упаковывает её вместе со счетчиком в последний байт кадра (`data[dlc - 1]`).
### 2. `uint8_t calc_honda_halfbyte_checksum(...)`
**Назначение**: Математический расчет контрольной суммы Honda по алгоритму «Сумма полубайт + DLC».
```c
uint8_t calc_honda_halfbyte_checksum(uint16_t id, uint8_t *data, uint8_t dlc, uint8_t alive_val);
```
* **Алгоритм расчета**:
1. Суммируются все 3 полубайта (nibbles) из 11-битного `CAN ID`.
2. Последовательно суммируются старшие и младшие полубайты всех байт данных, кроме последнего.
3. К сумме прибавляется значение `DLC` и текущий шаг счетчика `alive_val`.
4. Применяется правило дополнения до нуля: результат берется как остаток от деления накопленной суммы на 16, который затем вычитается из 16.
---
## 🎛️ Конфигурация пакетов по умолчанию
В модуле по умолчанию настроена трансляция следующих критически важных ID для Honda Accord 8:
| CAN ID | Период | Имитируемый узел | Описание / Исходный Payload |
| :--- | :---: | :--- | :--- |
| **`0x158`** | 10 мс | **ECU** (Двигатель) | Скорость автомобиля, обороты двигателя |
| **`0x17C`** | 10 мс | **ECU Status** | Системный статус силового агрегата |
| **`0x1A4`** | 20 мс | **ABS/VSA** (Тормоза) | Статус тормозной системы, датчики вращения колес |
| **`0x324`** | 200 мс | **MICU** (Боди-контроллер)| Электроника кузова, двери, свет, зажигание |
*Примечание: В коде закомментирован массив диагностических пакетов диапазона `0x490` - `0x49F`, предназначенных для расширенной эмуляции блоков.*
---
## 🛠️ Интеграция в проект на STM32
1. Подключите заголовочный файл в `main.c`:
```c
#include "DS_Accord_8_F-CAN.h"
```
2. Убедитесь, что ваш дескриптор CAN в `main.c` называется `hcan`:
```c
CAN_HandleTypeDef hcan;
```
3. Разместите вызов диспетчера в главном цикле:
```c
int main(void)
```c
while (1)
{
// ... ваш код ...
run_honda_simulation(); // Диспетчер CAN-пакетов
}
```
## ⚠️ Важные требования к аппаратному слою
* Контроллер CAN должен быть предварительно инициализирован (тактовая частота, тайминги для 500 кбит/с) и переведен в рабочий режим с помощью `HAL_CAN_Start()`.
* Для корректной работы диспетчера не блокируйте выполнение `while(1)` долгими задержками `HAL_Delay()`.
```