【发布时间】:2018-12-30 15:09:48
【问题描述】:
一个非常基本的电路使用 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() 创建单个字符。谁能解释一下如何将一些单个字符作为两个字节发送,而将其他字符作为单个字节发送?
【问题讨论】:
-
我不确定你是否应该期望 SPI 函数直接驱动 74HC595,我还没有在 Micropython 上尝试过,但是 Python 3.x 中的
chr返回一个 Unicode 文本字符串,而不是字节数组。如果将send(chr(int(s)))替换为send(bytes([int(s)]))会发生什么? -
我已经用 ESP8266 和 Lua 做到了这一点。 74HC595 可以与简单的 SPI 一起使用。所以也许真的 MicroPython 实现了 unicode 字符串——这对我来说非常令人惊讶。 :-) 我会在 2 小时内检查。
-
检查:chr() 将创建一个 UTF-8 字符串!如果我用 bytes([int(s)]) 替换它,那么一切都会按预期工作。令人难以置信的是,他们已经在一个微型微控制器上实现了 UTF-8 字符串。请发布答案,以便我接受。
标签: bit esp8266 micropython