Первый положительный тест работы с флешем и конфигурации ESP8266 с перезагрузкой.
Для тех, кому интересно - помогло окружение вызова программ записи и стирания сектора запретом на прерывания UART:
А вот это уже не очень понятно, что именно он должен делать. Он как-то сохраняет адреса, где уже есть данные и при следующей записи выбирает пустое место куда могут влезти данные?
Вопрос с записью настроек решён положительно, всё работает как задумывалось.
Менеджер памяти читает блок и находит последнюю действительную запись. Сверяет контрольную сумму и загружает настройки. При изменении настроек эта запись делается недействительной, и записывается кусок данных в следующую запись. Стирание блока только после его заполнения.
Теперь у меня есть задача сконфигурировать модуль согласно настройкам.
В user_unit вначале читаются настройки из флеш, затем заполняются данными служебные структуры.
После этого в зависимости от режима (Access Point или Station) вызываются различные программы конфигурации.
В программе wifi_config_ap вроде бы всё нормально.
Задаётся режим, имя и пароль сети, MAC адрес и IP адрес, он сам себя устанавливает гейтвеем, назначается маска IP. Все эти данные при проверке вручную AT командами соответствуют настройкам. WiFi видит эту точку за заданном канале с нужным именем и MAC адресом.
Вот немного упрощённая программа:
Код:
/*******************************************************************************
* конфигурация ESP8266 в режиме Access point
* вызывается в user_init ()
*******************************************************************************/
bool ICACHE_FLASH_ATTR wifi_config_ap (void)
{
// режим точки доступа
if (wifi_get_opmode () != SOFTAP_MODE)
{
wifi_set_opmode (SOFTAP_MODE);
}
// Установка имени сети и пароля
wifi_softap_set_config (&user_softap_config);
// установка MAC адреса
wifi_set_macaddr (SOFTAP_IF, g.mac_main);
// остановить DHCPS, IP жёстко заданы
wifi_softap_dhcps_stop ();
// задать ip адреса и маски
wifi_set_ip_info (SOFTAP_IF, &g.ip_main);
// регистрация обработчика событий WiFi
wifi_set_event_handler_cb (wifi_user_ap_event_cb);
espconn_create (&g.user_udp_struct); // create udp
return (true);
}
А второй режим - Station настраивается с ошибками.
Режим сети, имя и MAC адрес задаются верно, но статический IP назначаться не хочет, хоть тресни. Примеры в сети смотрел, но везде получается динамический IP, а я хочу статику. Вот код, который у меня сейчас:
Код:
/*******************************************************************************
* конфигурация ESP8266 в режиме Station
*******************************************************************************/
bool ICACHE_FLASH_ATTR wifi_config_sta (void)
{
if (wifi_get_opmode () != STATION_MODE)
{
wifi_set_opmode (STATION_MODE);
}
// отключение службы назначения IP адресов
wifi_station_dhcpc_stop ();
wifi_softap_dhcps_stop ();
// установка текущей конфигурации
wifi_station_set_config (&user_sta_config); //
wifi_set_macaddr (STATION_IF, g.mac_main);
// задать ip адреса и маски
wifi_set_ip_info (STATION_IF, &g.ip_main);
wifi_set_ip_info (SOFTAP_IF, &g.ip_main);
// запись коллбэка по событиям WiFi
wifi_set_event_handler_cb (wifi_user_sta_event_cb);
wifi_station_set_hostname ("TEST1");
espconn_create (&g.user_udp_struct); // create udp return (true);
}
При проверке этого кода AT командами параметры wifi соответствуют заданным, а IP, GW, MASK все нули. И для SOFT_AP, и для STATION, хотя они явно заданы в программе.
Версия SDK 1.5.0
Может кто-нибудь подсказать, ЧЯДНТ?
Преамбула.
Есть функции SDK [inline]wifi_get_ip_info[/inline] и [inline]wifi_set_ip_info[/inline].
Также есть АТ команды [inline]AT+CIPAP?[/inline] и [inline]AT+CIPSTA?[/inline].
Амбула.
Если я устанавливаю режим Soft AP и записываю адрес командой [inline]wifi_set_ip_info (SOFTAP_IF, &g.ip_main)[/inline]
То при чтении изнутри программы функцией [inline]wifi_get_ip_info (SOFTAP_IF, &get_ip)[/inline] и проверке по терминалу [inline]AT+CIPAP?[/inline] результаты совпадают
А в режиме Station я также записываю адрес командой [inline]wifi_set_ip_info (STATION_IF, &g.ip_main)[/inline]
То чтение изнутри программы функцией [inline]wifi_get_ip_info (STATION_IF, &get_ip)[/inline] выдаёт правильный результат
А проверка по терминалу [inline]AT+CIPSTA?[/inline] выдаёт нули.
Да, почитал немного, после конфигурации модуля в режиме Soft AP добавил включение dhcps.
После этого второй блок в режиме Station подключился к первому, получил свои же назначенные адреса, и связь установилась.
Зачем они так программы пишут?
Потеряны четыре дня...