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

 
 
> LPC1778 + KSZ8041NL, Баг
Vitaliy_ARM
сообщение Oct 6 2012, 14:42
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Всем доброго времени.

Сегодня выявил следующий баг.
Цитата
DWORD EmacTxData(DWORD *Buf, DWORD Len)
{
pEMACDATA pEthData = &Data;
DWORD idx;
DWORD produce, consume;
if(Len>0)
{
do
{
produce = LPC_EMAC->TxProduceIndex;
consume = LPC_EMAC->TxConsumeIndex;
}
while(produce != consume); //////-------------- индексы равны даже, когда пакет еще отправляется!!!!!!!!
// опеределяем номер текущего дескриптора
idx = LPC_EMAC->TxProduceIndex;
pEthData->DmaTx[idx].addr = Buf;
pEthData->DmaTx[idx].ctrl = (Len-1) | 0xF4000000; //(1<<30) | (1<<31) | (1<<29) | (1<<28) | (1<<26); // прерывание включено (бит 31)
if (++idx == ENET_DMA_TXDESC_NUMB)
idx = 0;
if(idx > LPC_EMAC->TxDescriptorNumber) return (FALSE);
LPC_EMAC->TxProduceIndex = idx;
}
return(TRUE);
}


Когда запускаю эту функцию в цикле, например из 15 пакетов, то половина пакетов не отправляется, это хорошо видно при помощи WireShark. Стоит между отправкой поставить задержку в 100 мкс, то после этого все пакеты отправляются исправно. Т.е. похоже происходит "нахлест" между пакетами. Подскажите, в чем может быть дело? Ошибка процессора или PHY?


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post



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

 


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


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