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, но скорее всего ничего не чередовал, т.к. нет необходимости.