Моё предложение такое, что надо сначала проверить железо - всё ли в нём настраивается для работы с USB? Загрузить в контроллер стандартный пример USB-девайса - пусть комп хотя бы обнаружит, что "найдено новое устройство, USB-AVR клавиатура... или мышь... или флешка" или какие там примеры ATMEL выкладывает.
Если компьютер обнаружил некое устройство, и его видно в диспетчере устройств, с названием, с всякими VID/PID - тогда уже можно начинать писать программу самому. А то, если что-то не так с железом (ножка не пропаяна, кварц не той частоты и т.п.) - можно долго ждать SETUP-пакетов.
Если с железом всё в порядке, и настройки железа в норме, то вот последовательность энумерации:
1. Подключаем Pull_Up резистор к D+ (для FullSpeed, и к D- для LowSpeed).
2. Обнаружив Pull_Up резистор - Хост выставляет на шине состояние
RESET (1й раз).
3. Хост выставляет состояние
SUSPEND.
4. Хост снова выставляет
RESET (2й раз).
5. И только после этого - приходит первый SETUP-пакет. В буфер придёт последовательность из 8 байт:
0x80, 0x06, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00 - отправляем
ACK.
6. Отправляем Хосту 8 байт ответа:
0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x087. Хост присылает пакет данных нулевой-длины (
длина 0 !) - отправляем
ACK.
8. Хост снова выставляет
RESET на шину (3й раз)
9. Хост присылает SETUP-пакет присвоения адреса:
0x00, 0x05, 0xNN, 0x00, 0x00, 0x00, 0x00, 0x00 где NN присвоенный устройству адрес (1-127). Прописываем присвоенный адрес в соответствующий регистр контроллера, и отправляем
ACK.
10. Отправляем Хосту пакет нулевой длины.
11.... дальше больше, но это потом, если хотя бы эти шаги работают
Если всё в порядке, больше состояние RESET на шине появляться не будет. А если с обменом будут ошибки - то Хост ещё два раза повторит с пункта [4], после этого выставит команду
SUSPEND, и затихнет до переподключения USB-устройства.
Сообщение отредактировал controller_m30 - Aug 14 2013, 05:51