AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
28.01.2013, 13:26
|
|
Прописка
Регистрация: 13.06.2004
Адрес: Москва
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 32 раз(а) в 18 сообщении(ях)
|
Не могу запустить USB контроллер ATMega32U4
Коллеги!
Нужна помощь в программировании USB контроллера микропроцессора ATMega32U4.
В моем проекте нужно обеспечить связь по USB между PC (хостом) и прибором на базе ATMega32U4.
Решил запрограммировать встроенный USB контроллер самостоятельно, благо что материалов по программированию USB достаточно. Проект делается на ассемблере.
Но встал в тупик при попытке запустить встроенный контроллер USB. Задаю все параметры, все регистры и переменные, но при подключении к PC не происходит процесс обмена (энумерации), вообще отсутствуют прерывания от конечной точки и передача какой либо информации.
Макетная плата проверена, в начале работы со встроенным USB загрузчиком работала. Поэтому вариант ошибок в макетной плате исключается.
USB PLL сконфигурирована и работает корректно, проверялось с использованием быстрого встроенного Timer4.
Фрагмент кода с конфигурацией USB контроллера:
Код:
|
;----------------- Set PLL ----------------------------
ldi r16,0x4A ;Set PLL Frequency
out PLLFRQ,r16 ; PLLFRQ
ldi r16,0x02 ;Switch On PLL
out PLLCSR,r16 ; PLLCSR
PLL_Lc:in r16,PLLCSR ;
sbrs r16,PLOCK ;Wait PLL Lock
rjmp PLL_Lc ;
;---------------- Init USB conroller -------------------
ldi r16,0x01 ;Set to enable the USB pad regulator
sts UHWCON,r16 ; UHWCON
ldi r16,0x90 ;
sts USBCON,r16 ;Swich on USB controller
sts USBCON,r16 ;Swich on USBclk (0=›FRZCLK)
ldi r16,0x00 ;Clear USB Device INT Flags
sts UDINT,r16 ; UDINT
ldi r16,0x10 ;Set USB Device INT Enable (WAKEUPI)
sts UDIEN,r16 ; UDIEN
;--------------------------------------------------------
;================= Init USB Endpoints ===================
;-------------- Init Ep0 (Control) ----------------------
ldi r16,0x00 ;Select Endpoint #0
sts UENUM,r16 ; UENUM
ldi r16,0x01 ;Enable Endpoint #0
sts UECONX,r16 ; UECONX
Cfg: ldi r16,0x00 ;Configure Endpoint #0
sts UECFG0x,r16 ;Set Ep0 - "Control", bidirectional
ldi r16,0x32 ;Configure Endpoint #0
sts UECFG1x,r16 ;Set Ep0 Size=64 bit, One bank, Memory Allocate enable
lds r16,UESTA0X ;Read Endpoint Status Regiser
sbrs r16,CFGOK ;EP Configuration OK?
rjmp Cfg ;If NOT then GoTo Repeat
ldi r16,0x00 ;Clear Endpoints INT Flags
sts UEINTx,r16 ; UEINTX
ldi r16,0x0C ;Set Control Endpoint INT Enable
sts UEIENx,r16 ; UEIENX
ldi r16,0x00 ;Set USB device general registers Set 00/04 High/Low speed
sts UDCON,r16 ; UDCON Connect Device (0=›DETACH)
;--------------------------------------------------------
sei
loop: rjmp loop |
Дамп регистров контроллера после появления сигнала WAKEUP в приложенном рисунке.
Прибор проверяется подключением к PC. Ожидалось увидеть в контроллере пакеты SETUP с запросами дескрипторов и т.д.
В программе все выглядит в соответствии с мануалами и описаниями, но ничего не работает.
В чем засада?
Последний раз редактировалось Slava1355; 28.01.2013 в 14:03.
Причина: Правка кода
|
|
|
|
28.01.2013, 13:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Не могу запустить USB контроллер ATMega32U4
sei есть ?
|
|
|
|
28.01.2013, 14:08
|
|
Прописка
Регистрация: 13.06.2004
Адрес: Москва
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 32 раз(а) в 18 сообщении(ях)
|
Re: Не могу запустить USB контроллер ATMega32U4
Сообщение от Wiza_
|
sei есть ?
|
Да, конечно. Я дополнил код в исходном сообщении чтобы была видна программная "заглушка".
Кроме того, дамп регистров был снят в коде программы обслуживания прерывания устройства.
При включении и активации USB контроллера, он через 3 мс неактивности USB линии засыпает.
При появлении активности на линии, вырабатывается прерывание WAKEUPI, по которому я пробуждаю контроллер и делаю дамп всех регистров.
Но, после этого, никаких прерываний от конечных точек (о приеме информации или setup пакетов) не появляется.
Последний раз редактировалось Slava1355; 28.01.2013 в 14:10.
|
|
|
|
28.01.2013, 14:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Не могу запустить USB контроллер ATMega32U4
Power On the USB interface
• Power-On USB pads regulator
• Configure PLL interface
• Enable PLL
• Check PLL lock
• Enable USB interface
• Configure USB interface (USB speed, Endpoints configuration...)
• Wait for USB VBUS information connection
• Attach USB device
Последовательность немного отличается от вашей
|
|
|
|
28.01.2013, 23:30
|
|
Прописка
Регистрация: 13.06.2004
Адрес: Москва
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 32 раз(а) в 18 сообщении(ях)
|
Re: Не могу запустить USB контроллер ATMega32U4
Сообщение от Wiza_
|
Power On the USB interface
• Power-On USB pads regulator
• Configure PLL interface
• Enable PLL
• Check PLL lock
• Enable USB interface
• Configure USB interface (USB speed, Endpoints configuration...)
• Wait for USB VBUS information connection
• Attach USB device
Последовательность немного отличается от вашей
|
У меня сначала запускается PLL. Не думаю, что это существенный момент, так как это отдельный узел, который используется не только для USB контроллера, но и для комплексного таймера4.
Сама PLL работает с правильной частотой, это проверялось подключением к ней делителя на базе Timer4 и контроля частоты на выходе OC4A.
Ожидания VBUS у меня нет, так как у меня Bus powered устройство и VBUS присутствует на входе сразу после включения.
Для пробуждения контроллера USB из suspend mode я использую прерывание WAKEUPI, которое появляется сразу после любой активности на шине.
В остальном все соответствует этой последовательности.
После подключения устройства, PC на него реагирует (на экране компьютера в итоге появляется надпись что USB устройство не опознано), но контроллер не принимает ни одного сообщения. Прерываний по событиям конечной точки (IN, OUT, Control) никаких нет. В FIFO какое-то случайное значение, в разных экземплярах макетов разное.
Ожидалось что я увижу в памяти контроллера какие либо данные - запросы от хоста, но там ничего нет!?
|
|
|
|
29.01.2013, 10:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Не могу запустить USB контроллер ATMega32U4
Более точный порядок отследить сложно, но примерно так.
Код:
|
[device] - USB_connect
[host] - USB_suspend
[host] - USB_reset
[host] - USB_resume
[host] - USB_GET_DESCRIPTOR [target - ep0] |
Для начала - попробуйте поймать SOF. Он есть всегда.
|
|
|
|
29.01.2013, 22:28
|
|
Прописка
Регистрация: 13.06.2004
Адрес: Москва
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 32 раз(а) в 18 сообщении(ях)
|
Re: Не могу запустить USB контроллер ATMega32U4
Сообщение от Wiza_
|
Более точный порядок отследить сложно, но примерно так.
Код:
|
[device] - USB_connect
[host] - USB_suspend
[host] - USB_reset
[host] - USB_resume
[host] - USB_GET_DESCRIPTOR [target - ep0] |
Для начала - попробуйте поймать SOF. Он есть всегда.
|
Проконтролировал попытки PC подключить мое устройство.
PC делает три попытки подключения. В процессе подключения мое устройство принимает 3 запроса WAKEUPI и 1677 прерываний по SOF.
Кстати, а есть ли где нибудь описание того, ЧТО должен делать контроллер USB в ATMega32U4, а то во всей документации есть описание только того КАК НАСТРОИТЬ регистры контроллера. А без четкого понимания какие функции он должен выполнять очень трудно с ним работать, все приходится додумывать.
Например, цикл обмена по шине USB в общем случае состоит из 3-х транзакций:
- Token Packet
- Data Packet
- Status Packet.
Я правильно понимаю, что контроллер USB автоматически проделывает все три операции (с NRZ декодированием, контролем CRC) и выдает/принимает данные в/из FIFO?
Кроме этого есть еще ряд вопросов из серии "чего ждать от контроллера".
|
|
|
|
29.01.2013, 22:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.12.2012
Адрес: Питер
Сообщений: 982
Сказал спасибо: 131
Сказали Спасибо 230 раз(а) в 157 сообщении(ях)
|
Re: Не могу запустить USB контроллер ATMega32U4
А не проще ли взять на том же сайте атмела экземплы, например, класса CDC и распилить их ? USB сам-по себе имеет довольно сложный протокол. В экземплах сократить удастся немногое.
Так же имейте ввиду: в Windows 7 после заливки новой прошивки в МК - необходимо удалять драйвера с вашего USB устройства, даже если оно не опознано. Сам потерял 4 дня из-за этого.
|
|
|
|
31.01.2013, 21:16
|
|
Прописка
Регистрация: 13.06.2004
Адрес: Москва
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 32 раз(а) в 18 сообщении(ях)
|
Re: Не могу запустить USB контроллер ATMega32U4
Проблему решил. Для этого пришлось с www.usb.org скачать спецификацию USB шины: Universal Serial Bus Specification Revision 2.0. Там, среди 650 страниц текста, на странице 150 нашлась диаграмма состояний при подключении USB устройства к шине. По ней следует, что после подключения устройства и появления активности на шине, через 100 мс хост сбрасывает устройство и, затем, снова начинает процесс общения с ним. Поэтому для начала работы с контроллером нужно использовать не прерывание по появлению активности на шине - WAKEUPI, а прерывание по окончании Reset на шине - EORSTI.
В моем случае я инициализировал конечные точки устройства по появлению активности на шине, но хост через 100 мс после этого сбрасывал контроллер (и всю мою инициализацию) и контроллер, естественно, после этого уже не принимал никаких сообщений с линии.
После того, как я провел инициализацию конечных точек по прерыванию EORSTI, все заработало штатно, контроллер начал обмен сообщениями в соответствии с протоколом USB.
Тему можно закрывать.
|
|
|
Сказали "Спасибо" Slava1355
|
|
|
24.09.2014, 21:32
|
|
Частый гость
Регистрация: 04.09.2014
Сообщений: 23
Сказал спасибо: 10
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Не могу запустить USB контроллер ATMega32U4
Сообщение от Slava1355
|
Коллеги!
Нужна помощь в программировании USB контроллера микропроцессора ATMega32U4.
В моем проекте нужно обеспечить связь по USB между PC (хостом) и прибором на базе ATMega32U4.
Решил запрограммировать встроенный USB контроллер самостоятельно, благо что материалов по программированию USB достаточно. Проект делается на ассемблере.
Но встал в тупик при попытке запустить встроенный контроллер USB. Задаю все параметры, все регистры и переменные, но при подключении к PC не происходит процесс обмена (энумерации), вообще отсутствуют прерывания от конечной точки и передача какой либо информации.
Макетная плата проверена, в начале работы со встроенным USB загрузчиком работала. Поэтому вариант ошибок в макетной плате исключается.
USB PLL сконфигурирована и работает корректно, проверялось с использованием быстрого встроенного Timer4.
Фрагмент кода с конфигурацией USB контроллера:
Код:
|
;----------------- Set PLL ----------------------------
ldi r16,0x4A ;Set PLL Frequency
out PLLFRQ,r16 ; PLLFRQ
ldi r16,0x02 ;Switch On PLL
out PLLCSR,r16 ; PLLCSR
PLL_Lc:in r16,PLLCSR ;
sbrs r16,PLOCK ;Wait PLL Lock
rjmp PLL_Lc ;
;---------------- Init USB conroller -------------------
ldi r16,0x01 ;Set to enable the USB pad regulator
sts UHWCON,r16 ; UHWCON
ldi r16,0x90 ;
sts USBCON,r16 ;Swich on USB controller
sts USBCON,r16 ;Swich on USBclk (0=›FRZCLK)
ldi r16,0x00 ;Clear USB Device INT Flags
sts UDINT,r16 ; UDINT
ldi r16,0x10 ;Set USB Device INT Enable (WAKEUPI)
sts UDIEN,r16 ; UDIEN
;--------------------------------------------------------
;================= Init USB Endpoints ===================
;-------------- Init Ep0 (Control) ----------------------
ldi r16,0x00 ;Select Endpoint #0
sts UENUM,r16 ; UENUM
ldi r16,0x01 ;Enable Endpoint #0
sts UECONX,r16 ; UECONX
Cfg: ldi r16,0x00 ;Configure Endpoint #0
sts UECFG0x,r16 ;Set Ep0 - "Control", bidirectional
ldi r16,0x32 ;Configure Endpoint #0
sts UECFG1x,r16 ;Set Ep0 Size=64 bit, One bank, Memory Allocate enable
lds r16,UESTA0X ;Read Endpoint Status Regiser
sbrs r16,CFGOK ;EP Configuration OK?
rjmp Cfg ;If NOT then GoTo Repeat
ldi r16,0x00 ;Clear Endpoints INT Flags
sts UEINTx,r16 ; UEINTX
ldi r16,0x0C ;Set Control Endpoint INT Enable
sts UEIENx,r16 ; UEIENX
ldi r16,0x00 ;Set USB device general registers Set 00/04 High/Low speed
sts UDCON,r16 ; UDCON Connect Device (0=›DETACH)
;--------------------------------------------------------
sei
loop: rjmp loop |
Дамп регистров контроллера после появления сигнала WAKEUP в приложенном рисунке.
Прибор проверяется подключением к PC. Ожидалось увидеть в контроллере пакеты SETUP с запросами дескрипторов и т.д.
В программе все выглядит в соответствии с мануалами и описаниями, но ничего не работает.
В чем засада?
|
по сигналу end of reset все точки сбрасываются ригистр адреса тоже 0 контрольная точка конфигурируется заново
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:39.
|
|