Разработка ‘библиотеки’ малого webсервера на esp8266.

sharikov

Active member
У меня на одном конце 115200 а на другом 115273
Теперь я хочу установить скорость в 1000000 , какое значение я должен записать? поддерживается ли оно этим чипом, намного удобнее выбрать из доступных которые гарантированно рабочие, т.е. реальная скорость отличается не более 3%.
Хотите 1000000 - так и пишите "1000000". А потом оно вам выведет значение под которое есть ближайший делитель.
Выбор из доступных: а если мне надо 737200 или 10400 ?
 

pvvx

Активный участник сообщества
1) было бы здорово если PVFS2 был бы кросс платформенным, там вроде никаких особых зависимостей от винды нет.
Там даны исходники. Т.е. беда не моя. И для проекта , предусматривающего запись/дозапись отдельных файлов, ставьте нормальную файловую систему. В "свалке" используется примитивная, с пару команд - fopen, fread, fseek, fclose, чтобы можно было прикрутить любую.
2) почему то последний этап как загрузить прошивку нигде не описан (или я не нашёл)
В папочке bin описано какие файлы и куда прошивать.
3) галочку AutoConnect в профиле station mode желательно поднять повыше, а то режим STATIONAP_MODE включен по умолчанию, но не сразу понятно что для того чтобы station заработал нужно кроме SSID и пароля еще и эту галочку поставить.
Авто-коннект для забывчивых сам выставится, если включите режим ST, а AP выключите.
4) да ещё желательно отображать baudrate стандартными скоростями, а то крышу от таких записей уносит :), может встроить калькулятор на javascript в страничку, поле uart_0_baud сделать скрытым и добавить новое в которое нужно будет вводить стандартные скорости, а перед отправкой формы пересчитать.
Мне больше интересна какая именно вышла скорость, чтобы знать отклонения. В согласуемых устройствах можно выставить именно такую скорость для исключения ошибок.
Вставка длинного текста проходит с ошибками, знаю что желательно использовать аппаратный flow control, но пока попробую без него.
Вариантов, кроме как flow control нет. Тогда это будет пакетная, а не потоковая передача.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Реализовал обработку буфера uart при отсутствии подключения по сокету на таймере, но это как-то неправильно.
Ну и зря. У нас 2 UART и все сигналы (RX,TX,CTS,DTR,...) переключаются (swap) между их входными-выходными ногами на ходу одним битом в 0x3ff00028 (bit0). Так проще - один UART является управляющим, второй для данных. Такой подход удовлетворяет все варианты.
Планов по реализации загрузки кода по воздуху не возникает?
Каких кодов и куда? Всю прошивку вместе с диcком? Это не реально. Код исполняется из flash и переписывать его на новый вариант на ходу нельзя. Обновление у Espressif использует две области - два дубля прошивки. Один пишется из второго. При старте выбирается какая из двух прошивок будет запущена.
Исполняемый код (LwIP + обслуживание WiFi) весит к 200 килобайт + диск. Где взять буфер (свободное место на flash) в 200 килобайт не стирая диска? Да и это полная глупость - переписывание на ходу прошивки. Может использоваться только для отладки, а на готовом устройстве ведет к доп. неизбежным ошибкам. Приучили всех к обновлениям безграмотные пограммеры, т.к. оно используется для исправления ошибок и недоделок в уже проданной версии :)

На 16 мегабайтной flash можно иметь 32 штуки стандартных прошивки и выбирать загрузчиком. Т.е. в такой модуль можно прописать все известные готовые проекты :)
А тут не "готовый проект", а демонстрация, что возможно сделать на модуле и прикидка ТТХ модуля + средство для помощи в реверсе. Это основная цель данного "проекта" и его код не оптимален и не является примером написания на СИ, т.к. я не считаю себя "проф.программистом" (это не моё и не в данной поделке, т.к. у неё другие цели).
 
Последнее редактирование:

lincinus

New member
Хотите 1000000 - так и пишите "1000000". А потом оно вам выведет значение под которое есть ближайший делитель.
если так то нормально

