Цитата(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 не отдает команды процессору об успешной отправке, в то время, как он отправить данные не успел. Разбираюсь дальше...
Умные речи подобны строкам, напечатанным курсивом. К. Прутков