Интерфейс SPI MicroPython ESP8266 отправляет неверные данные - PullRequest
0 голосов
/ 30 декабря 2018

Очень простая схема использует MicroPython и интерфейс SPI для подключения MCU ESP8266 к регистру сдвига 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()

Для тестирования я установил 8 светодиодов между выходными контактами и + 5 В (через резистор 100 Ом), чтобы посмотреть, что происходит, и попытался отправитьданные с использованием этой тестовой функции:

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()

Как видите, в этом тесте есть движущиеся единицы и движущиеся нули.Результат очень интересный.Значение 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 голосов
/ 02 января 2019

MicroPython - это на основе Python 3 ...

MicroPython направлен на реализацию стандарта Python 3.4 (с некоторыми функциями из более поздних версий) в отношении синтаксиса языка, ибольшинство функций MicroPython идентичны описанным в «Справочнике по языку» по адресу docs.python.org .

... поэтому chr возвращает Unicodeстрока.Чтобы указать точные байты, которые должны быть отправлены через SPI, необходимо присвоить методу SPI write объект bytes.

Если вы замените send(chr(int(s))) в своем коде на send(bytes([int(s)])),он должен отправить ожидаемые битовые комбинации.

...