Очень простая схема использует MicroPython и интерфейс SPI для подключения микроконтроллера 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:
Последнее значение с одним 1 битом 0000 0001 также передается нормально:
Последнее хорошее значение — 0111 1111:
Следующим должен быть 1011 1111, но вместо него передается 1100 0010 1011 1111. Например. вместо одного байта отправляется два байта:
Моей самой первой мыслью было, что, возможно, SPI использует 7 бит вместо 8. Но это невозможно, потому что в этом случае 1000 0000 тоже должно быть неверным. (Кроме того, объект SPI был создан с параметром bits=8.) Кстати, я также пробовал аппаратный SPI (id=1), но у него была та же проблема. Так что это должно быть проблема в моей программе, а не в оборудовании, но я застрял и не могу понять это.
Функция send() использует chr() для создания одного символа. Может ли кто-нибудь объяснить, как возможно, что некоторые отдельные символы отправляются в виде двух байтов, а другие - в виде одного байта?
chr
в Python 3.x возвращает текстовую строку Unicode, а не массив байтов. Что произойдет, если вы заменитеsend(chr(int(s)))
наsend(bytes([int(s)]))
? - person nekomatic   schedule 02.01.2019