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