Skip to content

Commit 29c2e08

Browse files
95ArnoDingArno Ding(丁嵩)
and
Arno Ding(丁嵩)
authored
bsp相关资料补全 (#3)
* bsp相关资料补全 * bsp相关资料补全2 --------- Co-authored-by: Arno Ding(丁嵩) <arno.ding@QUECTEL.COM>
1 parent 5cec8fc commit 29c2e08

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+3273
-0
lines changed
1010 KB
Binary file not shown.

libraries/AW8733ATQR/AW8733ATQR.pdf

1.13 MB
Binary file not shown.

libraries/AW9523B/aw9523.py

+274
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,274 @@
1+
# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
#!/usr/bin/env python
16+
# -*- coding: utf-8 -*-
17+
18+
"""
19+
@file :aw9523.py
20+
@author :Jack Sun (jack.sun@quectel.com)
21+
@brief :<description>
22+
@version :1.0.0
23+
@date :2023-02-01 09:21:44
24+
@copyright :Copyright (c) 2022
25+
"""
26+
27+
from queue import Queue
28+
from machine import ExtInt
29+
from usr.logging import Logger
30+
from usr.common import create_thread
31+
32+
log = Logger(__name__)
33+
34+
35+
_AW9523_DEFAULT_ADDR_KEY = (0x58) # The key drive address is 0x58, and the IO extension address is 0x5B
36+
_AW9523_DEFAULT_ADDR_IO = (0x5B)
37+
_AW9523_REG_CHIPID = (0x10) # Register for hardcode chip ID
38+
_AW9523_REG_SOFTRESET = (0x7F) # Register for soft resetting
39+
_AW9523_REG_INTENABLE0 = (0x06) # Register for enabling interrupt
40+
_AW9523_REG_GCR = (0x11) # Register for general configuration
41+
_AW9523_REG_LEDMODE = (0x12) # Register for configuring current
42+
_AW9523_REG_INPUT0 = (0x00) # Register for reading input values
43+
_AW9523_REG_OUTPUT0 = (0x02) # Register for writing output values
44+
_AW9523_REG_CONFIG0 = (0x04) # Register for configuring direction
45+
46+
47+
class Port():
48+
# 表示两个8位端口之一
49+
def __init__(self, port, aw):
50+
self._port = port & 1 # 0=PortA, 1=PortB
51+
self._aw = aw
52+
53+
def _which_reg(self, reg):
54+
return reg + self._port
55+
56+
def _flip_property_bit(self, reg, condition, bit):
57+
if condition:
58+
setattr(self, reg, getattr(self, reg) | bit)
59+
else:
60+
setattr(self, reg, getattr(self, reg) & ~bit)
61+
62+
def _read(self, reg):
63+
r_data = bytearray(1)
64+
self._aw._i2c.read(self._aw._address, bytearray([self._which_reg(reg)]), 1, r_data, 1, 0)
65+
return list(r_data)[0]
66+
67+
def _write(self, reg, val):
68+
val &= 0xff
69+
self._aw._i2c.write(self._aw._address, bytearray([self._which_reg(reg)]), 1, bytearray([val]), 1)
70+
71+
@property
72+
def mode(self):
73+
return self._read(_AW9523_REG_CONFIG0)
74+
75+
@mode.setter
76+
def mode(self, val):
77+
self._write(_AW9523_REG_CONFIG0, val)
78+
79+
@property
80+
def interrupt_enable(self):
81+
return self._read(_AW9523_REG_INTENABLE0)
82+
83+
@interrupt_enable.setter
84+
def interrupt_enable(self, val):
85+
# log.debug("val:",bin(val))
86+
self._write(_AW9523_REG_INTENABLE0, val)
87+
88+
# read only
89+
@property
90+
def interrupt_flag(self):
91+
return self._read(_AW9523_REG_INPUT0)
92+
93+
@property
94+
def gpio(self):
95+
return self._read(_AW9523_REG_OUTPUT0)
96+
97+
@gpio.setter
98+
def gpio(self, val):
99+
# writing to this register modifies the OLAT register for pins configured as output
100+
self._write(_AW9523_REG_OUTPUT0, val)
101+
102+
103+
class AW9523:
104+
105+
# _pin_to_addr = ([0x24 + pin for pin in range(8)] +
106+
# [0x20 + pin - 8 for pin in range(8, 12)] +
107+
# [0x2C + pin - 12 for pin in range(12, 16)])
108+
109+
def __init__(self, i2c_bus, int_pin=1, int_mode=0, int_callback=None, address=_AW9523_DEFAULT_ADDR_KEY):
110+
self._i2c = i2c_bus
111+
self._int_pin = int_pin
112+
self._int_mode = int_mode
113+
self._address = address
114+
self._int_callback = int_callback
115+
self.__ext_thread_id = None
116+
self.__ext_queue = Queue()
117+
self._ret = 0x001F # 接收电平状态
118+
119+
if self._address == _AW9523_DEFAULT_ADDR_KEY:
120+
self._extint = ExtInt(self._int_pin, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__extfun)
121+
self._extint.enable()
122+
self.__ext_thread_id = create_thread(self.__extfun_thread, stack_size=0x4000)
123+
124+
# Read device ID. AW9523B ID read default value is 23H
125+
self.read_buf = bytearray(5)
126+
self._i2c.read(address, bytearray((_AW9523_REG_CHIPID, 0xff)), 1, self.read_buf, 1, 20)
127+
# log.debug("read_buff:", self.read_buf)
128+
if (self.read_buf[0] != 0x23):
129+
raise AttributeError("Cannot find a AW9523")
130+
131+
# self.reset()
132+
self.porta = Port(0, self)
133+
self.portb = Port(1, self)
134+
135+
def __extfun(self, args):
136+
self.__ext_queue.put(args)
137+
138+
#执行中断回调
139+
def __extfun_thread(self):
140+
while 1:
141+
args = self.__ext_queue.get()
142+
log.debug('### interrupt {} ###'.format(args))
143+
# 读取两组电平,判断触发了中断的io,中断信号前后电平对比
144+
# status_0 = self._read(_AW9523_REG_INPUT0)
145+
# status_1 = self._read(_AW9523_REG_INPUT0 + 1)
146+
self._i2c.read(_AW9523_DEFAULT_ADDR_KEY, bytearray((_AW9523_REG_INPUT0, 0xff)), 1, self.read_buf, 1, 20)
147+
status_0 = self.read_buf[0]
148+
self._i2c.read(_AW9523_DEFAULT_ADDR_KEY, bytearray((_AW9523_REG_INPUT0 + 1, 0xff)), 1, self.read_buf, 1, 20)
149+
status_1 = self.read_buf[0]
150+
status = (status_1 << 8) | status_0
151+
# log.debug('### io level {} ###'.format(bin(status)))
152+
153+
change = (self._ret ^ status)
154+
if self._int_callback is None:
155+
return
156+
157+
#byte 引脚号 pin_level 电平
158+
if change is not 0:
159+
byte = 0
160+
pin_level = 1
161+
while byte < 16:
162+
if (change & (1 << byte)):
163+
break
164+
else:
165+
byte = byte + 1
166+
167+
if (status & (1 << byte)):
168+
pin_level = 1
169+
else:
170+
pin_level = 0
171+
172+
#判断是否该IO是否中断使能
173+
# flag_0 = self._read(_AW9523_REG_INTENABLE0)
174+
# flag_1 = self._read(_AW9523_REG_INTENABLE0 + 1)
175+
self._i2c.read(_AW9523_DEFAULT_ADDR_KEY, bytearray((_AW9523_REG_INTENABLE0, 0xff)), 1, self.read_buf, 1, 20)
176+
flag_0 = self.read_buf[0]
177+
self._i2c.read(_AW9523_DEFAULT_ADDR_KEY, bytearray((_AW9523_REG_INTENABLE0 + 1, 0xff)), 1, self.read_buf, 1, 20)
178+
flag_1 = self.read_buf[0]
179+
flag = (flag_1 << 8) | flag_0
180+
if flag & (1 << byte) == 0:
181+
list_push = [byte, pin_level]
182+
self._int_callback(list_push)
183+
# log.debug('### io level {} ###'.format(bin(status)))
184+
# 保存上一次电平状态
185+
self._ret = status
186+
187+
def _read(self, addr):
188+
r_data = bytearray(1)
189+
self._i2c.read(self._address, bytearray([addr]), 1, r_data, 1, 20)
190+
return list(r_data)[0]
191+
192+
def _write(self, addr, *vals):
193+
# log.debug("write vals:", vals)
194+
self._i2c.write(self._address, bytearray([addr]), 1, bytearray(list(vals)), len(list(vals)))
195+
196+
def reset(self):
197+
self._write(_AW9523_REG_SOFTRESET, 0x00) # 对该寄存器写 00H 复位 reset
198+
self._write(_AW9523_REG_GCR, 0b00010000) # pushpull output D[4]=0,Open-Drain模式; D[4]=1,Push-Pull模式
199+
self._write(_AW9523_REG_INTENABLE0, 0xff, 0xff) # no IRQ 0-中断使能; 1-中断不使能
200+
self._write(_AW9523_REG_INTENABLE0 + 1, 0xff, 0xff) # no IRQ
201+
# self._write(_AW9523_REG_LEDMODE, 0xff, 0xff) #gpio mode
202+
# self._write(_AW9523_REG_LEDMODE+1, 0xff, 0xff) #gpio mode
203+
204+
# set aw9523 pin
205+
def pin(self, pin, mode=None, value=None, interrupt_enable=None):
206+
assert 0 <= pin <= 15
207+
port = self.portb if pin // 8 else self.porta
208+
bit = (1 << (pin % 8))
209+
if mode is not None:
210+
# 0: Pin is configured as an output
211+
# 1: Pin is configured as an input
212+
port._flip_property_bit('mode', mode & 1, bit)
213+
if value is not None:
214+
# 0: 引脚设置为逻辑低电平
215+
# 1: 引脚设置为逻辑高电平
216+
port._flip_property_bit('gpio', value & 1, bit)
217+
if interrupt_enable is not None:
218+
# 1: Disables GPIO input pin for interrupt-on-change event
219+
# 0: Enables GPIO input pin for interrupt-on-change event
220+
if interrupt_enable == 0:
221+
interrupt_enable = 1
222+
else:
223+
interrupt_enable = 0
224+
port._flip_property_bit('interrupt_enable', interrupt_enable & 1, bit)
225+
if value is None:
226+
return port.gpio & bit == bit
227+
228+
# mode (IODIR register)
229+
@property
230+
def mode(self):
231+
return self.porta.mode | (self.portb.mode << 8)
232+
233+
@mode.setter
234+
def mode(self, val):
235+
self.porta.mode = val
236+
self.portb.mode = (val >> 8)
237+
238+
# interrupt_enable (GPINTEN register)
239+
@property
240+
def interrupt_enable(self):
241+
return self.porta.interrupt_enable | (self.portb.interrupt_enable << 8)
242+
243+
@interrupt_enable.setter
244+
def interrupt_enable(self, val):
245+
self.porta.interrupt_enable = val
246+
self.portb.interrupt_enable = (val >> 8)
247+
248+
# interrupt_flag (INTF register)
249+
# read only
250+
@property
251+
def interrupt_flag(self):
252+
return self.porta.interrupt_flag | (self.portb.interrupt_flag << 8)
253+
254+
# gpio (GPIO register)
255+
@property
256+
def gpio(self):
257+
return self.porta.gpio | (self.portb.gpio << 8)
258+
259+
@gpio.setter
260+
def gpio(self, val):
261+
self.porta.gpio = val
262+
self.portb.gpio = (val >> 8)
263+
264+
# 获取引脚电平,pin为引脚号0~15
265+
def read(self, pin):
266+
status_0 = self._read(_AW9523_REG_INPUT0)
267+
status_1 = self._read(_AW9523_REG_INPUT0 + 1)
268+
status = (status_1 << 8) | status_0
269+
pin_level = 0
270+
if (status & (1 << pin)):
271+
pin_level = 1
272+
else:
273+
pin_level = 0
274+
return pin_level

libraries/BF3901/BF3901CS.pdf

240 KB
Binary file not shown.

libraries/BM8563/Belling-BM8563.pdf

577 KB
Binary file not shown.

libraries/BME280/BME280_datasheet.pdf

1.85 MB
Binary file not shown.
607 KB
Binary file not shown.
1.28 MB
Binary file not shown.

libraries/ESP8266/esp8266.py

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import slip
2+
import dataCall
3+
import utime
4+
import usocket
5+
import checkNet
6+
from machine import UART
7+
from usr.common_except import CustomError
8+
9+
class Esp8266(object):
10+
def __init__(self):
11+
self._wait_datacall_success()
12+
13+
def _wait_datacall_success(self):
14+
print('waiting datacall success...')
15+
while 1:
16+
self.lteInfo = dataCall.getInfo(1, 0)
17+
if self.lteInfo != -1:
18+
break
19+
utime.sleep(2)
20+
print('success get dataCall info: ')
21+
print(self.lteInfo)
22+
23+
class Esp8266_ap(Esp8266):
24+
ESP_SERVER = '172.16.1.5'
25+
ESP_SERVER_PORT = 1000
26+
27+
def __init__(self,uart):
28+
super().__init__()
29+
self.wifi_off()
30+
# 创建slip网卡
31+
ret = slip.construct(uart, slip.SLIP_INNER, 0)
32+
print(ret)
33+
if ret != 0:
34+
raise CustomError("slip netif construct fail")
35+
36+
def _pack_tlv_format(self,head, content):
37+
if len(content) == 0 or len(content) > 9999 or len(head) != 2:
38+
print('illegal tlv content')
39+
return 0
40+
len_str = '%04d' % len(content)
41+
msg = head + len_str + content
42+
return msg
43+
44+
def wifi_on(self):
45+
# 获取slip的网络配置
46+
slipInfo = slip.ipconfig()
47+
print('slip ipconfig: ')
48+
print(slipInfo)
49+
if self.lteInfo != -1:
50+
# 设置默认网卡,当设置slip作为上网卡时不设置该接口,即SLIP_OUTER类型
51+
ret = slip.set_default_netif(self.lteInfo[2][2])
52+
if ret != 0:
53+
print('slip set default netif fail')
54+
return -1
55+
# 添加路由信息,设置网卡转发规则192.168.4.0表示ap的网段,255.255.255.0子网掩码
56+
ret = slip.router_add('192.168.4.0', '255.255.255.0')
57+
if ret != 0:
58+
print('slip add subnet routers fail')
59+
return -1
60+
return 0
61+
62+
def set_ap(self,name=None,pwd=None,project_name='wifi_setap',project_version='1.0.0'):
63+
checknet = checkNet.CheckNetwork(project_name, project_version)
64+
stagecode, subcode = checknet.wait_network_connected(30)
65+
if stagecode != 3 or subcode != 1:
66+
print('fail to set ap. ')
67+
return -1
68+
# 创建一个socket实例
69+
sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
70+
# 增加端口复用
71+
sock.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1)
72+
# 解析域名
73+
addr = usocket.getaddrinfo(self.ESP_SERVER, self.ESP_SERVER_PORT)
74+
print(addr)
75+
sockaddr = addr[0][-1]
76+
print(sockaddr)
77+
bind_addr = ('172.16.1.2', 10001)
78+
ret = sock.bind(bind_addr)
79+
print('bind success')
80+
print(ret)
81+
# 建立连接
82+
sock.connect(sockaddr)
83+
# 向服务端发送消息
84+
if name == None and pwd == None:
85+
return -1
86+
elif name == None:
87+
msg = self._pack_tlv_format('F1', pwd)
88+
elif pwd == None:
89+
msg = self._pack_tlv_format('F2', name)
90+
else:
91+
msg = self._pack_tlv_format('F3', name+','+pwd)
92+
print(msg)
93+
ret = sock.send(msg)
94+
print('send %d bytes' % ret)
95+
# 接收服务端消息
96+
data = sock.recv(256)
97+
print('recv %s bytes:' % len(data))
98+
print(data.decode())
99+
100+
# 关闭连接
101+
sock.close()
102+
return 0
103+
104+
def wifi_off(self):
105+
slip.destroy()
106+
107+
if __name__=="__main__":
108+
esp8266 = Esp8266_ap(UART.UART2)
109+
esp8266.set_ap(name='大好年华',pwd='11111111')
110+
err = esp8266.wifi_on()
111+
if err == 0:
112+
print('slip network card create success')
113+
else:
114+
print('slip network card create fail')

libraries/GC032A/GC032A.pdf

785 KB
Binary file not shown.

0 commit comments

Comments
 (0)