之前我用dcexpert(武汉老肖)的PyBoard Lite的SPI去测试SX1278的开发板,出现两个问题:
- SPI总线返回数据出错;
- 从逻辑分析仪上看,SPI总线上多出一个字节。
今天总算是搞定了,其实都是我自己不熟悉所导致的。
代码
from pyb import SPI, Pin
spi = SPI(1, SPI.MASTER, baudrate=100000, polarity=0, phase=0)
cs = Pin('X8',Pin.OUT)
def func(method=0):
buf = bytearray(2)
cs.low()
if method==0:
r = spi.send_recv(b'\x42\x00',2)
elif method==1:
#spi.write_readinto(b'\x42\x00',buf)
spi.send_recv(b'\x42\x00', buf)
cs.high()
print(r)
pyb.delay(100)
def main():
func(0)
func(1)
解释
SPI总线 返回数据出错是因为总线配置polarity错误,SX1278要求为0,而我配置成1;
SPI总线 多返回一个字节,因为我照抄教程,多配置了一个CRC字节,忽略该参数即为None。
至于spi.write_readinto()和spi.send_recv(),使用下来好像是一样的,可能是别名而已。
总结
所以,STM32的Pyboard访问NB-IoT/LoRa都没有问题,而ESP8266目前访问SPI总线还存在问题,有待进一步挖掘。不过ESP8266的GPIO实在太少了,要么外面加一颗I2C GPIO扩展或MCU,要么直接用ESP32了。
ESP8266更新
经过测试,ESP8266的代码也可以运行了。
from machine import Pin, SPI
def spi_demo():
cs = Pin(15, Pin.OUT)
hspi = SPI(1, baudrate=1000000, polarity=0, phase=0)
ob = b'\\x42\\x00'
buf = bytearray(2)
cs.value(0)
hspi.write_readinto(ob, buf)
cs.value(1)
print('buf', buf)
if 0x12 == buf[1]:
print('LoRa chip detected')
else:
print('Check SPI connection')
def main():
spi_demo()
即便是ESP8266的HSPI,也需要单独定义一下CS引脚,否则我的实验结果居然还是无法实现硬件的CS下来,即便是同一GPIO。
网友评论