Я пытаюсь использовать 2 банка при передачи данных на хост, но при этом прерывания от конечной точки отключены. Поэтому я в цикле опрашиваю бит TXCOMP. Переменную iby ввел, чтобы при первой записи различить банк 0 и 1 и затем уже не производить запись в FIFO UDP c проверкой бита TXPKTRDY.
CODE
while(1)
{
//Запись первого пакета в буфер FIFO с проверкой бита TXPKTRDY
if(iby==0)
{
if(!(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
{
regUDP->UDP_FDR[AT91C_EP_IN] = 11;
regUDP->UDP_FDR[AT91C_EP_IN] = rec&0xff;
unsigned int m_stat = rec>>8;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = rec>>16;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = rec>>24;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
kA++;
}//if(!(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
//Если сформирован пакет размером 12*5=60 байт, то можно отправлять
if(kA==12)
{
regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
kA=0;
iby = 1;
}
} //if(ib==0)
//Запись в банк 1 и далее по очереди без проверки бита TXPKTRDY
if(iby==1)
{
regUDP->UDP_FDR[AT91C_EP_IN] = 11;
regUDP->UDP_FDR[AT91C_EP_IN] = rec&0xff;
unsigned int m_stat = rec>>8;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = rec>>16;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = rec>>24;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
kA++;
}// if(rcrc1)
if(kA==12) {iby = 2;} //Если сформирован пакет 60 байт, то необходимо проверить TXCOMP и отправить второй банк
}//if(ib==1)
//Второй банк заполнен
if(iby == 2)
{
if(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP)
{
AT91F_disable_interrupt();
regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
regUDP->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
AT91F_enable_interrupt();
iby = 1; //возвращаемся к заполнению следующего банка без проверки бита TXCOMP
kA = 0;
}
}
}//while(1)
В документации сказано, что метод с переключающимися банками используется для изохронного типа передачи. А если у меня конечная точка работает в режиме bulk, то этот метод будет корректно работать? Дело в том, что хост считывает данные из моего девайса гораздо быстрее, чем мой девайс принимает эти данные от другого источника (200 кбит/с). Поэтому UDP успеет отправить содержимое первого банка раньше, чем заполнится второй банк, то есть возникнет ситуация, когда TXCOMP установится в 1, но я его не буду сбрасывать до тех пор, пока не заполню60-тью байтами второй банк и не перейду к условию iby=2. Такие задержки допустимы?