С 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 переключает банки?
Ну а если у кого есть решение проблемы, то не откажусь :-)