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

 
 
> Возможно ли зафиксировать отсутствие данных в одном из банков UDP при передаче, в at91sam7s
Bulat
сообщение Nov 30 2009, 16:14
Сообщение #1


Местный
***

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



Вопрос возник из-за того, что данные в буфер UDP помещаются от 2-х разных источников прерывания (условно назовем их 1 и 2). После определенного количества прерываний необходимо передать пакет данных (55 байт) по USB. Но при этом данные продолжают идти и их необходимо записывать во второй банк. Известно, что перед записью в первый банк надо опрашивать флаг TXPKTRDY, а при записи во второй банк этот флаг не опрашивается. Прерывания 1 и 2 могут быть в любой очередности. Тут возникает проблема, как определить свободен ли банк 1, чтобы продолжать туда запись или же свободен банк 0, чтобы проверить флаг TXPKTRDY и произвести туда запись? Пропуски слов допускаеются, если банк 0 еще не готов.

Вот участок кода с обрабочиками прерываний 1 и 2:
CODE
__ramfunc void pause_timer1_irq()
{
unsigned int dummy;

//если принято 32-итное слово без ошибок
if(i_shA==32 & rcrc1!=0)
{
if(!(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
{
regUDP->UDP_FDR[AT91C_EP_IN] = 11; //командное слово
regUDP->UDP_FDR[AT91C_EP_IN] = recA&0xff;//разбиваем 32-битное слово recA по байтам
int m_stat = recA>>8;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = recA>>16;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = recA>>24;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
kA++;
}
}

//если принято 11 слов, то необходимо отправить пакет
if(kA==12)
{
regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
kA=0;
}
i_shA=0;
rcrc1=0;
dummy = PauseTimerBase1->TC_SR;
}

__ramfunc void pause_timer2_irq()
{
unsigned int dummy;

if(i_shB==32 & rcrc2!=0)
{
if(!(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
{
regUDP->UDP_FDR[AT91C_EP_IN] = 12;
regUDP->UDP_FDR[AT91C_EP_IN] = recB&0xff;
int m_stat = recB>>8;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = recB>>16;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = recB>>24;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
kB++;
}
}
if(kB==12)
{
regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
kB=0;
}

i_shB=0;
rcrc2=0;

dummy = PauseTimerBase2->TC_SR;
}


Это неправильный код, так как я фактически не использую второй банк. Как в таком случае использовать второй банк?
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:43
Рейтинг@Mail.ru


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