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

esp32 DevKit и UART на 1500000 bps

Алексей.

Active member
Столкнулся с такой проблемой, на esp32-devkit, работающей в режиме софт-АП, пробрасываю на uart0 данные, в большом количестве, а конкретнее голос по sip-у. Клиент шлет udp пакеты, а я их заворачиваю в uart.
Сначала всё вроде не плохо работает, сигнализация отрабатывает успешно, а когда доходит до RTP медиа потока, то со стороны компьютера затыкается последовательный порт, к которому подключен esp32-devkit.
Можно голос слышать секунд 5-7, а может и через секунду заткнуться.
Заново инициализирую последовательный порт (на компьютере), и опять всё оживает.
Этот esp32-devkit виден как "CP210x UART Bridge".
Пробовал просто тестировать uart, отправлял на esp32 кадры по ~1000 байт (с заголовком содержащим CRC), на esp32 проверял CRC и отправлял их эхом обратно, ошибок не возникало. Но в этом тесте последовательные запросы и ответы, а когда данные в большом количестве передаются одновременно в двух направлениях, что то затыкатся, не могу понять что, или драйвер или CP2102.
Может сталкивался кто нибудь с подобными проблемами?
Или вообще не использовать uart0 подключенный к CP2102, просто уйти на SPI?
 

pvvx

Активный участник сообщества
CP2102N поддерживает 1500000 baud, а CP2102 по докам - нет, всего до 921600 Silabs CP2102 on DevKitC V2 dont support Baud more as 921600 ? - ESP32 Forum
https://www.sparkfun.com/datasheets/IC/cp2102.pdf
https://www.silabs.com/documents/public/data-sheets/CP2102-9.pdf
https://www.silabs.com/documents/public/data-sheets/cp2102n-datasheet.pdf

Старые FTDI (USB2.0 Full-Speed) на 3000000 baud дают RTS/CTS каждый блок их FIFO, т.е. не могут лить без пропусков.

И 2) Питание:
ESP-32S на DevKit не может работать от USB на нормальных компах. В профиле USB-UART микросхемы прописано питание до 100 mA. На китайских компах c урезанным чипсетом, USB дает до 500 мА. ESP-32S потребляет за 600 мА под нагрузкой. Т.е. включать её без дополнительного внешнего БП на 1A (по рекомендации производителя) в комп не стоит.
При дуплексной работе WiFi и загрузке проца пиковые токи больше допустимых для USB2.0 у дешевых компов и ESP-32S глючит. (Если измерить ток в вашем примере нечем, возьмите тест от производителя на оф. сайте Espressif открываете Продукт->ESP32->Resources->Tools->Test..., прошейте и посмотрите, будет ли глючить...)
 
Последнее редактирование:

Алексей.

Active member
У меня совсем не esp32S :) плата называется вот так "esp32 devkit wifi+ble", сама сборка "esp-wroom-32"
Судя по тому что, работает 1,5М это уже не cp2102/9, похоже на cp2102n, но несмотря на то что он должен работать до 3М, на 2М и на 2,5М с uart-ом который поддерживает скорости до 4М не удалось обмениваться данными, может ограничения в драйвере, не знаю. Но факт такой, плату вообще не перегружаю (не перезагружаю), при большом потоке данных затыкается порт к которому подключена плата, приходится заново инициализировать порт.
Питается пока от хаба с внешним питанием.
 

Алексей.

Active member
Разве интерактивных настроек на стороне компьютера нет?
Есть ОС линукс, есть драйверы ядра, самому приходилось портировать драйверы для некоторых usb железяк.
О каких настройках Вы говорите? Не понял совсем.
 

Jury_78

New member
Есть ОС линукс, есть драйверы ядра, самому приходилось портировать драйверы для некоторых usb железяк.
О каких настройках Вы говорите? Не понял совсем.
Есть буфер данных у USB, можно изменить его размер? Маловероятно, но возможно затыкается звуковая подсистема - изменить размер буфера у неё. Как менять, наверно по средством конфигурационных файлов.
Если не прав, то извините, если Вы сами потртировали..., то не мне дилетанту советовать.
 

