В данном уроке мы с Вами подключим сдвиговый регистр SN74HC595 к микроконтроллеру ESP8266 с помощью языка microPython используя SPI:
Назначение выводов:
Но, для начала рассмотрим сам SPI, microPython потдерживает как программный так и аппаратный SPI. Отличаются они только скоростью работы (программный — максимум 10МГц, аппаратный — максимум 80МГц) и выводами (программный можно реализовать на всех доступных ножках, аппаратный GPIO12 (MISO), GPIO13 (MOSI) и GPIO14 (SCK)).
Теперь рассмотрим настройки SPI и работу с ним:
Инициализация для программного SPI:
from machine import Pin, SPI
spi = SPI(—1, baudrate=100000, polarity=1, phase=0, sck=Pin(0), mosi=Pin(2), miso=Pin(4))
Инициализация для аппаратного SPI:
from machine import Pin, SPI
spi = SPI(1, baudrate=800000, polarity=0, phase=0)
Как уже видно -1 указывает, что мы используем программный SPI, 1 указывает, что у нас аппаратный SPI.
polarity — указывает уровень сигнала, когда SPI не работает.
phase — выборка данных: 0 — выборка данных происходит по переднему фронту тактового сигнала, а 1 — по заднему.
Все остальное одинаково как для аппаратного так и программного SPI:
spi.init(baudrate=100000) — задать скорость коммуникации в бодах;
spi.read(10) — читает 10 байт на MISO-линии;
spi.read(10, 0xff) -читает 10 байт и передает на MOSI-линию значение «0xff»;
buf = bytearray(40) — создаем буфер для обмена данных для SPI;
spi.readinto(buf) — сохраняет считанные данные в заданный буфер(в данном случае его размер будет 40 байт);
spi.readinto(buf, 0xff) — сохраняет считанные данные в заданный буфер и передает на MOSI-линию значение «0xff»;
spi.write(b‘12345’) — записывает 5 байт на MOSI-линию;
spi.write_readinto(b‘1234’, buf) — записывает на MOSI-линию и читает из MISO-линии в буфер;
spi.write_readinto(buf, buf) — записывает данные буфера в MOSI-линию и сохраняет данные из MISO в буфер.
Для большой пользы в написании кода, мы с Вами подключим через сдвиговый регистр 74HC595 три семисегментных индикатора. У меня семисегментные индикаторы с обратным включением, если у Вас семисегментные индикаторы с прямым включении, Вам нужно будет поменять 1 на 0 в данных которые отправляем на сдвиговый регистр.
Схема подключения:
Так как семисегментные индикаторы имеют разные распиновки, я буду в программе использовать свои коды для отображения цифр, Вы сами уже под свой семисегметный индикатор составите свои коды, опираясь на картинку ниже:
Программный код:
from machine import Pin, SPI
import time
hspi = SPI(1, baudrate=5000000, polarity=0, phase=0)
led4 = Pin(4, Pin.OUT)
buf = bytearray(3)
k1 = 0
k2 = 0
k3 = 0
k = 0
def int(n):
if n == 0:
t = 0x11 #0
if n == 1:
t = 0x7d #1
if n == 2:
t = 0x89 #2
if n == 3:
t = 0x29 #3
if n == 4:
t = 0x65 #4
if n == 5:
t = 0x23 #5
if n == 6:
t = 0x03 #6
if n == 7:
t = 0x79 #7
if n == 8:
t = 0x01 #8
if n == 9:
t = 0x21 #9
return t
def seg(n1, n2, n3):
buf[0] = int(k3)
buf[1] = int(k2)
buf[2] = int(k1)
hspi.write(buf)
led4.on()
led4.off()
while True:
k=k+1
if k == 1000:
k=0
k1 = k//100
k2 = (k - k1*100)//10
k3 = k - k1*100 - k2*10
seg(k1, k2, k3)
time.sleep(0.5)