【SAMR21新玩法】26. 单总线 onewire

Adafruit CircuitPython相关
回复
头像
shaoziyang
帖子: 717
注册时间: 2019年 10月 21日 13:48

【SAMR21新玩法】26. 单总线 onewire

#1

帖子 shaoziyang » 2019年 10月 25日 09:24

单总线也是一种常见的工业总线,只需要一个数据线就可以实现数据传输。它是DALLAS的发明,在DALLAS被MAXIM收购后现在属于MAXIM。在CircuitPython中busio模块提供了对单总线的支持,提供了最基本的复位reset()、写位write_bit()、读位read_bit()操作。

onewire的基本用法:

代码: 全选

import busio
import board

onewire = busio.OneWire(board.D9)
onewire.reset()
onewire.write_bit(True)
onewire.write_bit(False)
因为busio只有基本功能,还无法直接读写传感器,因此还需要自己编写子程序。下面是一个简化版本的DS18X20程序,只能读取一个传感器(没有进行ROM搜索)。

代码: 全选

from time import sleep
from busio import OneWire
from microcontroller import pin

onewire = OneWire(pin.PA07)
onewire.reset()

def ow_writebyte(ow, dat):
    for i in range(8):
        ow.write_bit(dat % 2 == 1)
        dat >>= 1
   
def ow_readbyte(ow):
    d = 0
    for i in range(8):
        d >>= 1
        if ow.read_bit():
            d |= 0x80
    return d

def DS18X20Lite(ow):
    ow.reset()
    ow_writebyte(ow, 0xCC)
    ow_writebyte(ow, 0x44)
    ow.reset()
    ow_writebyte(ow, 0xCC)
    ow_writebyte(ow, 0xBE)
    d1 = ow_readbyte(ow)
    d2 = ow_readbyte(ow)
    t = d1 | d2 << 8
    if t & 0x8000:
        t = -((t ^ 0xffff) + 1)
    return t / 16

while 1:
    sleep(1)
    DS18X20Lite(onewire)

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章