Я разработал USB-устройство на основе STM32F105 . Это устройство USB 2.0 Full Speed CDC, настроенное как виртуальный COM-порт с использованием USB-библиотеки ST . Он использует встроенный физический уровень STM32 и работает на скорости 12 Мбит/с.
Я отправляю данные пакетами по 254 байта. Время от времени (в среднем 1 из 17000 пакетов) хост-компьютер получает неверные данные. Обычно он ограничен одним байтом в пакете.
Итак, я смотрю на сигналы с помощью O-scope Tektronix TDS2025 (200 МГц).
Большинство переходов выглядят великолепно:
Но моя низкотехнологичная глазковая диаграмма показывает нечто неожиданное:
Мне удалось поймать один из плохих сигналов, который выглядит так:
Что может быть причиной этого? Я не уверен, с чего начать поиск.
Когда я впервые подключаю устройство, перечисление проходит успешно, и глазковая диаграмма выглядит чистой. Но как только я открываю COM-порт (используя PuTTY, Hercules или мое собственное программное обеспечение Java), появляются сбои. Я использую Lenovo Thinkpad с Windows 7.
Вот фото макета:
Микросхема TVS — это NXP PRTR5V0U2F , а детектор зарядного устройства — TI BQ24392 .
Следы USB перемещаются примерно на дюйм на обратной стороне платы, затем возвращаются и подключаются непосредственно к контактам USB микроконтроллера. Они контролируются по импедансу и соответствующим образом согласованы по длине друг с другом.
Я прощупываю от контактных площадок USB-разъема до точки заземления, которую я пометил на картинке. Зонд имел короткую заземляющую пружину, а не длинный зажим типа «крокодил».
Если дополнительные данные помогут, пожалуйста, дайте мне знать. Кроме того, это мое первое USB-устройство и мой первый тест на глазковую диаграмму. Если вы видите что-то не так с моей настройкой или предположениями, пожалуйста, дайте мне знать.
Не похоже, что это аппаратная проблема. Ступенчатая форма волны выглядит либо как отражение, либо как переход, когда хост и устройство меняются ролями отправителя и получателя. В любом случае сигнал выглядит достаточно хорошо, чтобы его можно было правильно декодировать.
Было бы лучше, если бы вы поместили спусковой крючок вашего прицела где-нибудь на экране. Когда триггер находится за пределами экрана, вы можете получить более явное дрожание, чем на самом деле в любом отдельном бите.
Вам нужно внимательно посмотреть на свое программное обеспечение. Скорее всего, у вас где-то есть ошибка, которая искажает, пропускает или добавляет байт, когда происходит определенный угловой случай. Это может быть, например, во время конкуренции за FIFO, когда он на один байт меньше полного или что-то в этом роде. Если к FIFO обращается как код прерывания, так и код переднего плана, то это именно та трудная для обнаружения проблема, которую вы ожидаете, когда логика блокировки не совсем верна.
Buffer[index] = data; index++;
). Когда я создал свою собственную функцию, я сделал это следующим образом: Buffer[index++] = data;
по-видимому, процесс USB (очень редко) происходил после увеличения индекса, но до того, как данные были записаны.Это абсолютно идеальный сигнал FS. По-видимому, OP проверяет сигналы на конце кабеля устройства. Сигналы FS не терминированы по стандарту USB. Все входящие сигналы (управляемые хостом) в порядке, поскольку они измеряются в точке назначения. Однако, когда устройство возвращает случайный пакет подтверждения (короткий ACK или NAK или что-то еще), драйвер подключается к линии передачи. Сигнал половинной амплитуды (шудер) развивается до тех пор, пока не вернется отражение от принимающего конца. Это абсолютно нормальное поведение сигналов на нетерминированной линии передачи. Как я вижу, задержка туда и обратно составляет около 20 нс или 10 нс в одну сторону. Это говорит о том, что используемый кабель имеет длину около 2 м или стандартный кабель длиной 6 футов. Если бы OP прощупал шину на стороне хоста, он увидел бы противоположную картину. Только мой 2с.
Я отправляю данные пакетами по 254 байта. Время от времени (в среднем 1 из 17000 пакетов) хост-компьютер получает неверные данные. Обычно он ограничен одним байтом в пакете.
Используете ли вы FIFO? Если это так, проверьте свой исходный код: есть плохие примеры FIFO, которые фактически позволяют читать «плохой» байт.
«Плохая форма сигнала» все еще находится в пределах спецификации. Вероятно, вы видите отражение, когда ПК отправляет данные. Это будет лучше при использовании концентратора или портов на задней панели настольного ПК и хуже при использовании портов на передней панели, которые подключены более длинными кабелями внутри ПК.
Том Л.
пользователь 2943160
Фотон
пользователь76844
битмак
Питер Смит
битмак
битмак
Том Л.
Энди ака
Транзистор
Том Л.
Транзистор