• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

WCH-LinkE (CH32V305FBP6) USB2.0 HS.

pvvx

Активный участник сообщества
Кто может объяснить данное явление:

Как обычно закатал в WCH-LinkE сильно переделанную программу примера ch32v307\EVT\EXAM\USB\USBHS\DEVICE\SimulateCDC.
В ней исправил всё связанное с инициализацией PLL-ей, т.к. кварц на WCH-LinkE на 12 МГц, а не 8 МГц как во всех примерах от WCH.
Временно отключил UART (он всего там до 9 Мбит в сек, а мне надо десятки Мегабит), заменив на "Эхо" (что отсылается в USB то и приходит обратно) чтобы протестировать скорость USB на разных размерах передаваемых-принимаемых блоков в CDC (USB-COM).
Протестировал старым своим питоно-скриптом.
Код:
>python3 DevEchoCDCTstTxRx.py -p COM21 -c 10000 8120 8120
USB Echo Utility version 20.10.19
Start 10000 cycles Tx 8120 -> Rx 8120
------------------------------------------
  Time: 6.081 sec
Cycles: 10000 (transactions)
Writes: 81200000 Bytes (13039.033 KBytes/s)
Reads: 81200000 Bytes (13039.033 KBytes/s)
OldBlk: 55 aa 1fb8 270f ..
------------------------------------------
IO Speed: 26078.066 KBytes/s

~ 25.5 MBytes/s
Скрипт передает фиксированный размер блока в COM и ждет приема ответа аналогичного переданному и так повторяет указное кол-во раз. Данные в блоке изменяются по номеру счетчика транзакции и сверяются...

В итого, как всегда:
1720846961651.png
Нарывается на предельный размер в 8120 байт, где далее идет падение скорости(!?).
1720847181929.png
Если тестируемый WCH-LinkE всунуть в другой порт USB, то вылезают и другие ограничения:
- в некоторых портах или через разные USB хабы (USB2.0...USB3.1...) вообще происходят сбои при блоке более чем 4095 байт.
Замеры скоростей передачи до этих ограничений примерно одинаковы...

Но от куда данные ограничения и провалы?

Ранее где-то мелькала информация о не полной скорости USB2.0 на драйвере или самом USB у AMD процов, проявляющуюся в редких тормозах... Например об этом писалось в Saleae при работе с Cypress CY7C68013A, так же у NRF в PowerProfiler II (хотя там всего USB2.0 FS) . Так и не исправили... Решается методом перебора и тыка в другой порт или через USB-Хаб.

Кто видел решение данной проблемы?
 

pvvx

Активный участник сообщества
Добавление в Питоне serialPort.set_buffer_size(rx_size = 65536, tx_size = 65536) никак не помогло.

Изменение алгоритма – прием-передача по одному блоку для EP USB (до 512 байт) с ожиданием, т.е. всё по очереди, тоже не принесло успехов. При более 8КБ типа теряется пакет… а скорость просела до 15 Мегабайт в сек. Надо глядеть ослом шину USB на 480 Mbit …
 

pvvx

Активный участник сообщества
Увеличение частот CPU и вся, так-же не помогло. Была надежда, что что-то не успевает в прерывании...
(И нечего смотреть позорные видео о том, что незя поставить частоту CPU на 144MHz, когда используется USB. У USB свой PLL на 48MHz, обычно перемножающий частоту кварца деленного на 2.)
log старта:
Код:
Simulate USB-CDC Device running on USBHS Controller
ChipID: 30520518
SYSCLK: 144000000
HCLK:   144000000
PCLK1:  144000000
PCLK2:  144000000
ADCCLK: 72000000
 

pvvx

Активный участник сообщества
Почти полностью переписал пример USB CDC от WCH.

Скорость потока возросла к 30 Мбайт в сек, т.к. пошел частичный дуплекс - прием с передачей и выкинуты лишние наляпанные в коде передачи ...

Теперь имеется четкое ограничение в виде непрерывно считываемых по USB блоков компом. Более 36 штук аппаратных фреймов в тестируемый USB3.1 по протоколу USB2.0HS не лезет, толи в чипсет, толи кривые дрова USB-CDC у Windows... Не считывает дальнейшие блоки после 36-го из EP USB и выходит по таймауту. Очередная халтура.

CDC работает тупо, но имеет синхронизацию-разбивку потока на фреймы. Т.е. если послан блок максимального размера FIFO USB (в данном случае я выставил 512 байт), то если это конец фрейма, тогда передается блок с длиной “0”, как завершающий. В других случаях передача блока с меньшей длиной, чем максимальная является концом фрейма.

