# 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()`, уходят в шину как есть.