Compare commits
2
Commits
ai-context
...
Dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7979ab776 | ||
|
|
d236a92059 |
@@ -10,13 +10,29 @@
|
||||
|
||||
```bash
|
||||
# Пример добавления датчика температуры TMP112
|
||||
git submodule add https://git.domstudent.ru/Library/DS_TMP112 Library/DS_TMP112
|
||||
git submodule add https://git.domstudent.ru/Library/DS_TMP112
|
||||
|
||||
# Пример добавления дисплея ST7789V
|
||||
git submodule add https://domstudent.ru Library/DS_ST7789V
|
||||
git submodule add https://git.domstudent.ru/Library/DS_ST7789V
|
||||
```
|
||||
|
||||
После добавления подмодуля запустите скрипт из папки `DS_UpdateCMakeList`, чтобы он автоматически прописал новые папки `Inc` и файлы `Src` в ваш рабочий `CMakeLists.txt`.
|
||||
# Полное удаление подключенного субмодуля
|
||||
|
||||
Для корректного удаления субмодуля из репозитория Git (чтобы не осталось «битых» ссылок в конфигурации), выполните следующие шаги:
|
||||
|
||||
```bash
|
||||
# 1. Деинициализируйте субмодуль (удаляет настройки из .git/config и локальные файлы)
|
||||
git submodule deinit -f Library/DS_TMP112
|
||||
|
||||
# 2. Удалите директорию субмодуля из индекса Git и рабочего дерева
|
||||
git rm -f Library/DS_TMP112
|
||||
|
||||
# 3. Очистите внутренний кэш самого Git (важно для возможности повторного добавления)
|
||||
rm -rf .git/modules/Library/DS_TMP112
|
||||
|
||||
# 4. Закоммитьте изменения в основном репозитории
|
||||
git commit -m "Удален субмодуль DS_TMP112"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -59,6 +75,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) |
|
||||
|
||||
## 🛠 Утилиты
|
||||
|
||||
| Компонент | Документация | Исходный код |
|
||||
|
||||
@@ -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()`.
|
||||
```
|
||||
Reference in New Issue
Block a user