今天收到了等了两周的W801开发板, 和W806开发板外观基本一致, 但是尺寸, 排针和元件布局都有调整.
W801和W806开发板的实物对比
两个芯片核心完全一样, 芯片布局基本一致, 看差异就能大致了解W801的配置
W801的规格书
增加的WIFI和蓝牙的描述
W801的规格书增加了PIN脚频率和驱动能力栏, 各个PIN的最高频率是有区别的, 从10MHz到80MHz不等, 从后面的功能描述看, 与W806是一致的, 因此猜测此频率描述也适用于W806
W806和W801并非pin-pin兼容, 从PIN#5到#9这5个PIN对应的功能是不同的, 具体区别如下
W801除了将MicroUSB换成了Type-C, 还增加了Reset, 5V以及多组3.3V和GND的排线引出, 这个比较不错, 在W806上没有5V引出, 如果有5V外设的话比较不方便
W801增加了板载天线, 因此比W806长出了一截
W801的SDK是在W800 SDK的基础上修改制作的, 和W806 SDK的结构相似, 但是代码差异巨大. 已经放到了Gitee wm-sdk-w80x, 有兴趣的可以下载尝试. 编译方式与W806相同, 先通过make menuconfig
配置环境和工具链, 然后通过make
编译.
另一方面, 因为W801和W806除了无线部分其它结构基本相同, 因此W806 SDK编译产生的固件是可以直接运行在W801上的, 这点已经验证过了.
W801开发板在下载上和W806有一些区别. W801因为内置了串口的RTS控制, 对应观察到的一些现象:
使用W806的SDK下载烧录W801时, 需要将rules.mk中的-rs参数修改一下, 从at
改为rts
, 就能对W801开发板写入了
run:all
@$(WM_TOOL) -c $(DL_PORT) -rs rts -ds $(DL_BAUD) -dl $(FIRMWAREDIR)/$(TARGET)/$(TARGET).fls -sl str -ws 115200
monitor:
@$(WM_TOOL) -c $(DL_PORT) -sl str -ws 115200
list:
@$(WM_TOOL) -l
down:
@$(WM_TOOL) -c $(DL_PORT) -rs rts -ds $(DL_BAUD) -dl $(FIRMWAREDIR)/$(TARGET)/$(TARGET).fls
image:all
@$(WM_TOOL) -c $(DL_PORT) -rs at -ds $(DL_BAUD) -dl $(FIRMWAREDIR)/$(TARGET)/$(TARGET).img
flash:all
@$(WM_TOOL) -c $(DL_PORT) -rs rts -ds $(DL_BAUD) -dl $(FIRMWAREDIR)/$(TARGET)/$(TARGET).fls
erase:
@$(WM_TOOL) -c $(DL_PORT) -rs at -eo all
烧录命令make flash
...
make[1]: Leaving directory '/home/milton/wm-sdk-w806/platform/drivers'
LINK W806.elf
OBJCOPY W806.bin
generate normal image completed.
generate normal image completed.
compress binary completed.
generate compressed image completed.
build finished!
connecting serial...
serial connected.
wait serial sync...
serial sync sucess.
mac 58-6D-CD-C1-CC-AA.
start download.
0% [####] 100%
download completed.
如果要单独控制W801进入下载模式, 需要用以下的步骤
0x1B
, 即Esc对应的编码C
Secboot V0.6\r\n
CCCCCCCCCCCCCCCC
import serial
import time
port = serial.Serial(
"/dev/ttyUSB0",
baudrate=115200,
rtscts=True,
timeout=0)
if port.isOpen():
print('opened')
else:
print('open failed')
packet = bytearray()
packet.append(0x1B)
port.rts = False # This will pull the voltage high
while True:
for i in range(0, 100):
port.write(packet)
time.sleep(0.01)
data = port.read_all()
print(data)
if len(data) == 0 or data == b'enter main\r\n':
print('.')
continue
else:
break
print('pass')
while True:
data = port.read_all()
print(data)
time.sleep(1)
W801开发板在RTS的处理上是有问题的.
在Windows下, 串口程序可以在不改变RTS电平的情况下连接和断开串口, 因此可以做到不中断开发板的运行, 随时接入查看日志, 但是在Linux下, 串口程序在获取串口的fd时, 驱动会主动下拉RTS, 即使串口程序立刻将RTS恢复回高电平, 也会留下一个至少0.3毫秒的脉冲, 导致开发板复位重启. 如果不恢复高电平, 开发板就处于暂停运行的状态. 这样带来的问题就是在Linux下无法中途接入查看日志, 接入即重启.
关于Linux下串口RTS的问题可以查看 How to open serial port in linux without changing any pin?
软件上, 可以通过修改和替换驱动取消连接时的RTS低电平脉冲, 这个一般不推荐使用, 因为可能会影响到其它的串口设备. 从物理上解决会比较简单, 就是加一个电容来抵消这个脉冲, 实际测试, 在Reset和GND之间接入一个10uF的电容, 就可以抵消8ms以内的低电平影响. 加入电容后, 只要串口程序在获得fd后立即拉高RTS电平, 就不会中断或者重启开发板.
如果要同时在Win10和Linux上使用, 10uF可能会导致Win10识别串口硬件失败(设备出感叹号), 需要调低到5uF, 此时在Linux下能消除的低电平脉冲宽度大约在3ms.
以上是测试的连接方式, 实际使用中推荐使用4.7uF的0603的贴片电容直接连接, 注意焊接时不要短路到到相邻的PA4和PB6. 如果担心平时使用时不慎短接, 可以在上面覆盖热熔胶做绝缘.