Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: Вопрос к знатокам USB

Пн апр 23, 2018 14:32:41

Такое ощущение, что хаб сменил адрес моему устройству, а сам продолжает долбиться по 0000000b


Разбирался с этим уже порядком времени назад, но, если мне не изменяет память, до следующего сброса устройство должно отвечать по адресу 0, даже если адрес уже сменен.

С английским у меня хреново от слова совсем.


Могу только посоветовать начинать учить его. Без этого ничего серьезного не сделать. В частности, по USB я не встречал публикаций лучше USB made simple и USB in a nutshell. Впрочем, вторую публикацию вроде бы даже перевели, но к переводам я всегда призываю относиться осторожно.

Re: Вопрос к знатокам USB

Вт апр 24, 2018 07:22:17

Точно не менять адрес до сброса ? Все дело в том что в имеющемся примере (для другого процессора но с тем-же контролером) при команде сброса от хоста адрес тоже сбрасывается. В документации на контролер этот момент описан мутновато. Но если послать пустой пакет с адресом 000000, то далее запросов нет вообще, а если с принятым адресом - то следуют запросы дескриптора и только потом ступор. Грешу все-ж на некоррекную генерацию DATA PID - "переворачивать" это бит надо когда, а когда не надо не нашел вообще нигде.

Re: Вопрос к знатокам USB

Вт апр 24, 2018 10:06:50

Wladimir_TS писал(а):Формально HS по спецификации используемого контролера, но нигде нет переключения в другой режим потому не знаю.
Заголовок ДШ говорит что FS, да и генератор на 48МГц только для FS. Так что китайский анализатор Вам поможет.

Wladimir_TS писал(а):Точно не менять адрес до сброса ?
Очень поверхностно глянул ДШ. Такое впечатление, что при генерации хостом сброса USBN сам не сбрасывает свои регистры. Если конечно под firmware понимается прошива внешнего МК.

On USB reset, the firmware has 10 mS for set-up, and should write 0x80 to the FAR register and 0x00 to the EPC0 register.
On receipt of a SET_ADDRESS command, the firmware must write 0x40 to the EPC0 register and 0x80
<assigned_function_address> to the FAR register. It must then queue a zero length IN packet to complete the status phase
of the SET_ADDRESS control sequence


С точки зрения протокола. После сброса все запросы идут на адрес ноль. После прихода пакета установки адерса, отвечаешь ZLP как от безадресного устройства (я это уже писал). Дело в том, что подчиненное устройство само никогда не начнет передачу, только после запроса IN. А хост после установки адреса, будет слать IN к безадресному устройству (адр. 0). Получив от такого адреса ZLP, далее хост будет слать пакеты уже на установленный адрес. Другой вопрос, как это реализовать на Вашем контроллере, надо разбираться, может какие-то вещи сам на себя берет.

Сброс от хоста (SE0) - это работа с чистого листа. Хост работает с функцией, что-то не понравилось - послал SE0 на линию и пробует все сначала. Пытаться он будет так максимум три раза. По факту с STM у меня проходило 4 сброса (на кривой прошивке), по всей видимости первый SE0 был ложный, в момент подключения к USB.

Wladimir_TS писал(а):Грешу все-ж на некоррекную генерацию DATA PID - "переворачивать" это бит надо когда, а когда не надо не нашел вообще нигде.
Насколько я помню, если ваши данные не входят в один пакет, а передаются частями, надо чередовать Data0, DATA1. Некий контроль целостности порядка передачи данных. Начинать с DATA0. Судя по размеру буфера 8 байт, Вам почти всегда надо разбивать данные на пакеты.
Еще вспомнил нюанс. Вроде где-то в каком-то дискрепоторе устанавливается максимальный размер передаваемых данных в пакете. Например установлено 8 байт. Вам нужно передать 15 байт. В первом пакете ушло 8 байт, во втором 7. Хост увидел что пакет не полный и знает что данные все отправлены.
Второй случай. Отправляете данные кратные размеру пакета. Например 24 байта. Для хоста идут полные пакеты и он не может определить что данные все. Поэтому после 24 байт, надо отправить еще zlp не забывая переключать data0/1.
После получения данных хост ответит zlp.

Это я все из памяти своей ненадежной, так что могу безбожно врать, уж извините. Кроме того, я работал STM. Там буфер 512 байт за вычетом небольшого. Наверное я устанавливал размер предела пакета 1024 байта, а слал всегда значительно меньше и все в одном пакете. Кроме того возможно STM сам чередует data0/1, но скорее всего ничего не чередовал, т.к. нет необходимости.
Ответить