После посылки пакета размером 64 байта не нужно ждать конца передачи, а засылать следующий. Затем ждать сигнала конца передачи и заталкивать следующий пакет. Таким образом обеспечивается непрерывность подачи данных.
То есть нужно завести переменную в которую увеличивать на 1 при заталкивании пакета и уменьшать при получении сигнала конец передачи.
При непрерывной посылке большого пакета я делал проще.
[quote] //----------------------------------------------------------------------------- void SendLongBlock (unsigned int Length) { unsigned int TXcount; BigCounter=Length;
// 1 пункт страница 447 документ 6175E-ATAARM-04-Apr-06 while (AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXPKTRDY); // Занят? // подстраховка, может флаг не сброшен if (AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP) AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP);
while (BigCounter) { // 2 пункт TXcount=64; while (TXcount--) AT91C_BASE_UDP->UDP_FDR[2] = (char)0x55; // пересылаем данные // 3 пункт
if (BigCounter!=Length) { while (!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP)); AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP); }
AT91C_BASE_UDP->UDP_CSR[2] |= AT91C_UDP_TXPKTRDY; // передаем BigCounter-=64; // 4 пункт TXcount=64; while (TXcount--) AT91C_BASE_UDP->UDP_FDR[2] = (char)0x55; // пересылаем данные // 5 пункт while (!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP)); // 6 пункт AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP); // 7 пункт AT91C_BASE_UDP->UDP_CSR[2] |= AT91C_UDP_TXPKTRDY; // передаем BigCounter-=64; } while (!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP)); AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP); } //----------------------------------------------------------------------------- [/quote]