Сегодня мы поговорим о том как выжать максимум из ESPешек по количеству GPIO. Возможно ли это? Нам придется затронуть SPI шину, память, и настройку программ для прошивки модулей.
Что такое SPI?
Serial Peripheral Interface, SPI bus - последовательный периферийный интерфейс, шина SPI
Это последовательный синхронный стандарт передачи данных в режиме полного дуплекса.
Предназначенный для обеспечения высокоскоростного сопряжения микроконтроллеров и периферии.
В простейшем случае состоит из четырех цифровых сигналов (для DIO)
- MOSI — выход ведущего, вход ведомого (от ведущего к ведомому)
- MISO — вход ведущего, выход ведомого (от ведомого к ведущему)
- SCLK или SCK — последовательный тактовый сигнал (служит для передачи тактового сигнала для ведомых устройств)
- CS или SS — выбор микросхемы, выбор ведомого.
Для примера на схеме указаны чип ESP8266 и флеш память, но на само деле эти устройства могут быть любыми.
В ESP8266 данный интерфейс поддерживается аппаратно, там даже два модуля SPI
Два модуля SPI:
- General SPI (SPI общего назначения)
Максимальная скорость работы – 80 мегагерц.
- HSPI
Максимальная скорость работы – 20 мегагерц.
Обратимся к распиновки чипа ESP8266EX
Нас будут интересовать эти выводы. Что это такое?
А это этот самый SPI только не простейшая его реализация по двум цифровым сигналам SD_DATA_1, SD_DATA_2,(отбрасывая тактовый генератор и выбор чипа), а по четырем SD_DATA_1, SD_DATA_2, SD_DATA_3, SD_DATA_4
Вот так это будет выглядеть на схеме, режим QIO передача по четырем линиям
Самые внимательные уже обратили внимание на надписи:
- SD_DATA_2 - GPIO9 - D2
- SD_DATA_3 - GPIO10 - D3
И если перейти от четырех сигнальных линий к двум отбрасывая SD_DATA_2, SD_DATA_3 то мы получим режим "DIO" - передача по двум линиям освобождая тем самым GPIO9 и GPIO10
На схеме это будет выглядеть так
В руководстве к ESP8266 написано: "Цифровые контакты 6-11 используются для подключения флэш-памяти чипа на большинстве модулей"
Где же они находятся в реальности? А вот где.
Обратимся к модулю ESP-12E
Вот его распайка
А вот как это выглядит в реальности.
Во они эти контакты
И модули семейства Семейство плат WeMos, подсемейство NodeMcu
На схеме выделено GPIO 6-11 те которые находятся на боковой грани модуля ESP-12 и вынесены на пины модуля NodeMcu
Как же используются эти контакты (GPIO) и их значение?
А вот как, я написал чуть по другому, обозначив каналы MOSI, MISO номерами 1, 2. А не SD_DATA или не SDD2, SDD3, или D2, D3, так будет понятнее, а то с этими обозначениями кто во что горазд!
Назначение GPIO 6-11:
- GPIO 6 SCLK (тактовый сигнал)
- GPIO 7 MISO (от ведомого к ведущему канал 1)
- GPIO 8 MOSI (от ведущего к ведомому канал 1)
- GPIO 9 MISO (от ведущего к ведомому канал 2)
- GPIO 10 MOSI (от ведущего к ведомому канал 2)
- GPIO 11 CS0 (выбор микросхемы, выбор ведомого)
Почему то на GPIO 10 будет работать при прошивке модуля в режиме "DIO" или его модификации "DOUT", а вот GPIO 9 не работает все виснет возможно это связано с режимами MOSI, MISO
Но лучше не использовать ни один из контактов GPIO с 6 по 11.
GPIO 9 и 10 можно использовать на ESP8285, поскольку этот чип имеет встроенную флэш-память 1 МБ и соответственно не использует эти контакты. Один или оба GPIO 9, 10 иногда могут быть доступны на платах ESP8266, в зависимости от используемой прошивки и режима ее работы.
И кроме того в руководстве по ESP8266 пишут: "GPIO 10 можно использовать в качестве светового сигнала для индикации состояния связи между устройством и сервером".
А теперь рассмотрим прошивку модуля ESP8266 из среды Arduino IDE
Какой «Flash Mode» выбрать при прошивке модуля в среде IDE Arduino или при прошивки через Nodemcu Flasher?
Дело в том что если зайти в среде Arduino IDE в "инструменты", выбрать Generic ESP8266 module.
То в «Flash Mode» появится выбор из DOUT, DIO, QOUT, QIO
Что это такое?
А это режимы работы с памятью о которых мы говорили выше
DOUT > DIO >QOUT > QIO
По скорости, от менее скоростных к более скоростным
- DOUT - адрес задается стандартным путем используя только MOSI, а для получения данных используются две линии
- DIO - (Dual IO) использует 2 линии для данных
- QOUT – адрес задается стандартным путем используя только MOSI, а для получения данных используются четыре линии
- QIO - (Quad IO) использует 4 линии для данных
Дело в том, что не все платы имеют подключение к памяти по четырем линиям (хотя более-менее современные умеют)
Контакты чипа для работы с памятью в DIO (используются только две линии)
- D0 GPIO 7 (MISO канал1)
- D1 GPIO 8 (MOSI канал1)
D2 -GPIO 9(MISO канал2)D3 - GPIO 10 (MOSI канал2)- CLK - GPIO 6
- CMD - GPIO 11
Контакты чипа для работы с памятью в QIO (используют четыре линии):
- D0 (MISO канал1)
- D1 (MOSI канал1)
- D2 -GPIO 9 (MISO канал2)
- D3 - GPIO 10 (MOSI канал2)
- CLK - GPIO 6
- CMD - GPIO 11
Понятно, что при таком использовании скорость увеличивается в 2 раза.
Становится очевидно если вы задаете режим "DIO" то тем самым вы срезаете две линии софтовым образом и высвобождаются два GPIO 9 и 10
Только вот почему то 10 GPIO работает, а 9 все вешает, возможно это связано с ведущим\ведомым (см. выше)
А вообще интересные эксперименты можно попробовать провести, например подключить внешнюю память к модулю ESP 8266 (вообще внешнюю) Но возможно это будет в будущем.
Продолжение следует...
Статьи по близким темам:
Об использовании и особенностях подключения к GPIO модуля ESP8266
Подписывайтесь на наш канал TehnoZet-2, нажимайте кнопку
там много чего интересного! Мы только развиваемся!
Понравилась статья, хотите продолжения - ставьте лайки, жмите палец вверх!