LwOW,一个用纯 C 写成、平台无关的 1-Wire 协议库,用 UART 硬件外设跑 1-Wire 的物理层时序

开胃小故事
还记得第一次折腾 DS18B20 温度传感器的时候吗?一根线要拉来拉去,时序得精确到微秒,GPIO 模拟“比特打点”写起来头都大。要不买块专用芯片?要不干脆学做光刻?别慌,今天给大家安利一个小而美的开源库——LwOW,让你用现成的 UART 外设轻松搞定 1-Wire!

LwOW 是啥玩意儿?
LwOW,全称 Lightweight OneWire,是一个用纯 C 写成、平台无关的 1-Wire 协议库。它的主打功能就是:

  • • 用 UART 硬件外设跑 1-Wire 的物理层时序

  • • 或者直接操纵 GPIO 引脚“手撕”1-Wire
    不管你是 STM32、ESP32 还是裸奔的小核,只要有 UART 或 GPIO,就能用 LwOW。

亮点功能盘点

  • • 纯 C11 代码,移植无压力;

  • • 两档标准速率:9600 和 115200 波特,轻松对上 1-Wire Reset、读写时隙;

  • • 硬件定时搞起,CPU 无须紧盯微秒级中断;

  • • 高性能 MCU 下还能用 DMA,zero copy;

  • • DS18B20 等常见设备驱动开箱即用;

  • • 线程安全 API 设计,FreeRTOS、RT-Thread 随便挂;

  • • MIT 许可证,商用、私活都没问题。

为啥还要 GPIO 手撕?
有些系统 UART 用完了怎么办?LwOW 分离了高层协议和底层系统驱动:只要你帮它实现两行函数——拉低/释放 IO、读写引脚状态,就能用最原始的“位打点”方式继续通讯。虽然效率比不上 UART,但应急绝对够用。

实战演练:STM32+DS18B20

  1. 1. 配置 UART1,波特率 115200,8N1;

  2. 2. 在 HAL 层写两个回调:

    uint8_t lwow_uart_tx(void *ctx, const uint8_t *buf, size_t len) {
        HAL_UART_Transmit(ctx, buf, len, HAL_MAX_DELAY);
        return 0;
    }
    uint8_t lwow_uart_rx(void *ctx, uint8_t *buf, size_t len) {
        HAL_UART_Receive(ctx, buf, len, HAL_MAX_DELAY);
        return 0;
    }
  3. 3. 初始化 LwOW 核心:

    lwow_t ow;
    lwow_init_uart(&ow, &huart1);  // huart1 是 HAL_UART_HandleTypeDef
  4. 4. 搜索从机、读温度,就像下面这么几行:

    lwow_rom_search(&ow, rom_list, &num);
    lwow_read_scratchpad(&ow, rom_list[0], buf, sizeof(buf));
    float temp = lwow_scratchpad_to_celsius(buf);

不到 20 行代码,DS18B20 温度一目了然。

总结
要玩 1-Wire 总线,没必要忍受 GPIO 打点的痛苦,也别盲目上桥接芯片。LwOW 用最常见的 UART 外设就能准确生成时序,高效又省事;更贴心地保留了直接操 GPIO 的选项。无论你是新手小白还是老司机,都能用这套库快速上手,把更多精力放在业务逻辑上。赶紧试试吧!

项目地址:https://github.com/MaJerle/lwow

发表评论