перед установкой адреса или после?...
если после установки адреса
Код
case SET_ADRESS:
{
AT91C_BASE_UDP -> UDP_FADDR |= TSetupPacket.ValueL & AT91C_UDP_FADD;//Присваиваем принятый адрес устройству
AT91C_BASE_UDP -> UDP_GLBSTATE = AT91C_UDP_FADDEN; //Устанавливаем бит сигнализирующий что устройство в состоянии адреса
AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_DIR; //меняем направление передачи к хосту
AT91C_BASE_UDP -> UDP_CSR[i] &= (~AT91C_UDP_RXSETUP & (~0x30));//Сброс бита RXSetup (данные из буфера прочитал)
while ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_TXPKTRDY);
AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_TXPKTRDY;
break;
}
то следует два раза прерывание SOFINT и опять сброс шины и по новой все
если перед установкой отправить нулевой пакет
Код
case SET_ADRESS:
{
AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_DIR; //меняем направление передачи к хосту
AT91C_BASE_UDP -> UDP_CSR[i] &= (~AT91C_UDP_RXSETUP & (~0x30));//Сброс бита RXSetup (данные из буфера прочитал)
while ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_TXPKTRDY);
AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_TXPKTRDY;
while ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_TXPKTRDY);
AT91C_BASE_UDP -> UDP_FADDR |= TSetupPacket.ValueL & AT91C_UDP_FADD;//Присваиваем принятый адрес устройству
AT91C_BASE_UDP -> UDP_GLBSTATE = AT91C_UDP_FADDEN; //Устанавливаем бит сигнализирующий что устройство в состоянии адреса
break;
}
то приходит подтверждение приема хост ждет примерно секунды 2 и опять заново шлет запрос дескриптора устройства
по подробнее можно описать процедуру установки адреса?
в спецификации и в даташите к девайсу пишут что нулевой пакет данных необходимо отправлять до установки адреса