Пример: надо передать единый блок в 1222 байта. Это будет 3 посылки 512+512+198 байт.

Но если надо передать 1536 байт, тогда это будет: 512+512+512+0, т.е. 4-ре передачи, с завершение передачи блоком с длиной 0.

Дык вот комп не жрет в USB2.0HS фрейм более 18432 байт :cry:

Надо пробовать иногда, через N полных блоков, давать нулевой блок... Но это убьет всю разбивку на фреймы.... В чипсете не нашлось транзисторов для буфера в мегабайты?
 

pvvx

Активный участник сообщества
Т.е. подсказать никто ничего не может...
Оставлю пока так, как вышло:
1720899747354.png1720900163928.png
До 18 килобайт фрейма в USB-CDC да в Питоне работает, с буферизацией в 4 килобайта выдает за 30 Мегабайт в секунду чистых перекачанных байт на финтифлюшке WCH-LinkE.
Для Ардуинщиков нужна UART на 300 Мегабит :) Но в чипе есть всего 1Мbps 12 бит ADC....
 

nikolz

Well-known member
Кто может объяснить данное явление:
Если тестируемый WCH-LinkE всунуть в другой порт USB, то вылезают и другие ограничения:
- в некоторых портах или через разные USB хабы (USB2.0...USB3.1...) вообще происходят сбои при блоке более чем 4095 байт.
Замеры скоростей передачи до этих ограничений примерно одинаковы...
Но от куда данные ограничения и провалы?
Может быть 4К связано с размером страницы. Переход на новую требует дополнительных затрат времени, которого нет.
 

pvvx

Активный участник сообщества
Может быть 4К связано с размером страницы. Переход на новую требует дополнительных затрат времени, которого нет.
В Wireshark в Windows данные от устройства поступают блоками по 4 кило. Но это никак не связано с сегментами проца. Скорее всего с win-дровами USB-CDC. 4 блока по 4 и потом всё. Wireshark уже на уровне API...
Ещё ограничение может быть связано с API Питона.
Мне пока фреймы более 8 кило не нужны... Но...
 

pvvx

Активный участник сообщества
В самом чипе CH32V30X нет много RAM и большие фреймы не требуются. Только если задача конвертации/шифрования проходящего потока. И то зачем там CDC (COM-порт)?
А на малых фреймах в 4 кило всё будет хорошо - уже достигается максимальная производительность USB2.0 HS.
 

pvvx

Активный участник сообщества
У Modbus фрейм вообще до 254 байта. И при использовании USB-CDC блочная синхронизация соблюдается.
Гнать SD карточку через USB-COM нет смысла - там свой USB драйвер.
Но если хотим передать файл (пусть c SD карточки) - тогда придется городить свою систему блочной синхронизации потока, т.к. в CDC сидит описанная бяка-баг, которая не дает это сделать штатными средствами.
 

pvvx

Активный участник сообщества
А вставка своей системы блочной синхронизации = уменьшение пропускной способности шины. Будут лишние синхро чтения уже на уровне USB, не считая лишние байты в потоке для разметки фреймов.
Ардуинщикам и программерам (не системным) это безразлично - от этого и имеем баги такого типа в самом корне систем.
 

pvvx

Активный участник сообщества
Вообще про всё это нормальных описаний в инет не найти уже много лет. Есть только вякания неких в коментах к вопросам по данным темам. А глубоко изучать спецификацию USB в здравом состоянии никто не будет.

Микрософт описывает некоторые части, но со своем уклоном :) При этом приводит детские игрушки (на древних чипах) в качестве средств для отладки системных драйверов, а не нормальное проф. оборудование. Видимо по этому такой уровень дров и есть в Windows.
 

pvvx

Активный участник сообщества
Итог очередного баловства с USB-COM + ADC:
1721115298558.png
Осел на 923 ksps 12 бит в эксплорере... На вход ADC CH32V305 подключена качающаяся частота 1..10 кГц (пила).
 

pvvx

Активный участник сообщества
Возможно и два канала, т.к. в чипе ADC две шутки по до 1Mbps. При 12 бит и расширении до 16 бит это всего 32 Мегабита в сек, а USB 2.0 HS дает за 20 Мегабайт в сек. Это всего займет до 25 % пропускной способности, но справиться ли Java (JS) в эксплорере (?)...
 

pvvx

Активный участник сообщества
И по шумам достойно (- не ESP32 :LOL:) , при работе от USB без всякой фильтрации питания и соединении китайскими железными проводами и разъемами к генератору:
1721121659218.png
20 мВ p-p 1 кГц (меньше ген не выдает). Масштабирование в 100 раз (полная шкала 33 мВ).
 
Сверху Снизу