Вариантов, кроме как flow control нет. Тогда это будет пакетная, а не потоковая передача.
непонятно, вроде всё работает правильно (т.е. прошивка работает правильно),
провожу такой тест
1) 115200, без аппаратного flow control
2) соединено так:
pc telnet (line mode) ->
->esp8266(station)
->uart-usb(подключен двумя проводами rx-tx)
->cat /dev/ttyUSB0 | tee /dev/ttyUSB0 (зеркало, всё что приходит отправляет обратно по той же цепочке)

Отправляю весь текст с этой страницы https://tools.ietf.org/html/rfc2217#page-8 (32КБ)
всё проходит без ошибок,

если делаю аналогичный тест но на одном конце мк, то текст битый прилетает.

заметка:
вместо телнета можно использовать такие команды
$ stty -icanon -echo; nc 192.168.1.194 23

это выключит локальное эхо, данные будут 1к1 как прилетают по tcp

update:
всё, разобрался, если увеличить буфер в микроконтроллере то отрабатывается большее число байт без ошибок, но всё равно если буфер переполнится то мы в пролёте.

Получается так
1) Либо занижать baudrate так чтобы МК успевал обрабатывать входящий трафик без пропусков.
2) Либо увеличить FIFO буфер в МК для входящего трафика
3) Либо задействовать дополнительно одну ножку RTS для синхронизации входящего потока,
исходящий по идее не требует синхронизации т.к. скорость по сети значительно больше (я полагаю)
4) либо использовать поверх какой нибудь протокол с гарантией доставки
ваша прошивка работает правильно проверил на 9600 и 115200, ещё раз спасибо.
Вот документ где наглядно рассмотрена эта проблема http://www.moxa.com/resource_file/509820091121333.pdf

Я увеличил буфер в МК до 1024 байт, мне хватает.

Ну и зря. У нас 2 UART и все сигналы (RX,TX,CTS,DTR,...) переключаются (swap) между их входными-выходными ногами на ходу одним битом в 0x3ff00028 (bit0). Так проще - один UART является управляющим, второй для данных. Такой подход удовлетворяет все варианты.
несовсем понятно, одновременно два uart работают или нет? (у меня ESP-07)
 
Последнее редактирование:

pvvx

Активный участник сообщества
несовсем понятно, одновременно два uart работают или нет? (у меня ESP-07)
Для переключения входа RX0<->RX1, ну и остальных выходов.
UART0, к примеру, привязана на программу передачи в TCP. Когда TCP не активно, то переключаете указанный битик. К выводам RX и TX подписанных на модуле подключается UART1 - TX1 и TX0 и обработка идет в коде привязанном программно к UART1. Сбрасываете битик и обработка выводов RX и TX подписанных на модуле идет с UART0. Это как один пример из множества комбинаций...
По поводу потерь без RTS/CTS - даже FT2232 теряет байты на 3Mbaud. График давал и причину указывал - скорость USB аппаратный буфер FT.
 

lincinus

New member
понял, мне нужно наоборот, чтобы по разным выводам разные потоки,
вот тут сказали что возможен только ещё один TX http://www.esp8266.com/viewtopic.php?f=13&t=476

а мне на оборот больше требуется RX,
один поток управляющий в котором потери нежелательны, второй поток данных от МК на PC там главное побыстрее, но можно с потерями
полагаю такое невозможно с одним модулем ESP
 

pvvx

Активный участник сообщества
нашёл ваш пост
http://esp8266.ru/forum/threads/i2c-uart1.280/page-2#post-5198
но так и не понял, можно чтобы uart1-RX был одновременно с uart0-RX но на другой ножке или нет? похоже кроме вас это никто не знает :)
Предположительно. Я не писал теста на вход RX1, но путем комбинации битов в том регистре и конфигов в MUX - TX1 переносится, а UART0 - вообще как угодно...

