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

 
 
> 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
 
Start new topic
Ответов
Rst7
сообщение Oct 6 2012, 14:58
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



QUOTE
do
{
produce = LPC_EMAC->TxProduceIndex;
consume = LPC_EMAC->TxConsumeIndex;
}
while(produce != consume); //////-------------- индексы равны даже, когда пакет еще отправляется!!!!!!!!


Эээ, пардон, так вроде правильно сравнивать consume с (produce+1)%(TXDESCRIPTORNUMBER-1). Т.е. пока равны - ждать.

Типа вот у меня:
CODE
      L_SENDETH:
    if (len<60) len=60;
    {
      UREG i,j;
      j=(i=TXPRODUCEINDEX)+1;
      if (j>TXDESCRIPTORNUMBER) j=0;
      while(j==TXCONSUMEINDEX); //Ждем освобождения передатчика - хотя бы один буфер
      FreeTXbufs();
      EnetDmaTx[i].pBuffer=(EnetBuffer *)(ep->hdr.dst_mac);
      EnetDmaTx[i].EnetTxCtrl.Size = len-1;
      TXPRODUCEINDEX=j; //Стартуем посылку


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Oct 6 2012, 18:34
Сообщение #3


Знающий
****

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



Цитата(Rst7 @ Oct 6 2012, 18:58) *
Эээ, пардон, так вроде правильно сравнивать consume с (produce+1)%(TXDESCRIPTORNUMBER-1). Т.е. пока равны - ждать.

Типа вот у меня:
Код
      L_SENDETH:
    if (len<60) len=60;
    {
      UREG i,j;
      j=(i=TXPRODUCEINDEX)+1;
      if (j>TXDESCRIPTORNUMBER) j=0;
      while(j==TXCONSUMEINDEX); //Ждем освобождения передатчика - хотя бы один буфер
      FreeTXbufs();
      EnetDmaTx[i].pBuffer=(EnetBuffer *)(ep->hdr.dst_mac);
      EnetDmaTx[i].EnetTxCtrl.Size = len-1;
      TXPRODUCEINDEX=j; //Стартуем посылку

К сожалению не совсем так, PRODUCE убегающий индекс, а CONSUME - догоняющий. Инкрементом PRODUCE мы запускаем DMA, который начинает отправлять пакет. По завершению отправки этого пакета DMA инкрементирует CONSUME индекс. Т.е. DMA будет передавать пакеты до тех пор, пока индексы не равны.

Цитата
If the TxConsumeIndex equals TxProduceIndex the descriptor array is
empty and the transmit channel will stop transmitting until software produces new
descriptors.


В Вашем случае дается разрешение заполнить TXDESCRIPTORNUMBER дескрипторов, пока DMA отправляет один пакет. В моем случае я следующий покет не отправлю, пока не отправился предыдущий. Проблема осталась. Начинаю думать, что это PHY не отдает команды процессору об успешной отправке, в то время, как он отправить данные не успел. Разбираюсь дальше...


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



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

 


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


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