Алексей.

Active member
Есть буфер данных у USB, можно изменить его размер?
Да можно, но драйвер взаимодействует с ядром, когда ядро не может принять данные оно говорит драйверу throttle, подожди мол, у меня буфер заполнился, когда приложение данные вычитало, ядро говорит драйверу unthrottle, я могу опять принимать данные. Как то так.
Для увеличения буфера придется пилить драйвер, но это не спасет, дело совсем не размере буфера. Приложение вычитывает все данные при наступлении события от последовательного порта, и звуковая подсистема тоже не причем, пропадает не только звук, но и сигнализация тоже.
 

Алексей.

Active member
Посмотрел логи ядра, а там русским по белому, устройство отключили и в туже секунду включили заново, зашибись. А сам модуль esp32 и не знал что его из usb розетки вытаскивали, от которой он питается, продолжает себе работать точкой доступа.
Oct 19 17:54:05 gb-i3-2 kernel: [86737.874204] cp210x ttyUSB0: cp210x converter now disconnected from ttyUSB0
Oct 19 17:54:05 gb-i3-2 kernel: [86737.874235] cp210x 2-2.3:1.0: device disconnected
Oct 19 17:54:05 gb-i3-2 kernel: [86738.097808] usb 2-2.3: new full-speed USB device number 14 using xhci_hcd
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199516] usb 2-2.3: New USB device found, idVendor=10c4, idProduct=ea60
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199519] usb 2-2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199520] usb 2-2.3: Product: CP2104 USB to UART Bridge Controller
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199521] usb 2-2.3: Manufacturer: Silicon Labs
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199522] usb 2-2.3: SerialNumber: 0148364D
Oct 19 17:54:05 gb-i3-2 kernel: [86738.200328] cp210x 2-2.3:1.0: cp210x converter detected
Oct 19 17:54:05 gb-i3-2 kernel: [86738.201371] usb 2-2.3: cp210x converter now attached to ttyUSB1
 

kab

New member
Посмотрел логи ядра, а там русским по белому, устройство отключили и в туже секунду включили заново, зашибись. А сам модуль esp32 и не знал что его из usb розетки вытаскивали, от которой он питается, продолжает себе работать точкой доступа.
Oct 19 17:54:05 gb-i3-2 kernel: [86737.874204] cp210x ttyUSB0: cp210x converter now disconnected from ttyUSB0
Oct 19 17:54:05 gb-i3-2 kernel: [86737.874235] cp210x 2-2.3:1.0: device disconnected
Oct 19 17:54:05 gb-i3-2 kernel: [86738.097808] usb 2-2.3: new full-speed USB device number 14 using xhci_hcd
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199516] usb 2-2.3: New USB device found, idVendor=10c4, idProduct=ea60
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199519] usb 2-2.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199520] usb 2-2.3: Product: CP2104 USB to UART Bridge Controller
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199521] usb 2-2.3: Manufacturer: Silicon Labs
Oct 19 17:54:05 gb-i3-2 kernel: [86738.199522] usb 2-2.3: SerialNumber: 0148364D
Oct 19 17:54:05 gb-i3-2 kernel: [86738.200328] cp210x 2-2.3:1.0: cp210x converter detected
Oct 19 17:54:05 gb-i3-2 kernel: [86738.201371] usb 2-2.3: cp210x converter now attached to ttyUSB1
Просадки питания, о которых pvvx в посте №2 говорил?
 

Алексей.

Active member
Забавно, несмотря на то что, максимальная потребляемая мощность 500 mA, при подключении всего одного клиента по воздуху, устройство смогло просадить питание так что само не перегрузилось, а контроллер CP210x отключился от usb. При всем этом адаптер питания подключенный к хабу говорит что он на 2,5А, может врет.
Во что верить теперь?...
 

pvvx

