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

 
 
> AT91SAM7S128 вопрос по UDP, биты AT91C_UDP_TXPKTRDY и AT91C_UDP_TXCOMP
misyachniy
сообщение Dec 2 2009, 16:31
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



С sam7S работаю давно.
Несколько программ работают успешно.
Осуществлял обмен по USB как короткими посылками размером в endpoint так и в мегабайты длиной.

Для удобства запросы и ответы были кратными 64-ем байтам.

Сейчас нужно принимать с устройства пакетами по 224 байта.
Я данные складываю по два пакета и получаю 448 байт, что составляет 448/64=7 размеров конечной точки.

То есть передача может начатся с банка 0 или 1.
В этом наверное и причина проблемы.

Для приема ответов на команды и приема указанных данных использую одну и ту же функцию.
После многочисленных вариаций получилась такая
Код
//---------------------------------------------------------
// Отослать пакет из 64 байт
void SendPack64 (char *bufer)
{
  int TXcount;

if (pCDC.currentTXBank == 0)
{
  while (AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXPKTRDY);  //Точка зависания 2
}  
  
// пересылаем данные в буфер endpoint  
TXcount=64;  
while (TXcount--) AT91C_BASE_UDP->UDP_FDR[2] = *bufer++;


if (pCDC.currentTXBank == 1)
{
  while (!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP));  //Точка зависания 1
}

// даем команду передавать
  AT91C_BASE_UDP->UDP_CSR[2] |= AT91C_UDP_TXPKTRDY;    // передаем

//if (pCDC.currentTXBank == 1)
//{
   AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP); // обязательно сбрасываем
//}
  
//else
//{
//  if (AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP)
//   AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP);  
//}

if (pCDC.currentTXBank == 0) pCDC.currentTXBank = 1;
else pCDC.currentTXBank = 0;

}



Я могу посылать команду и получать ответ размером в конечную точку множество раз без зависаний.

Передавать пакет данных у меня получается только один раз.

Если передавать в штатном режиме две посылки команда/ответ то происходит зависание программы в "Точка зависания 1"
Если вставить 3-ю пустую посылку команда/ответ то программа останавливается в "Точка зависания 2"

Перечитал последнюю версию документации на серию "6175I–ATARM–24-Dec-08"
На 503 странице нарисованы графики и расписано как правильно работать с двумя банками.
Вроде бы все правильно делаю.

Есть только одна претензия к документации. В самом низу страницы:

Warning: TX_COMP must be cleared after TX_PKTRDY has been set.

На графике видно что после первой установки TX_PKTRDY флаг TX_COMP не взводится и естественно не сбрасывается.

Я вводил специальную переменную не сбрасивать AT91C_UDP_TXCOMP при первов вызове SendPack64(), но это не помогло.

На сколько я понял взведенный флаг TX_PKTRDY указывает, что идет пересылка данных и в endpoint нельзя писать.
Но в случае 2-х буферов можно писать анализирую флаг TX_COMP при этом UDP переключает банки.

У меня получается накладка, после записи 7-го пакета и возврата в основную программу у меня взводится TX_COMP.

Не понятно почему при обмене комманда/ответ он не влияет?
А при посылке команда/ответ/данные влияет.

Пока я могу сформулировать только такие вопросы

1)Я взвел флаг TX_PKTRDY и очистил TX_COMP, при этом у меня оба банка заняты.
После отправки обеих банков хосту, UDP 2 раза взведет флаг TX_COMP или они наложатся друг на друга, если не опросить/сбросить вовремя?

По какому принципу UDP переключает банки?

Ну а если у кого есть решение проблемы, то не откажусь :-)
Go to the top of the page
 
+Quote Post



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

 


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


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