На Яндекс Дзене : "SPI шина, GPIO на плате ESP8266, режимы прошивки (DOUT, DIO, QOUT, QIO)"
Сегодня мы поговорим о том как выжать максимум из ESPек по количеству GPIO. Возможно ли это? Нам придется затронуть 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
На схеме это будет выглядеть так
Вот тут как механическим путем освободить GPIO9, GPIO10: "ESP8266 ESP-201 module - freeing up GPIO9 and 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, так будет понятнее, а то с этими обозначениями кто во что горазд!
Назначение GPIO6-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
И кроме того в руководстве по 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 (вообще внешнюю) Но возможно это будет в будущем.