168 lines
6.4 KiB
Markdown
168 lines
6.4 KiB
Markdown
# Карта 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 основного проекта частично не совпадают с текущими
|
||
константами устройств, поэтому менять адреса только по комментариям нельзя.
|
||
|