|
本帖最后由 liccil 于 2020-3-30 19:02 编辑
昨天晚上突发奇想,能不能用UART串口直接读写DS18B20呢
毕竟电平一致,例如空闲时为高电平,串口的起始位正好用于读写单总线器件。串口利用波特率发生器可以构造准确的延时,
通过改变串口波特率,或者构造特殊序列去模拟单总线信号。
中午午休时间简单试验了一下 成功了。
硬件原理如下:一片USB转CP2102的U转串小板,DS18B20一枚,一个1N4148二极管。因为CP2102的TXD为推挽模式,为了避免电平冲突,需要
加一个1N4148。
利用RXD天生的上拉电阻当接收,拉高DS18B20。
接下来就是用示波器 调波特率;
网上找的图,这个是UART串口的波形图:
当发送一个byte时,uart实际输出的是带起始位0和停止位1的。
我们可以利用起始位和停止位,和发送的数据,一起拼凑出需要的波形;
例如DS18B20复位命令,可以使用38400bps,停止位1bit,连续发送两个字节0x00和0xff;
0x00正好就是DS18B20的复位长脉冲;发送后电平被停止位自动拉高;此时DS18B20会自行拉低,表示自己的存在;
后面跟了个0xff,是串口输出高电平;但此时被DS18B20拉住了一段时间,所以发送0xff 回读实测是0xfe(串口是先发送、接收LSB)。由于串口与DS18B20是异步的,因此回读具体是什么
取决于波特率,与DS18B20本身的延时。但肯定不是0xff。
我们可以根据这个判断DS18B20是否存在。当然,波特率不能太高或太低,否则无法拼凑出合适的时间。
上图就是用示波器看DS18B20的复位波形;因为有TXD串联的二极管压降,所以DS18B20在拉低时波形更低。
发命令时,波特率需要提升至115200bps;如上图所示,要给DS18B20发1直接串口发0xFF,发0就发0x00;
上图为给DS18B20发送0xCC,即跳过ROM命令。
读取时也很简单。DS18B20回读时是2字节,因此可以串口发送2*8=16个0xff。
串口自行发送起始位/停止位,这让上位机的编程非常方便,只发送串口数据即可。延时的问题直接波特率发生器搞定。
写0xff后 如果回读的值不是0xff,那就表示DS18B20拉低了,如果还是0xff,那就是高。
中午利用剩余时间胡乱写了个C#的小程序,可以正常读取温度了。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|