|
|
  |
ISP1581+atmega128, Хост не генерит setup запрос |
|
|
|
Dec 16 2005, 09:07
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 12-05-05
Пользователь №: 4 940

|
ISP1581 прицепил к atmega128, которая работает на 16 МГц. Последовательность действий такая:
После подачи питания делаю задержку в 3 секунды, потом инициализирую
Mode регистр (SOFTCT+GLINTENA+CLKAON+WKUPCS),
Interrupt Configuration (0x54),
Interrupt Enable (IEBRST+IESUSP+IERESM+IEHS_STA),
Interrupt Enable+1 (IEP0SETUP+IEP0TX+IEP0RX),
USB_WR(Address,DEVEN)
после этого возникает прерывание и выставляется регистре interrupt флаг SUSP, затем через некоторое время BRESET и HS_STAT. Не могу добится, чтобы возникло прерывание setup.
Подскажите пожалуйста, кто знает что я не так делаю? Может команду какую пропускаю.
|
|
|
|
|
Jan 12 2006, 12:27
|
Группа: Новичок
Сообщений: 6
Регистрация: 12-01-06
Пользователь №: 13 089

|
У меня работает примерно так:
UWRITE_BYTE_C(MODE, 0x80); // UWRITE_BYTE_C(MODE, 0x90); // Asynch. reset while (delay--){ // Delay }
UWRITE_BYTE_C(IEINT, 0x71); UWRITE_BYTE_C(IEINT+1, 0x0D); // Enable BRESET INT
UWRITE_BYTE_C(EPINDEX, 0x20); // Select EP0SETUP UWRITE_BYTE_C(EPTYPE, 0x08); // Enable EP0SETUP
UWRITE_BYTE_C(EPINDEX, 0x00); // Select EP0 Out UWRITE_BYTE_C(EPTYPE, 0x08); // Enable EP0SETUP
UWRITE_BYTE_C(EPINDEX, 0x01); // Select EP0 In UWRITE_BYTE_C(EPTYPE, 0x08); // Enable EP0SETUP
UWRITE_BYTE_C(FADDR, 0x80); // Enable Device And Reset Device Address
UWRITE_BYTE_C(MODE, 0x89); // Enable Global Interrupt // Enable connect 1.5 KOm
|
|
|
|
|
Jan 13 2006, 13:18
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 12-05-05
Пользователь №: 4 940

|
Спасибо, что ответили на мою тему, наконец-то я прочитал дескриптор своего USB устройства, теперь иду дальше
|
|
|
|
|
Jan 18 2006, 13:53
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 12-05-05
Пользователь №: 4 940

|
Не могу записать прочитать в из конечной точки (использую 2-ю на передачу и 2-ю на прием)
У меня вот так сконфигурированы конечные точки:
D14_Cntrl_Reg->D14_ENDPT_INDEX = 4;//выбрана 2-ая out конечная точка D14_Cntrl_Reg->D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000; //FIFO=64bytes
D14_Cntrl_Reg->D14_ENDPT_INDEX = 5;////выбрана 2-ая in конечная точка D14_Cntrl_Reg->D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000;//FIFO=64bytes
D14_Cntrl_Reg->D14_ENDPT_INDEX = 4;// D14_Cntrl_Reg->D14_ENDPT_TYPE.VALUE = 0x0600; // Bulk, Double buffering
D14_Cntrl_Reg->D14_ENDPT_INDEX = 5;// D14_Cntrl_Reg->D14_ENDPT_TYPE.VALUE = 0x0600; // Bulk, Double buffering
D14_Cntrl_Reg->D14_ENDPT_INDEX = 4;// D14_Cntrl_Reg->D14_ENDPT_TYPE.VALUE |= 0x0800; //enable FIFO
D14_Cntrl_Reg->D14_ENDPT_INDEX = 5;// D14_Cntrl_Reg->D14_ENDPT_TYPE.VALUE |= 0x0800; //enable FIFO
потом D14_Cntrl_Reg->D14_ADDRESS.VALUE = 0x80;// logic 1 enables the device.
После прочтения дескриптора комп дает команду set configuration, после которого можно передавать и принимать с конечных точек, если они конечно разрешены. Вот у меня не получается, хотя в 0-ю конечную точку получается передавать и получать из нее данные.
Подскажите кто-нибудь пожалуйста, после передачи дескриптора что нужно сделать, чтобы конечные точки были доступны?
|
|
|
|
|
Jan 24 2006, 10:51
|
Группа: Новичок
Сообщений: 6
Регистрация: 12-01-06
Пользователь №: 13 089

|
Вроде все так. Странно. Может дело в том, что ты это делаешь не тогда, когда нужно.
Установку адреса (фактически разрешение работы) я делаю когда приходит SET_ADDRESS device request. Программирование параметров (установка типа конечной точки и ее разрешение) - когда приходит запрос SET_CONFIGURATION device request.
Небольшая рекомендация. В качестве исходного материала я использовал исходники firmware для процессора Cygnal 8051F320. Исходники на С, все неплохо структурировано. Рекомендую. Исходники доступны в качестве AppNotes, www.cygnal.com
|
|
|
|
|
Jan 25 2006, 06:52
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 12-05-05
Пользователь №: 4 940

|
В данный момент заработало, а ошибка была в том, что у меня было вот так: D14_Cntrl_Reg->D14_ENDPT_MAXPKTSIZE.VALUE = 0x4000; , а надо было D14_Cntrl_Reg->D14_ENDPT_MAXPKTSIZE.VALUE = 0x0040; т.е. поменять старший/младший байт местами
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|