Вот нашел от Espressif:
Код:
#define PERI_IO_CSPI_OVERLAP        (BIT(7)) // two spi masters on cspi
#define PERI_IO_HSPI_OVERLAP        (BIT(6)) // two spi masters on hspi
#define PERI_IO_HSPI_PRIO           (BIT(5)) // hspi is with the higher prior
#define PERI_IO_UART1_PIN_SWAP      (BIT(3)) // swap uart1 pins (u1rxd <-> u1cts), (u1txd <-> u1rts)
#define PERI_IO_UART0_PIN_SWAP      (BIT(2)) // swap uart0 pins (u0rxd <-> u0cts), (u0txd <-> u0rts)
#define PERI_IO_SPI_PORT_SWAP       (BIT(1)) // swap two spi
#define PERI_IO_UART_PORT_SWAP      (BIT(0)) // swap two uart
В https://github.com/espressif/esp_iot_rtos_sdk/blob/master/include/espressif/esp8266/eagle_soc.h
Всё раскидано кусками. Собираю в кучу для PvSDK...
 
Последнее редактирование:

lincinus

New member

ещё вот тут есть описание пинов http://esp8266.ru/esp8266-pin-register-strapping/#pins-list

Итак, по пинам имеем следующее

GPIO6 : U1CTS //Function5 (не выведен в ESP-07)
GPIO7 : U1TXD //Function5 (не выведен в ESP-07)
GPIO8 : U1RXD //Function5 (не выведен в ESP-07)
GPIO11 : U1RTS //Function5 (не выведен в ESP-07)

GPIO1 : U0TXD //Function1, (выведен в ESP-07 как TX)
GPIO2 : U0TXD //Function5, (выведен в ESP-07 как GPIO2) after reset, the default is function5 to export U0TXD,
GPIO2 : U1TXD //Function3, (выведен в ESP-07 как GPIO2)
GPIO3 : U0RXD //Function1 (выведен в ESP-07 как RX)

GPIO12 : U0DTR //Function5 (выведен в ESP-07 как GPIO12)
GPIO13 : U0CTS //Function5 (выведен в ESP-07 как GPIO13)
GPIO14 : U0DSR //Function5 (выведен в ESP-07 как GPIO14)
GPIO15 : U0RTS //Function5 (выведен в ESP-07 как GPIO15)

Т.е без постоянного swap доступны только U0TX, U0RX, U1TX т.е. GPIO1, GPIO3, GPIO2
Т.е. пин U1RX никак не доступен одновременно с U0

Как я понимаю, после, изменения двух бит
[HASHTAG]#define[/HASHTAG] PERI_IO_UART0_PIN_SWAP (BIT(2)) // swap uart0 pins (u0rxd <-> u0cts), (u0txd <-> u0rts)
[HASHTAG]#define[/HASHTAG] PERI_IO_UART_PORT_SWAP (BIT(0)) // swap two uart

получим
GPIO13 : U1RXD //Function5 (выведен в ESP-07 как GPIO13)
GPIO15 : U1TXD //Function5 (выведен в ESP-07 как GPIO15)
GPIO1 : U1RTS
GPIO3 : U1CTS

Непонятно что будет происходить если и на GPIO1,GPIO3 и GPIO13,GPIO15 будет два активных потока, будут потери байт при swap?

наверное правильнее использовать
не
[HASHTAG]#define[/HASHTAG] PERI_IO_UART0_PIN_SWAP (BIT(2)) // swap uart0 pins (u0rxd <-> u0cts), (u0txd <-> u0rts)

а

[HASHTAG]#define[/HASHTAG] PERI_IO_UART1_PIN_SWAP (BIT(3)) // swap uart1 pins (u1rxd <-> u1cts), (u1txd <-> u1rts)

плюс
[HASHTAG]#define[/HASHTAG] PERI_IO_UART_PORT_SWAP (BIT(0)) // swap two uart
 
Последнее редактирование:

pvvx

Активный участник сообщества
pin_func.gif
В "свалке" таблицы есть и отметил неизвестные состояния... out? - становиться выходом inp? - вход qspi? - на осцилле похоже на сигналы cs flash
Всё переключается на ходу в самом Web в эксплорере + команды по http ?gpioN_func=X ...
 
Последнее редактирование:

porex

New member
Кто-нибудь пробовал запускать Веб сервер на желтой отладочной плате?

