例子
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值
ASEL | 7bit addr | ASEL= |
---|---|---|
Floating悬空 | 0x40 | ASEL='N' |
GND | 0x42 | ASEL='L' |
VDD | 0x44 | ASEL='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)