diff --git a/README.md b/README.md index 29fd3d6..a640bb7 100644 --- a/README.md +++ b/README.md @@ -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) | + ## πŸ›  Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹ | ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ | ДокумСнтация | Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ | diff --git a/docs/DS_Accord_8_F-CAN.md b/docs/DS_Accord_8_F-CAN.md new file mode 100644 index 0000000..c3f3a5f --- /dev/null +++ b/docs/DS_Accord_8_F-CAN.md @@ -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()`. +```