Процесс пошёл, пришёл пакет SETUP, флаг RXSTPI установился, далее считываю данные из UEDATX, и далее флаг RXSTPI сбрасываю.
Код
while((UEINTX & 0x08) != 0x08)
PORTC = 0x00; // Потушить диод, ожидание пакета SETUP, бит RXSTPI
PORTC |= (1<<PC6); // РС6 - зажечь диод
bmRequestType = Usb_read_byte(); // тип запроса
bmRequest = Usb_read_byte(); // код запроса
if (bmRequestType == 0x80)
PORTC |= (1<<PC6); // РС6 - зажечь диод
else PORTC = 0x00; // Потушить диод
if (bmRequest == 0x06)
PORTC |= (1<<PC6); // РС6 - зажечь диод
else PORTC = 0x00; // Потушить диод*/
UEINTX &= ~(1 << RXSTPI); // Очистка RXSTPI, для отправки ACK
Далее, должен прийти пакет IN, в ответ на который контроллер обязан выслать 8 байт дескриптора, и получить от хоста ACK.
CODE
#define Usb_write_byte(byte) (UEDATX = (unsigned char)byte)
while((UEINTX & 0x01) != 0x01) //(ВЕРНО?)
PORTC = 0x00; // Потушить диод, ожидание пакета IN, бит TXINI
PORTC |= (1<<PC6); // РС6 - зажечь диод
Usb_write_byte(0x12);
Usb_write_byte(0x01);
Usb_write_byte(0x00);
Usb_write_byte(0x02);
Usb_write_byte(0x00);
Usb_write_byte(0x00);
Usb_write_byte(0x00);
Usb_write_byte(0x08); // Запись данных в UEDATX
UEINTX &= ~(1 << TXINI); // Сброс TXINI для отправки данных хосту
Вопрос: правильно ли, то что установка бита TXINI считается приходом пакета IN? Каким образом узнать что хост прислал ACK?
Далее, хост присылает пакет OUT нулевой длинны, задача контроллера отправить пакет ACK.
Код
while((UEINTX & 0x04) != 0x04)
PORTC = 0x00; // Потушить диод, ожидание пакета OUT, бит RXOUTI
PORTC |= (1<<PC6); // РС6 - зажечь диод
UEINTX = 0x00; // Сброс регистра, для отправки ACK
Вопрос: для отправки ACK на пакет OUT достаточно очистки бита RXOUTI?
Сообщение отредактировал IgorKossak - Sep 23 2013, 11:27
Причина редактирования: Поднятие темы запрещено правилами форума!!!