Найти тему
TehnoZet-2

SPI шина, GPIO на плате ESP8266, режимы прошивки (DOUT, DIO, QOUT, QIO)

Сегодня мы поговорим о том как выжать максимум из ESPешек по количеству GPIO. Возможно ли это? Нам придется затронуть SPI шину, память, и настройку программ для прошивки модулей.

Что такое SPI?

Serial Peripheral Interface, SPI bus - последовательный периферийный интерфейс, шина SPI

Это последовательный синхронный стандарт передачи данных в режиме полного дуплекса.

Предназначенный для обеспечения высокоскоростного сопряжения микроконтроллеров и периферии.

В простейшем случае состоит из четырех цифровых сигналов (для DIO)

  • MOSI — выход ведущего, вход ведомого (от ведущего к ведомому)
  • MISO — вход ведущего, выход ведомого (от ведомого к ведущему)
  • SCLK или SCK — последовательный тактовый сигнал (служит для передачи тактового сигнала для ведомых устройств)
  • CS или SS — выбор микросхемы, выбор ведомого.
Как работает интерфейс SPI
Как работает интерфейс SPI

Для примера на схеме указаны чип ESP8266 и флеш память, но на само деле эти устройства могут быть любыми.

В ESP8266 данный интерфейс поддерживается аппаратно, там даже два модуля SPI

Два модуля SPI:

  • General SPI (SPI общего назначения)

Максимальная скорость работы – 80 мегагерц.

  • HSPI

Максимальная скорость работы – 20 мегагерц.

Обратимся к распиновки чипа ESP8266EX

Распиновка чипа ESP8266
Распиновка чипа ESP8266

Нас будут интересовать эти выводы. Что это такое?

А это этот самый SPI только не простейшая его реализация по двум цифровым сигналам SD_DATA_1, SD_DATA_2,(отбрасывая тактовый генератор и выбор чипа), а по четырем SD_DATA_1, SD_DATA_2, SD_DATA_3, SD_DATA_4

Вот так это будет выглядеть на схеме, режим QIO передача по четырем линиям

QIO режим (четыре линии)
QIO режим (четыре линии)

Самые внимательные уже обратили внимание на надписи:

  • SD_DATA_2 - GPIO9 - D2
  • SD_DATA_3 - GPIO10 - D3

И если перейти от четырех сигнальных линий к двум отбрасывая SD_DATA_2, SD_DATA_3 то мы получим режим "DIO" - передача по двум линиям освобождая тем самым GPIO9 и GPIO10

На схеме это будет выглядеть так

DIO Режим (минус две линии)
DIO Режим (минус две линии)

В руководстве к ESP8266 написано: "Цифровые контакты 6-11 используются для подключения флэш-памяти чипа на большинстве модулей"

Где же они находятся в реальности? А вот где.

Обратимся к модулю ESP-12E

Вот его распайка

Распайка ESP-12
Распайка ESP-12

А вот как это выглядит в реальности.

Во они эти контакты

GPIO9-10
GPIO9-10

И модули семейства Семейство плат WeMos, подсемейство NodeMcu

WeMos NodeMcu GPIO 6-11
WeMos NodeMcu GPIO 6-11

На схеме выделено 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.

-10

То в «Flash Mode» появится выбор из DOUT, DIO, QOUT, QIO

-11

Что это такое?

А это режимы работы с памятью о которых мы говорили выше

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, нажимайте кнопку

-12

там много чего интересного! Мы только развиваемся!
Понравилась статья, хотите продолжения - ставьте лайки, жмите палец вверх!

-13