• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Правильное подключение нанрузки к gpio

POPSODAV

New member
Пришли мне два модуля esp8266 в форм-факторе ESP-01.
Попробовал залить тестовую прошивку с примером blink.
Подцепил резистор со светодиодом на GPIO-2 - работает.

После этого, я захотел портировать библиотеку пиксельной гирлянды на LD6833.
Код портировал, подключил - не работает.
Начал разбираться. GPIO порты перестали работать совсем.
Напряжение на них не меняется даже на примере с blink.
GPIO порты подключал напрямую к гирлянде (7 пикселей).
На вход порты работают.
Есть подозрение, что ток был слишком большой на GPIO портах и они выгорели (нужно было использовать транзисторы).
Может ли такое быть? Не хочется спалить второй модуль...
 

unidiag

New member
Облазил сайт, что-то не нашёл экземплика blink. Может кто-нить ткнёт меня?
И ещё вопросик. Как я понял портами I/O можно управлять и AT-командами? Можно примерчик плз)
 

JustACat

Moderator
Команда форума
Может кто-нить ткнёт меня?
Смотря на чем вы хотите писать: Lua, Си/Си++? Определитесь.
Как я понял портами I/O можно управлять и AT-командами?
Нет, нельзя. Поняли неправильно.

PS: куча примеров по ссылке документация у меня в подписи ;)
 

Victor

Administrator
Команда форума
Есть подозрение, что ток был слишком большой на GPIO портах и они выгорели
OUTPUT до 12мА на каждый GPIO
портами I/O можно управлять и AT-командами
в ранних прошивках от electrodragon такое есть, только уж больно они старые и собраны на старых версиях SDK. Не рекомендую.
Есть еще AT прошивки от AI-THINKER на SDK 0.9.5 - можете попробовать
Код:
AT+CIOADC command reads the ADC value Note: ADC input voltage range is between 0V to 1V! 0 to 1024,10 bit precision
AT+CIOREAD command reads the GPIO AT + CIOREAD = 0 reads GPIO0 level assumptions GPIO0 is high, it will return 1: HIGH, otherwise it returns 0: LOW GPIO range of digital, GPIO0, GPIO16 can
AT+CIOWRITE command to set the GPIO AT + CIOWRITE = 0,0 setting GPIO0 level is low AT + CIOWRITE = 16,1 set of high level GPIO16
но ими мало кто пользуется - неудобно AT командами работать и нужен еще один МК
 

SamGold

New member
Дабы не плодить темы, напишу сюда.
Подскажите, почему не работает код:

Код:
void user_init(void)
{
   
        uint8_t duty=80;
       
        gpio_init();
       
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO14);
       
        GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);//low
        GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 1);//high
       
       
    // Configure the UART
    uart_init(BIT_RATE_115200,0);
    // Enable system messages
    system_set_os_print(1);
    os_printf("\r\nSystem init...\r\n");

    os_printf("System init done.\n");
}
При этом на обоих IO12 и IO14 без нагрузки по тестору высокий потенциал 3.3В.
Если подключить светодиод с резистором- то он еле светится, при этом напряжение падает до 1.4В. Такое чувство, что эти пины работают на вход.
 

pvvx

Активный участник сообщества
Дабы не плодить темы, напишу сюда.
Подскажите, почему не работает код:
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);
Чтобы не путаться :) :
Код:
#include "c_types.h"
#include "eagle_soc.h"
//#define _FUN_GPIO ((uint32)0b11111111111111111111000011001100) // таблица установки IO_FUN в GPIOn (номера функций 1 или 3)
#define _FUN_GPIO ((uint32)0xFFFFF0CCul) // таблица (по 2 бита на номер пина) номеров функций пинов для установки в режим GPIO
#define PERIPHS_GPIO_FUN(PIN_NUM) ((uint32)(_FUN_GPIO >> ((PIN_NUM)<<1)) & 0x03) // установка I/O пина в режим порта GPIOn
#define _FUN_DEF_GPIO ((uint64)0x3333111111000200ull) // таблица (по 4 бита на номер пина) номеров функций пинов для установки в режим по умочанию в SDK
#define PERIPHS_IO_FUN_DEF(PIN_NUM) ((uint32)((_FUN_DEF_GPIO >> ((PIN_NUM)<<2)) & 0x0F)) // установка I/O пина в режим по умолчанию для SDK
#define _IO_MUX_GPIO ((uint64)0x3210BA9876FE4D5Cull) // ((uint64)0xC5D4EF6789AB0123) // таблица (по 4 бита на номер пина) адресов IO_MUX в соответствии с номерами GPIOn
#define PERIPHS_IO_MUX_GPIO_ADDR(PIN_NUM) (PERIPHS_IO_MUX + 0x04 + (uint32)(((_IO_MUX_GPIO>>((PIN_NUM)<<2)) & 0x0F)<<2)) // получить адрес IO_MUX в соответствии с номером GPIOn

#define PIN_FUNC_IOPORT(n) PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO_ADDR(n), PERIPHS_GPIO_FUN((n)))
#define PIN_FUNC_DEFAULT(n) PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO_ADDR(n), PERIPHS_IO_FUN_DEF((n)))
Код:
PIN_FUNC_IOPORT(12);
PIN_FUNC_IOPORT(14);
 

SamGold

New member
Попробовал и так и так, ничего не изменилось:

Код:
        //PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO12);
        //PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);
        PIN_FUNC_IOPORT(12);
        PIN_FUNC_IOPORT(14);
       
       
        GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);//low
    GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 1);//high
 

SamGold

New member
Спасибо большое, помогло:
Код:
  PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);

  PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);
 
Сверху Снизу