Files
templates/c/can-sensor/README.md
Andrey Kruchinkin 13f2c8fe64 feat(can-sensor): передача ROM датчиков парой CAN-кадров
Перенесён из KONOR_ds18b20/lib/can.

64-битный идентификатор датчика и преамбула не помещаются в восемь байт
поля данных, поэтому сообщение идёт двумя кадрами. Сборку на приёме
библиотека делает сама: кадр ROM без преамбулы и кадр неверной длины
отбрасываются и учитываются в dropped_frames.
2026-08-23 01:15:12 +03:00

54 lines
2.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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()`, уходят в шину как есть.