• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь ESP8266+74hc595/74hc195

corpse

New member
Добрый день! Пытаюсь завести на ESP-12 через SPI сдвиговый регистр. Информацию брал отсюда: class SPI – a Serial Peripheral Interface bus protocol (master side) — MicroPython 1.9.3 documentation
Для определённости в текущий момент hardware SPI, выводы подключены по доку:
MISO is GPIO12
MOSI is GPIO13
SCK is GPIO14

Код:
from machine import Pin, SPI

spi = SPI(1, baudrate=1000000, polarity=0, phase=0)
spi.write(b'\xff')
Вопрос номер раз: при подаче питания иногда один или несколько пинов на сдвиговом регистре в состоянии HIGH. Это нормально?

Вопрос номер два: при попытке добавить в параметры инициализации bits=8 что при создании объекта spi, что при ините руками - получаю ошибку:
Код:
>>> spi.init(bits=8)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: extra keyword arguments given
Первая запись в регистр проходит успешно, например, spi.write(b'\xff'), но как закинуть байт в регистр второй раз? Последующая запись уходит в никуда, состояние регистра не меняется. Пробовал дёрнуть latch pin руками - не помогает. spi.deinit() или перегрузка repl - тоже. В регистре остаётся то значение, которое туда прилетело в первый раз вплоть до обесточивания ESP. Подскажите пожалуйста, что я делаю не так?
 
void DOUT(int16_t value)
{
shiftOut(Dat_Pin_out, clockPin_out, MSBFIRST, value >> 8);
shiftOut(Dat_Pin_out, clockPin_out, MSBFIRST, value & 255);
digitalWrite(L_Pin_out, 1);digitalWrite(L_Pin_out, 0);
}

не нужен никакой SPI
берешь любые ноги
работает на ура
чтобы при пуске были все нули или единицы, то gpio от ESP заводишь на ногу CE микросхемы - это разрешение выходов.
подачи питания сначала выставляешь регистр как надо, а потом разрешаешь выходы сигналом на микруху
 

corpse

New member
void DOUT(int16_t value)
{
shiftOut(Dat_Pin_out, clockPin_out, MSBFIRST, value >> 8);
Насчёт ноги - спасибо, на досуге попробую. Как заставить работать сдвиговый регистр напрямую в лоб, я представляю. Можно писать туда по биту, параллельно дёргая пин синхронизации поочерёдно вверх и вниз, а потом дёрнуть latch. Проблема в том, что я хотел завести именно аппаратный spi под пайтоном, это было бы оптимальнее с точки зрения ресурсов.
 
Мои попытки как со входным так и с выходным резистором стандартно не получались. То пераый, то последний биты не адекватные были, пока не сделал на элементарном уровне. А на счет ресурсов ты зря беспокошься. Просто надо не по таймеру дергать регистр, а по изменениям состояний твоих выходов. Поменялись - дергай. И никакие ресурсы не пострадают..
 
Сверху Снизу