一个非常基本的电路使用MicroPython和SPI接口将ESP8266 MCU连接到74HC595移位寄存器。这是我尝试发送数据的方式:
from machine import Pin, SPI
hspi = SPI(-1, baudrate=50000, polarity=0, phase=0, sck=Pin(14), mosi=Pin(13), miso=Pin(12), bits=8)
latch_pin = Pin(15, Pin.OUT)
latch_pin.off()
def send(s):
hspi.write(s)
latch_pin.on()
latch_pin.off()
为了进行测试,我在输出引脚和+ 5V(通过100欧姆电阻)之间放置了8个LED,以查看发生了什么,并尝试使用此测试功能发送数据:
import time
def test_one(s):
send(chr(int(s)))
time.sleep(0.5) # only to be able to examine the leds after data was sent
def test():
[test_one(s) for s in [
'0b00000000',
'0b10000000',
'0b01000000',
'0b00100000',
'0b00010000',
'0b00001000',
'0b00000100',
'0b00000010',
'0b00000001',
'0b01111111',
'0b10111111',
'0b11011111',
'0b11101111',
'0b11110111',
'0b11111011',
'0b11111101',
'0b11111110',
'0b11111111']]
test()
如您所见,此测试中有移动的1和移动的0。结果非常有趣。值0000 0000将作为1100 0010进行传输。此后,正确设置了所有设置了一位的值。然后0111 1111再次正确。此后,所有值再次错误。我已经用逻辑分析仪检查了输出,看来这些值是以两个字节而不是一个字节发送的。
第一个好的值是1000 0000:
也可以传输带有单个1位0000 0001的最后一个值:
最后一个好的值是0111 1111:
下一个应该是1011 1111,而不是1100 0010 1011 1111。例如。而不是一个字节,而是发送了两个字节:
我的第一个想法是,也许SPI使用的是7位而不是8位。但这是不可能的,因为在那种情况下1000 0000也应该是错误的。 (此外,SPI对象是使用bits = 8参数创建的。)顺便说一句,我也尝试了硬件SPI(id = 1),但是存在同样的问题。因此这一定是我程序中的一个问题,而不是硬件上的问题,但是我被卡住了,无法解决。
send()函数使用chr()创建单个字符。谁能解释一些单个字符如何作为两个字节发送,而另一些字符作为一个字节发送?
答案 0 :(得分:2)
MicroPython是based on Python 3 ...
MicroPython旨在实现Python 3.4标准 有关语言语法的信息,以及 MicroPython的大多数功能与所述功能相同 由docs.python.org的“语言参考”文档提供。
...因此,chr
返回Unicode字符串。要指定要通过SPI发送的确切字节,您需要为SPI write
方法提供一个bytes
对象。
如果将代码中的send(chr(int(s)))
替换为send(bytes([int(s)]))
,它将发送您期望的位模式。