Dallas (现已被美信收购)的 One Wire 总线是个很有意思的东西。它提供较低的数据速率和简单的连接,在传感器、唯一 ID 存储等领域有着不容忽视的影响力。如果要开发 1-Wire 器件的话,能直接在 PC 上操作是再好不过的了,这样调试将会非常方便。为此 MAXIM 还曾开发过一票 USB 转 1-Wire 的控制器(如 DS2490 等),但是价格都很不菲,而且有些芯片都已经停产了。
如果你已经花了一百多大洋买了专用转接器的话,建议你立即关掉此页面省得心情受到影响。
为了避免不必要的开销,我们可以用 AVR 或者 STM32 等单片机实现 USB 到 1-Wire 的桥接。但是这样做还是有一定的成本,并且还需要制定协议,同时开发单片机固件和上位机程序,颇为麻烦。因此,我虽然曾有过这种想法,但是一直搁置着没有实施。
直到我看到了美信的这篇应用文档:Using a UART to Implement a 1-Wire Bus Master
这篇文档的初衷是让开发者使用单片机上的 UART engine 操作 1-Wire bus 来节省机时,但是实际上 PC 机上也有 RS232 电平的 UART 接口,或者至少我们可以使用一般不超过 10 块大洋的 USB to UART 转接器来获得一个 CMOS/TTL 电平的 UART 接口。实际上,后者和 1-Wire 之间的接口相对简单,所以这里以后者为例,讲讲这种曲线救国的 PC 读写 One Wire 的方案。
首先,我们还需要先翻出来两个 NPN BJT 或者是 N-MOSFET 。鉴于手上 S9014 多得发烧,所以就用它了。剩下还需要三个电阻,一般用 4.7kΩ 的,实际上 200Ω – 20kΩ 基本上都能正常工作。按下图中的电路焊好,它将负责 UART 和 1-Wire 单线总线的转接:
当然,你也可以像我一样添加一些去耦电容什么的,甚至是电源或者总线状态 LED 。这块板子的主要目的是把 UART 的 TX 线上的推挽式输出变换成漏极开路输出并上拉。如果 TX 本身是 OD 的(单片机上可以如此配置,但是 USB to UART 转接器上这种情况不多见),那么直接把 TX 和 RX 连起来并上拉就可以作为 1-Wire 的 DQ 使用。
接下来,连接你的 USB to UART 转换器到 PC 上,把 UART 连接到 PP to OD 转接电路上,然后把 One Wire 的从机(如 DS18B20 传感器)接到 PP to OD 上,硬件方面的连接就完成了。效果如下,上为 SiLabs 的 CP2102 串口转换器,下为按上图自己焊的 PP to OD 转接板:
接下来,去 https://github.com/dword1511/onewire-over-uart 下载并编译有关程序的源码。然后执行“ ./lsow /dev/ttyUSB0 ”就应该可以看到 One-Wire bus 上的设备(手头只有一个 DS18B20 温度传感器,还是防水不锈钢封的,看不到真身)。其中,ttyUSB0 是你使用的 USB 转串口设备。
digitemp_evil 则是为 DS18x20/DS1822 温度传感器设计的,用法同 lsow ,其效果如下:
注意 DS18B20 第一次复位后可能显示温度为 85°C ,再试一次即可获得正确温度。
稍作修改加了点信息,截屏:
是不是很有意思而且很实用呢?如果有多个传感器,直接并接就可以了,这也是 One Wire 的一大优势。
软件 + 硬件从设计、开发到调试完毕也就一天不到的时间,效率高啊。
话说看到这里,不知道那些买了专用转接器的作和感想啊。
设计很巧妙,好啊