feat(can-sensor): передача ROM датчиков парой CAN-кадров
Перенесён из KONOR_ds18b20/lib/can. 64-битный идентификатор датчика и преамбула не помещаются в восемь байт поля данных, поэтому сообщение идёт двумя кадрами. Сборку на приёме библиотека делает сама: кадр ROM без преамбулы и кадр неверной длины отбрасываются и учитываются в dropped_frames.
This commit is contained in:
53
c/can-sensor/README.md
Normal file
53
c/can-sensor/README.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# can-sensor
|
||||
|
||||
Передача 64-битных идентификаторов датчиков (ROM 1-Wire) по шине CAN.
|
||||
|
||||
Ядро на C99: не включает заголовки периферии, не обращается к регистрам,
|
||||
не пользуется прерываниями. Обмен идёт через таблицу `CanSensor_Io`,
|
||||
которую заполняет порт платы.
|
||||
|
||||
Сообщение состоит из двух классических CAN-кадров — 64-битный идентификатор
|
||||
и преамбула вместе не помещаются в восемь байтов поля данных:
|
||||
|
||||
```
|
||||
кадр 1 — преамбула, DLC = 2 | команда | позиция |
|
||||
кадр 2 — идентификатор, DLC = 8| ROM 8 байт |
|
||||
```
|
||||
|
||||
## Состав
|
||||
|
||||
| Файл | Что делает | Зависимости |
|
||||
|---|---|---|
|
||||
| `can_sensor.h`, `can_sensor.c` | сборка и разбор пары кадров, повторы передачи, счётчики обмена | `stdint.h` |
|
||||
|
||||
Приём собирает сообщение сам: кадр ROM без преамбулы и кадр с неверной
|
||||
длиной отбрасываются и учитываются в `dropped_frames`.
|
||||
|
||||
## Что нужно от платформы
|
||||
|
||||
```c
|
||||
uint8_t send(void *ctx, const CanSensor_Frame *frame); /* 1 — кадр принят */
|
||||
uint8_t receive(void *ctx, CanSensor_Frame *frame); /* 1 — кадр получен */
|
||||
```
|
||||
|
||||
`receive` необязателен: с нулевым полем узел работает только на передачу.
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
```c
|
||||
CanSensor link;
|
||||
CanSensor_Io io = { .send = bxcan_send, .receive = bxcan_receive, .context = &board };
|
||||
CanSensor_Config config;
|
||||
CanSensor_ConfigDefault(&config); /* tx_id 0x200, кадр ROM 0x201, 3 попытки */
|
||||
|
||||
CanSensor_Init(&link, &io, &config);
|
||||
CanSensor_SendId(&link, position, rom);
|
||||
|
||||
CanSensor_Message message;
|
||||
if (CanSensor_Poll(&link, &message)) { /* принят идентификатор */ }
|
||||
```
|
||||
|
||||
## Проверено в проектах
|
||||
|
||||
`KONOR_ds18b20` — bxCAN на STM32F103C8T6. Естественная пара — [`ds18b20`](../ds18b20):
|
||||
ROM-коды, найденные `DS18B20_Search()`, уходят в шину как есть.
|
||||
Reference in New Issue
Block a user