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

Решено Не подключается к WiFi ESP-201 - Fatal exception 28

tonal

New member
Прошивка не подключается к WiFi.
Пишет Fatal exception 28(LoadProhibitedCause)

Код:
WiFi connecting...
Fatal exception 28(LoadProhibitedCause):
epc1=0x40248447, epc2=0x00000000, epc3=0x00000000, excvaddr=0x0000000c, depc=0x00000000

ets Jan  8 2013,rst cause:1, boot mode:(3,6)

load 0x40100000, len 26716, room 16
tail 12
chksum 0x03
ho 0 tail 12 room 4
load 0x3ffe8000, len 884, room 12
tail 8
chksum 0xef
load 0x3ffe8378, len 520, room 0
tail 8
chksum 0x0e
csum 0x0e
{l{l_*Wсinit
mode : sta(5c:cf:7f:01:e8:56)
add if0
f r-1,
После весит с секунду, и по новой.
Иногда, включение на 10-е, таки подключается, но через небольшое время опять так же отваливается.
Подскажите, куда копать.
Прошивка собирается esp-open-sdk
Код:
extern "C"
static void ICACHE_FLASH_ATTR wifi_check_ip(void *arg) {
  os_timer_disarm(&WiFiLinker);
  switch(wifi_station_get_connect_status()) {
    case STATION_GOT_IP: {
      ip_info ipConfig;
      wifi_get_ip_info(STATION_IF, &ipConfig);
      if(ipConfig.ip.addr != 0) {
        connState = WIFI_CONNECTED;
        os_printf("WiFi connected\n");
        os_printf("Start TCP connecting...\n");
        connState = TCP_CONNECTING;
        senddata();
        return;
      }
      break;
    } case STATION_WRONG_PASSWORD: {
      connState = WIFI_CONNECTING_ERROR;
      station_config stationConf;
      wifi_station_get_config(&stationConf);
      os_printf(
        "WiFi connecting error, wrong password: |%s=>%s|\n",
        stationConf.ssid, stationConf.password);
      break;
    } case STATION_NO_AP_FOUND:
      connState = WIFI_CONNECTING_ERROR;
      os_printf("WiFi connecting error, ap not found\n");
      break;
    case STATION_CONNECT_FAIL:
      connState = WIFI_CONNECTING_ERROR;
      os_printf("WiFi connecting fail\n");
      break;
    default:
      connState = WIFI_CONNECTING;
      os_printf("WiFi connecting...\n");
  }
  os_timer_setfn(&WiFiLinker, wifi_check_ip, NULL);
  os_timer_arm(&WiFiLinker, 1000, 0);
}

void ICACHE_FLASH_ATTR
user_init() {
  uart_div_modify(0, UART_CLK_FREQ / BIT_RATE_115200);
  uart_div_modify(1, UART_CLK_FREQ / BIT_RATE_115200);
  os_printf("Start init\n");

  // Проверяем если платы была не в режиме клиента AP, то переводим её в этот режим
  // В версии SDK ниже 0.9.2 после wifi_set_opmode нужно было делать system_restart
  if(wifi_get_opmode() != STATION_MODE)
    wifi_set_opmode(STATION_MODE);

  // Плата в режиме STA, устанавливаем конфигурацию, имя AP, пароль, см. user_config.h
  if (wifi_get_opmode() == STATION_MODE) {
    station_config stationConf; // = {"dlink", "CrjhjGkfythrf!Lf!"};
    //wifi_station_get_config(&stationConf);
    os_memset(&stationConf, 0, sizeof(stationConf));
    os_memcpy(&stationConf.ssid, ssid, os_strlen(ssid) + 1);
    os_memcpy(&stationConf.password, password, os_strlen(password) + 1);
    wifi_station_set_config(&stationConf);
//     wifi_station_connect();
//     wifi_station_dhcpc_start();
    wifi_station_set_auto_connect(1);
  }
  btn_init();
  //Disarm timer
  os_timer_disarm(&WiFiLinker);
  os_timer_setfn(&WiFiLinker, wifi_check_ip, NULL);
  os_timer_arm(&WiFiLinker, 1000, 0);
}
ОС Kubuntu 14.04
 

tonal

New member
Развернул виртуалку от Espressif, пересобрал прошивку под разными SDK 1.5.0, 1.4.1_pre5 и 1.4.0
Есть некоторые отличия, но по сути получаю примерно тоже - серию разных Fatal exception.
Т. е. проблема не в моей корявой сборке тулчейна...
Может кто подскажет, куда копать?
 

Victor

Administrator
Команда форума
Может кто подскажет, куда копать?
А что-то я у вас вообще не увидел [inline]void ICACHE_FLASH_ATTR user_rf_pre_init(void)[/inline]
Без нее вроде вообще не должно работать
Еще может имеет смысл сделать [inline]void ICACHE_FLASH_ATTR wifi_handle_event_cb(System_Event_t *evt)[/inline] (в документации есть пример)
что бы видеть, что там происходит
 

tonal

New member
Дело было в железе. Поставили на вход питания кондёр электролитический - стало устойчиво работать. :)

Про user_rf_pre_init - вроде в стандартных примерах её нет, например здесь: http://bbs.espressif.com/viewtopic.php?f=31&t=228
Так что если кто-нибудь объяснит зачем она нужна и когда вызывается - буду признателен.

Про wifi_handle_event_cb - спасибо. Буду иметь в виду.
Можно попробовать использовать вместо таймера проверки состояния. :)
 
Сверху Снизу