【问题标题】:MicroPython ESP8266 SPI interface sends wrong dataMicroPython ESP8266 SPI 接口发送错误数据
【发布时间】: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


【解决方案1】:

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)])),它应该会发送您期望的位模式。

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多