MicroPython ESP8266 SPI接口发送错误的数据

时间:2018-12-30 15:09:49

标签: bit esp8266 micropython

一个非常基本的电路使用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:

enter image description here

也可以传输带有单个1位0000 0001的最后一个值:

enter image description here

最后一个好的值是0111 1111:

enter image description here

下一个应该是1011 1111,而不是1100 0010 1011 1111。例如。而不是一个字节,而是发送了两个字节:

enter image description here

我的第一个想法是,也许SPI使用的是7位而不是8位。但这是不可能的,因为在那种情况下1000 0000也应该是错误的。 (此外,SPI对象是使用bits = 8参数创建的。)顺便说一句,我也尝试了硬件SPI(id = 1),但是存在同样的问题。因此这一定是我程序中的一个问题,而不是硬件上的问题,但是我被卡住了,无法解决。

send()函数使用chr()创建单个字符。谁能解释一些单个字符如何作为两个字节发送,而另一些字符作为一个字节发送?

1 个答案:

答案 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)])),它将发送您期望的位模式。