Когда я делаю так: for (uint8_t i = 0; i < 8; i++) { buffer[i] = ((data >> i) & 1) * 0xFF; } HAL_UART_Transmit(instance->huart, buffer, 8, 1000); То все данные уходят, как надо, но средствами HAL нельзя прочитать из порта. Если же сделать так: HAL_UART_Transmit(instance->huart, (uint8_t*)(0xFF), 1, 1000); HAL_UART_Transmit(instance->huart, (uint8_t*)(0xFF), 1, 1000); HAL_UART_Transmit(instance->huart, (uint8_t*)(0xFF), 1, 1000); ... То 1-wire не работает, а логический анализатор пишет, что длина пакета слишклм мала.
Комментарии: 21
Alexander
А старт/стоп биты учитываются?
Aleksandr
Вероятно, могут мешать. Но как от них избавиться?
Alexander
Хз. А если ногой дергаешь по таймеру - onewire работает?
Aleksandr
Оно работает, если передавать по байту. Но как читать? Это стоп биты...
Alexander
TX с RX объединить.
Aleksandr
Полный дуплекс, через диод?
Alexander
Да, как вариант
Aleksandr
Люди без этого делают Но не на HAL
Alexander
Еще можно в OpenDrain ногу настроить
Aleksandr
Так она и так OD
Alexander
Тогда датчик может просаживать ногу вниз и ее состояние можно мониторить по данным порта.
Aleksandr
Так и делается. Но как прочитать данные порта, если он пишет целым байтом, а читать надо после каждого бита? Бит OW-шины - это байт USART-а
Alexander
Так целый байт UART это один бит OW
Aleksandr
Тогда стоп биты мешают
Alexander
Отправляешь, ждешь немного, считываешь IDR порта.
Alexander
Так вроде у OneWire байты длиной кодируются.
Aleksandr
Не получается так, во всяком случае, как с кодом, что я написал выше
Alexander
https://mcublog.xyz/2017/01/14/apparatnaya-realizaciya-1-wire-na-stm32f030/ А что-то типа такого смотрел?
Turunchuk
Бодрейт с 9600 на 115200 и обратно переключаешь?
Aleksandr
Естественно. В функции ресета Вот отправка целым байтом - всё хорошо.
Aleksandr
По одному отправляю - стопы мешают