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

2.3 KiB
Raw Permalink Blame History

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.

Что нужно от платформы

uint8_t send(void *ctx, const CanSensor_Frame *frame);     /* 1 — кадр принят */
uint8_t receive(void *ctx, CanSensor_Frame *frame);        /* 1 — кадр получен */

receive необязателен: с нулевым полем узел работает только на передачу.

Быстрый старт

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: ROM-коды, найденные DS18B20_Search(), уходят в шину как есть.