изучая код PIC demo USB заметил такую вещь
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено DSN  01 марта 2005 г. 00:27

после приема CONTROL пакета с запросом на присвоение адреса, он почему-то не сразу его присваивает, а ждет следующей посылки IN token, и проверяя флаг в предыдущей послыке, присваивает адрес.
бред... зачем так делать ? почему сразу не присваивается ?
Код после компиляции работает.

вот куски
..............
switch(SetupPkt.bRequest)
{
case SET_ADR:
ctrl_trf_session_owner = MUID_USB9;
usb_device_state = ADR_PENDING_STATE; // Update state only
/* See USBCtrlTrfInHandler() in usbctrltrf.c for the next step */
break;
...........


это USBCtrlTrfInHandler() вызывается
...........
}
else if(USTAT == EP00_IN) // EP0 IN
USBCtrlTrfInHandler();
...........

в его начале проверяется флаг и уст адрес
void USBCtrlTrfInHandler(void)
{
mUSBCheckAdrPendingState(); // Must check if in ADR_PENDING_STATE

if(ctrl_trf_state == CTRL_TRF_TX)
{
USBCtrlTrfTxService();

if(ep0Bi.Stat.DTS == 0)
ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN;
else
ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN;
}
else // CTRL_TRF_RX
USBPrepareForNextSetupTrf();

}//end USBCtrlTrfInHandler


вот и макрос с присвоением адреса:
#define mUSBCheckAdrPendingState() if(usb_device_state==ADR_PENDING_STATE) \
{ \
UADDR = SetupPkt.bDevADR._byte; \
if(UADDR > 0) \
usb_device_state=ADDRESS_STATE; \
else \
usb_device_state=DEFAULT_STATE; \
}//end if

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru