esp32驱动芯网XW12A MicroPython代码

例子

from xw12a import xw12a

a=xw12a(scl=16,sda=18,freq=400000,ASEL='N')
raw_list = a.read()
#[False, False, Ture, False, False, False, False, False, False, False, False, False, False, False, False, False]
num_list=a.read_list()
#[2]

参数

scl=16 use GPIO16 作为 SCL
sda=18 use GPIO18 作为 SDA
freq=400000 时钟频率 400kHz
ASEL='N' 对应下面表格

ASEL List

不同地址对应的ASEL值

ASEL7bit addrASEL=
Floating悬空0x40ASEL='N'
GND0x42ASEL='L'
VDD0x44ASEL='H'

esp32/esp8266

它不是标准的i2c,直接用machine的i2c没跑起来,甚至scan()不到地址。头秃。它的使用方法是

1. 主机发start,然后发7bit地址+写

2. 从机响应,(发0)

3. 从机一次性发送16bit数据,前12bit有效

这个地方应该是machine的i2c报错的原因,没有等主机响应。

4. 主机无响应(发1),然后发stop

代码:

from machine import Pin, I2C
from time import sleep

class xw12a(object):
    def __init__(self, scl=int, sda=int, freq=400000, ASEL='N'):
        if ASEL=="H":
            self.addr_rw='10001001'
        elif ASEL=="L":
            self.addr_rw='10000101'
        else:
            self.addr_rw='10000001'
        
        self.scl=Pin(scl,mode=Pin.OUT,value=(1))
        self.sda=Pin(sda,mode=Pin.OUT,value=(1))
        self.sda_num=sda
        self.sleep_time=1/freq/2
    
    def start(self):
        self.scl(1)
        self.sda(0)
        sleep(self.sleep_time)
    
    def send(self,data):
        self.scl(0)
        sleep(self.sleep_time)
        if data:
            self.sda(1)
        else:
            self.sda(0)
        self.scl(1)
        sleep(self.sleep_time)

    def stop(self):
        self.scl(0)
        sleep(self.sleep_time)
        self.sda(0)
        self.scl(1)
        sleep(self.sleep_time)
        self.sda(1)

    def listen(self):
        self.scl(0)
        sleep(self.sleep_time)
        self.scl(1)
        sleep(self.sleep_time)
        if self.sda.value():
            return False
        else:
            return True
    
    def read(self):
        alist=[]
        self.start()
        for i in self.addr_rw:
            self.send(int(i))
        self.sda=Pin(self.sda_num,mode=Pin.IN)
        if self.listen():
            print('found')
        else:
            print('erro')
        for i in range(16):
            res = self.listen()
            alist.append(res)
        self.sda=Pin(self.sda_num,mode=Pin.OUT,value=(1))
        self.send(1)
        self.stop()
        return alist

    def read_list(self):
        ft=self.read()
        result=[]
        for i in range(12):
            if ft[i]:
                result.append(i)
        return result
            


if __name__ == '__main__':
    a=xw12a(scl=16,sda=18,freq=400000,ASEL='N')
    while True:
        print(a.read())
        print(a.read_list())
        sleep(1)
                        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值