Я сообщаю об ошибках, которые зафиксировал сам, а не перечень потенциальных возможностей.
Код
void eth_rst_tx_fifo (void) {
ETH->DMAOMR |= ETH_DMAOMR_FTF;
while (!!(ETH->DMAOMR & ETH_DMAOMR_FTF));
ETH->DMAOMR &= ~ETH_DMAOMR_ST;
ETH->DMAOMR |= ETH_DMAOMR_ST;
}
void ETH_IRQHandler (void) {
eth_frame_s x_cb;
uint32_t dmasr;
dmasr = ETH->DMASR;
if (ETH->DMAIER & (ETH_DMAIER_RBUIE|ETH_DMAIER_RIE)) {
/*********************/
}
if (ETH->DMAIER & ETH_DMAIER_TIE) {
/*********************/
}
if (!!(dmasr & ETH_DMASR_AIS)) {
if (eh_cb != NULL) eh_cb(dmasr); // call back if exists
eth_rst_tx_fifo();
}
ETH->DMASR &= ETH_DMASR_NIS|ETH_DMASR_AIS|ETH_DMA_INTR; // unmasked errors
ETH->DMATPDR = 0; // Resume DMA transmission
}