# Карта CAN-адресов `Balsam_167_periph` и `BALZAM_167` ## Формирование адреса peripheral В `Source/Internal/main.c` выполняется: ```c get_Mode(); InitCan(0, Mode); ``` В `Source/Internal/ecan.c` настроены два extended CAN ID: ```c long id = 0x80BA0000; MBOX0.MSGID.all = id + 0x10 + DevNum; /* передача */ MBOX1.MSGID.all = id + DevNum; /* приём */ ``` `0x80000000` задаёт extended-формат и не является частью отображаемого 29-битного идентификатора. Фактические адреса на шине: ```text TX peripheral = 0x00BA0010 + Mode RX peripheral = 0x00BA0000 + Mode ``` ## Адреса всех режимов peripheral | `Mode` | Назначение | TX peripheral -> BALZAM | RX BALZAM -> peripheral | |---:|---|---:|---:| | 1 | `adr_TRN1` | `0x00BA0011` | `0x00BA0001` | | 2 | `adr_TRN2` | `0x00BA0012` | `0x00BA0002` | | 3 | `adr_POW1` | `0x00BA0013` | `0x00BA0003` | | 4 | `adr_POW2` | `0x00BA0014` | `0x00BA0004` | | 5 | `adr_LOA1`, УМП1 | `0x00BA0015` | `0x00BA0005` | | 6 | `adr_LOA2`, УМП2 | `0x00BA0016` | `0x00BA0006` | | 7 | `adr_ENG1` | `0x00BA0017` | `0x00BA0007` | | 8 | `adr_PULT` | `0x00BA0018` | `0x00BA0008` | | 9 | `adr_SHKF` | `0x00BA0019` | `0x00BA0009` | ## Приёмные адреса основного контроллера В `BALZAM_167/Src/balzam_7/CanSetupBalzam7.c` настроено: | RX mailbox | CAN ID | Запись обработчиком | |---:|---:|---| | 0 | `0x00BA0010` | `Unites[1]` | | 1 | `0x00BA0011` | `Unites[2]` | | 2 | `0x00BA0012` | `Unites[3]` | | 3 | `0x00BA0013` | `Unites[4]` | | 4 | `0x00BA0014` | `Unites[5]` | | 5 | `0x00BA0015` | `Unites[6]` | | 6 | `0x00BA0016` | `Unites[7]` | | 7 | `0x00BA0017` | `Unites[8]` | | 8 | `0x00BA0018` | `Unites[9]` | | 9 | `0x00745019` | специальная обработка MPU | | 10 | `0x00BA001A` | `Unites[11]` | | 11 | `0x00BA001B` | `Unites[12]` | Причина такого соответствия — запись в обработчике: ```c Unites[box + 1][register_address] = received_data; ``` ## Имена индексов `Unites` Текущие определения в `CanSetupBalzam7.h`: | Индекс | Имя устройства | |---:|---| | 1 | `UKSS1_CAN_DEVICE` | | 2 | `UKSS4_CAN_DEVICE` | | 3 | `UKSS2_CAN_DEVICE` | | 4 | `UKSS3_CAN_DEVICE` | | 5 | `UMP1_CAN_DEVICE` | | 6 | `UMP2_CAN_DEVICE` | | 7 | `UKSS8_CAN_DEVICE` | | 8 | `VPU1_CAN_DEVICE` | | 9 | `UKSS5_CAN_DEVICE` | | 10 | `MPU_CAN_DEVICE` | | 11 | `UKSS6_CAN_DEVICE` | | 12 | `UKSS7_CAN_DEVICE` | ## Фактическое попадание пакетов При текущем коде пакет peripheral с `Mode=N` принимается mailbox `N`, после чего записывается в `Unites[N+1]`. | Peripheral | TX CAN ID | Фактический `Unites` | Имя по текущим константам | |---|---:|---:|---| | `adr_TRN1`, Mode 1 | `0x00BA0011` | `Unites[2]` | `UKSS4_CAN_DEVICE` | | `adr_TRN2`, Mode 2 | `0x00BA0012` | `Unites[3]` | `UKSS2_CAN_DEVICE` | | `adr_POW1`, Mode 3 | `0x00BA0013` | `Unites[4]` | `UKSS3_CAN_DEVICE` | | `adr_POW2`, Mode 4 | `0x00BA0014` | `Unites[5]` | `UMP1_CAN_DEVICE` | | `adr_LOA1`, Mode 5 | `0x00BA0015` | `Unites[6]` | `UMP2_CAN_DEVICE` | | `adr_LOA2`, Mode 6 | `0x00BA0016` | `Unites[7]` | `UKSS8_CAN_DEVICE` | | `adr_ENG1`, Mode 7 | `0x00BA0017` | `Unites[8]` | `VPU1_CAN_DEVICE` | | `adr_PULT`, Mode 8 | `0x00BA0018` | `Unites[9]` | `UKSS5_CAN_DEVICE` | | `adr_SHKF`, Mode 9 | `0x00BA0019` | нет приёма | — | ## Связь с ошибкой обрыва фаз Peripheral передаёт регистры ошибок `modbus[0]`, `modbus[1]` и `modbus[2]` в CAN-пакете с начальным адресом данных `0`. Признак обрыва/перекоса `Wry` занимает бит 2: ```text Wry = 0x0004 ``` Основной контроллер выставляет: ```c mpu_out[125].bit6 = (Unites[UMP1_CAN_DEVICE][0] & 0x0004) || (Unites[UMP1_CAN_DEVICE][1] & 0x0004); mpu_out[125].bit10 = (Unites[UMP2_CAN_DEVICE][0] & 0x0004) || (Unites[UMP2_CAN_DEVICE][1] & 0x0004); ``` С учётом `UMP1_CAN_DEVICE=5` и `UMP2_CAN_DEVICE=6` получаем: | Выход MPU | Читаемые данные | CAN ID, заполняющий эти данные | |---|---|---:| | `mpu_out[125].bit6` | `Unites[5][0/1]` | `0x00BA0014` | | `mpu_out[125].bit10` | `Unites[6][0/1]` | `0x00BA0015` | Но УМП отправляют: | Плата | Фактический CAN ID | Куда пакет попадает сейчас | |---|---:|---| | УМП1, `Mode=5` | `0x00BA0015` | `Unites[6]`, область УМП2 | | УМП2, `Mode=6` | `0x00BA0016` | `Unites[7]`, область `UKSS8` | Таким образом, сейчас присутствует смещение адреса на единицу. УМП1 может влиять на `mpu_out[125].bit10` вместо `bit6`, а УМП2 не попадает ни в один из двух ожидаемых массивов УМП. ## Обратное направление Основной контроллер отправляет устройству с индексом `N` через mailbox `15 + N`, которому назначен CAN ID с номером `N - 1`. | Получатель | TX CAN ID BALZAM | RX CAN ID peripheral | |---|---:|---:| | УМП1 | `0x00BA0004` | `0x00BA0005` | | УМП2 | `0x00BA0005` | `0x00BA0006` | В обратном направлении также имеется смещение на единицу. ## Вывод Перед изменением кода необходимо сверить CAN-трассу и реальные положения адресных перемычек. После подтверждения адресной схемы возможны два варианта: 1. использовать при настройке CAN peripheral значение `Mode - 1`; 2. перенастроить RX/TX mailbox основного контроллера под текущие значения `Mode` peripheral. Комментарии возле mailbox основного проекта частично не совпадают с текущими константами устройств, поэтому менять адреса только по комментариям нельзя.