# can-sensor Однокадровый транспорт SETCAN SETTINGS для привязки 64-битного ROM 1-Wire к локации «номер сборки + позиция» по шине CAN. Ядро на C99: не включает заголовки периферии, не обращается к регистрам, не пользуется прерываниями. Обмен идёт через таблицу `CanSensor_Io`, которую заполняет порт платы. Сообщение помещается в один Extended CAN-кадр: локация находится в Body 29-битного ID, а ROM — в восьми байтах payload: ``` запрос 0x17FEZZYY: DLC=0 — GET, DLC=8 — WRITE/REPLACE/CLEAR ответ 0x1FFEZZYY: DLC=8 — текущий ROM, DLC=1 — код ошибки ``` ## Состав | Файл | Что делает | Зависимости | |---|---|---| | `can_sensor.h`, `can_sensor.c` | сборка и разбор SETTINGS, повторы передачи, счётчики обмена | `stdint.h` | `ZZ` — номер сборки, `YY` — позиция. Нулевой ROM с DLC=8 очищает локацию. ## Что нужно от платформы ```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 0x1FFE0000, RX 0x17FE0000 */ CanSensor_Init(&link, &io, &config); CanSensor_SendId(&link, position, assembly_serial, rom); CanSensor_Message message; if (CanSensor_Poll(&link, &message)) { /* принят идентификатор */ } ``` ## Проверено в проектах `KONOR_ds18b20` — bxCAN на STM32F103C8T6. Естественная пара — [`ds18b20`](../ds18b20): ROM-коды, найденные `DS18B20_Search()`, уходят в шину как есть.