ATmega32U4 и USB Энумерация

Обсуждаем контроллеры компании Atmel.
Ответить
Антон Гарибов
Родился
Сообщения: 8
Зарегистрирован: Пт авг 24, 2018 10:29:57

ATmega32U4 и USB Энумерация

Сообщение Антон Гарибов »

Здравствуйте уважаемые!

Застопорился уже четвертый день на этапе установки адреса USB ( запрос SET_ADDRESS )

Сразу после получения OUT Status пакета от хоста нулевой длины прога зависает ( т.е. не приходит запрос ), хотя следом должен быть запрос SETUP на установку адреса ( SET_ADDRESS )
Конечная нулевая точка настроена на 64 байта ( соответствует аппаратному размеру )

Код: Выделить всё

unsigned char arr[8];
unsigned char arr2[18] = { // Дескриптор устройства 
	0x12,
	0x01,
	0x10, 0x01,
	0x00,
	0x00,
	0x00,
	0x40,
	0xEB, 0x03,
	0x13, 0x20,
	0x00, 0x01,
	0x01,
	0x02,
	0x03,
	0x01
};

int main(void)
{
	Инициализация PLL, Конечной точки и Включение подтяг. резистора в режим Full Speed, Bus Reset
///--------------------------------
			while( (UEINTX & (1 << RXSTPI)) == 0)	// Ожидание первого запроса Setup GET_DESCRIPTOR
			{}

			for ( int i=0; i<=7; i++)
				arr[i] = UEDATX;
			UEINTX &= ~(1 << RXSTPI); // сброс флага - ACK ответ

			///------ DATA IN --------

			UECFG0X |= (1 << EPDIR); // Смена направления на IN
				
			while( (UEINTX & (1 << TXINI)) == 0 )	// Ожидание пакета IN от хоста
			{}
			for (unsigned int i=0; i<=17; i++)
				UEDATX = arr2[i];
			UEINTX &= ~(1 << TXINI); // Отправка 18 байт дескриптора устройства

			///------ DATA IN --------
				
			UECFG0X &= ~(1 << EPDIR); // снова напрваление OUT
				
			///----- Status OUT ---------

			while ( (UEINTX & (1 << NAKOUTI)) == 0) 
			{}
			UEINTX &= ~(1 << NAKOUTI);	// Отправка NAK на первый OUT пакет Status
				
			while( (UEINTX & (1 << RXOUTI)) == 0)
			{}
			UEINTX &= ~(1 << RXOUTI);	// Сброс флага - ACK ответ
			
			while( (UEINTX & (1 << RXSTPI)) == 0)  // Ожидание следующего запроса Setup SET_ADDRESS
			{}

			while (1)
			{}
}
вот временная диаграмма CONTROL READ запросов ( из даташита ATmega32u4 )

Пробовал и 8-байтный режим конечной точки.
И никак не придет этот запрос.
Что может мешать ? Ведь от хоста OUTы приходят

Windows 7 SP1 x64
------

С уважением, Антон.
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: ATmega32U4 и USB Энумерация

Сообщение Z_h_e »

Советую работать на прерываниях или хотя бы не виснуть в циклах.
Если хосту что-то не нравится, он повторно отправит сброс на линии USB и будет это делать до трех раз.
Я USB на avr не делал, возможно сброс от хоста переинициализирует регистры периферии камня.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Ответить

Вернуться в «AVR»