реклама на сайте
подробности

 
 
> Не получается работать с 2 банками при передаче на хост через UDP (at91sam7s)
Bulat
сообщение Aug 19 2010, 10:58
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Я пытаюсь использовать 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. Такие задержки допустимы?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 03:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.02021 секунд с 7
ELECTRONIX ©2004-2016