Долго грешил на тактовую частоту USB-модуля, но любые игрища с ней приводили либо к УМЕНЬШЕНИЮ скорости, либо микроконтроллер превращался в тыкву.
Тогда я стал проводить что-то вроде профилирования, чтобы определить, где же теряется время. Обнаружилось, что первый пакет из контроллера приходит в разное время после первого запроса. А все остальные приходят почти точно через 110 мс. Очевидно, проблема в самом контроллере. Такая скорость слишком низка даже для самого младшего стандарта USB.
Я стал думать, нет ли у меня где-нибудь паузы в главном бесконечном цикле прошивки? (на самом деле думал я об этом и раньше, но ничего не нашёл) Прошерстил всё, нашёл в итоге паузу. Но на 10 мс только. После этого пакеты стали приходить ровно через 100 мс.
Явно остальные 100 мс делаю тоже я. Число круглое. Но где? Почему я этого не вижу?
ОКАЗАЛОСЬ, что дело было в команде Pause(delay). А delay была переменной и имела по-умолчанию значение как раз 100. Бинго!
А я-то искал Pause(100) или хотя бы Pause(ЧИСЛО). И глаз за Pause(delay) не зацеплялся -- даже в окне поиска.
После убирания этой задержки скорость обмена выросла в тысячу (!) раз.
Что же делала задержка в главном цикле? Она выполняла роль таймера. Задержки МЕЖДУ измерениями, которые должен был производить контроллер. Но потом я перешёл на вызов измерения по прерыванию и прямая задержка оказалась не нужна. Но убрана не была. Измерениям она не мешала, т.к. они проводились в прерывании. А вот на обмен данными влияла.