Активный участник сообщества
Забавно, несмотря на то что, максимальная потребляемая мощность 500 mA, при подключении всего одного клиента по воздуху, устройство смогло просадить питание так что само не перегрузилось, а контроллер CP210x отключился от usb. При всем этом адаптер питания подключенный к хабу говорит что он на 2,5А, может врет.
Во что верить теперь?...
Я уже указывал, что броски тока у ESP32 более 2.2A. MicroUSB разъем на такое не рассчитан.
Именно по этому ESP32 у меня кинуто в ящик, т.е. имеет полное несоответствие отношения RAM к CLK 2х ядер (проц с 'кэшем', а память забыли :) ) и при этом нет нормального DMA.
 

pvvx

Активный участник сообщества
Есть буфер данных у USB, можно изменить его размер? Маловероятно, но возможно затыкается звуковая подсистема - изменить размер буфера у неё. Как менять, наверно по средством конфигурационных файлов.
У USB - UART козявки блоки идут по 64 байта, внутреннее FIFO обычно - 128 byte receive buffer and 256 byte transmit (FT232R)... У других типа 384 байта. Фреймы USB следуют четко по графику с постоянным интервалом (у High-speed они короче, чем у Full-speed к соответствию отношений скорости... См. спецификацию). Если не успело что, то будет дырка в передаче или приеме, а на 3Mbit/s это уже сказывается при Full-speed... Увеличение буферов в RAM, а не в самом чипе, ни к чему не приведет. Вон у чела ещё хаб стоит и поток в 'теоретическом пределе в 12Mbit/s' распределяется на все устройства, иногда и включая внтуренне исполнение чипсета компа с его малыми FIFO на несколько USB колодок...
Нормальный High-speed USB-UART чип стоит дороже ESP32 :)
Делители у старых Full-speed USB-UART обычно работают на деление 3-х Mbit нацело и всяких 2 000 000 bits/s не существует. 3 000 000, 1 500 000, 1 000 000, 750 000, ... т.к. для работы на 3Mbit/s UART надо иметь внутренний такт на правильное стробирование приемных бит в 3..4 раза больше минимум самого потока...
 
Последнее редактирование:

Алексей.

Active member
всяких 2 000 000 bits/s не существует. 3 000 000, 1 500 000, 1 000 000, 750 000, ...
Подсмотрел уж в исходниках драйвера cp210x, смешные там циферки :)
Код:
else if (baud <= 1053257)  baud = 921600;
else if (baud <= 1474560)  baud = 1228800;
else if (baud <= 2457600)  baud = 1843200;
else                       baud = 3686400;
Можно попробовать отказаться от микроусб, подать питание прямо на плату.
 

pvvx

Активный участник сообщества
Можно попробовать отказаться от микроусб, подать питание прямо на плату.
А SPI опять через древнюю FTDI с теми-же ограничениями по скорости? :)
Из древних и дешевых есть всякие CY7C68013... полный USB2.0 -> 24Mbytes/s
Из новых - RTL8195AM имеет USB2.0 Hi хост и устройство + буфер за 2 Мегабайта памяти, при потреблении как ESP8266. Web-Камеру тянет... но с текущими закрытыми либами дров USB стоит ограничение к потоку от камеры в 1 мегабайт в сек, что не много при несжатом видео-потоке, при передаче по TCP (WiFi) к 2 мегабайт в сек (HT40, одна антенна) ... с этим пока лениво борюсь, т.к. при YUYV формате 176x144 и 15 кадрах в сек, уже подходим к ограничению (760320 байт полезных данных в сек, а ограничены буфера UVC драйвера, при этом свободной незадействованной RAM остается к 1.5 мегабайту = кривые внутренние настройки на JPEG камеры - там кадрики мелкие)... А у вас, при 1M5Baud - 150 килобайт в сек всего...
 
Последнее редактирование:

Jury_78

New member
При всем этом адаптер питания подключенный к хабу говорит что он на 2,5А, может врет.
Может и не врет, если потребление импульсное, а до потребителя длинные провод неизвестного сечения, то на стороне потребителя напряжение проседать будет. Параллельно ножкам питания хорошо бы поставить хороший конденсатор.
 

Алексей.

Active member
Слабым звеном оказался usb-uart, ушел таки я на spi, на болтающихся проводах 20см и скорости 12 мегабит вообще никаких проблем.
 
Сверху Снизу