У меня появляется последовательность букв ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ. Ощущение что сервер ищет страницу по не правильному адресу, либо по адресу ничего нет, но почему тогда на ESP-01 все работает нормально?
 

pvvx

Активный участник сообщества
Без диска сервер тоже работает и выводит сообщение + работает страница загрузки диска.
Причина в чем-то другом. У меня нет "желтой" платы для модуля.
 

porex

New member
Возможно проблема с флешкой, проверю этот вариант. Другого пока на ум ничего не приходит.
 

lincinus

New member
Народ, кто нибудь может проверить конфигурацию с двумя стоп битами?
У меня не работает, а кто виноват непонятно.

Кстати, поскольку аппаратная ножка RTS на мк у меня занята, я сделал программную RTS, доступна любая ножка.
При получении я проверяю насколько заполнен входящий буфер, если свободно менее 1/3 то поднимаем RTS и выключаем прерывание по получени, пока буфер не освободится до половины, потом опускаем ножку RTS и включаем прерывания , проверил, работает в плоть до 2Мбод, входящий буфер 32байта.
 

pvvx

Активный участник сообщества
Народ, кто нибудь может проверить конфигурацию с двумя стоп битами?
У меня не работает, а кто виноват непонятно.
Что-то у вас не работает.
Нет осциллографа или логического анализатора? Хотите за чужой счет проверить? :)
Плачу за вас, включаю осла, измеряю и разрисовываю вам - вы теперь должны:
Stopbit.gif
:) Передача 2-х символов "UU"
С программным RTS не всё гладко. Опрос вы сделали по прерываниям, которые в системе часто запрещаются, а передачу символов от другого устройства не запретить кодами в данном CPU - у них телепатии ещё нет - они ещё не вышли на тот уровень развития. :)
Проверьте во время записи Flash, хоть диска. Ещё много где... :p
 
Последнее редактирование:

pvvx

Активный участник сообщества
Ещё раз измерял потребление питания модулем, но на макете у меня стоит потребитель ровно 5 мА. Надо вычитать из графика:
PowerSleepLigh2.gif
На графике потребление при просыпании модуля из deep-sleep (точка ~16), за чуть более 10 сек, шкала 0.1 сек. Режим SleepWiFi = Light. Указаны среднее, пиковое и минимум.
Минимум - это то что жрет не сам модуль, а надо вычесть из всего (5 mA).
За первые секунды модуль связался с AP и получил время SNTP. Далее ничего не делал - смотрел эфир WiFi и огрызался ему :). Пошивка Web из заголовка темы.
Тоже самое, но при старте отпусканием ноги "ресет" у модуля:
PowerSleepLigh.gif
На "ресете" модуль жрет.
Самый жручий кусок - загрузка кода из flash и инициализация SDK.
----------
В последней версии "свалки" ошибка. Не включается FlowControl на RTS. при переписывании на новый лад i/o возникала опечатка: UART1_CONF1 = conf1; а надо UART0_CONF1 = conf1; в uart0_set_flow()

Но это все уже безразлично. Алгоритм TCP2UART в стадии переработки из-за накопившихся уточнений как работает всё в ESP8266. Да и там было много лишнего и неверно работающих веток и с ошибками (хорошо что не работали :)), т.к. всё лепилось по мере изучения внутренностей ESP8266.
Уже добился скорости в обе стороны (TX и RX одновременно) за 3 MBaud... Дожно быть к 5 в полном дуплексе, но гарантий нет... Сделать бы хоть стабильно до 3-х.
 
Последнее редактирование:

lincinus

New member
Хотите за чужой счет проверить? :)
Плачу за вас, включаю осла, измеряю и разрисовываю вам - вы теперь должны:
спасибо, но достаточно было просто сказать да :)

С программным RTS не всё гладко. Опрос вы сделали по прерываниям, которые в системе часто запрещаются, а передачу символов от другого устройства не запретить кодами в данном CPU - у них телепатии ещё нет - они ещё не вышли на тот уровень развития.
программный RTS у меня в контроллере STM32F405, на ESP8266 аппаратный.
Да не всё гладко, но на скорости 460800, работает стабильно.
Если выше то бывают потери байт.
 
Сверху Снизу