ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 июня
1593294 Топик полностью
SciFi (Вчера, 13:10, просмотров: 57) ответил Nikolay_Po на Да там прощще, чем IP. Это же обычный периферийный модуль на DMA. Понять только как оно работает с дескрипторами - и дело в шляпе! Я долго боялся эзернета. А как пришлось погрузиться - подумал, ну и дураком же я был! Оно аппаратно делает всё. Тебе только дескриптор составить и бит поставить. И по приёму так же - обработал прерывание, посмотрел биты, забрал данные по дескрипторам. Идеально!
Отправку можно сделать гораздо проще, чем приём. Запихиваем кадр в буфер и вперёд: 
static err_t
low_level_output(struct netif *netif, struct pbuf *p)
{
    if (!netif_is_link_up(netif))
    {
        return ERR_OK;
    }
    uint8_t buf[600];
    if (p->tot_len > sizeof buf)
    {
        return ERR_MEM;
    }
    uint32_t mask;
    do
    {
        mask = ETH->DMASR & ETH_DMASR_TPS;
    }
    while (mask != ETH_DMASR_TPS_Suspended && mask != ETH_DMASR_TPS_Stopped);
    tx_desc[0].len[1] = p->tot_len;
    tx_desc[0].ptr[1] = buf;
    uint8_t* ptr = buf;
    while (p)
    {
        memcpy(ptr, p->payload, p->len);
        ptr += p->len;
        p = p->next;
    }
    tx_desc[0].status = (1u << 31)  // OWN bit
                      | (1  << 29)  // last segment
                      | (1  << 28)  // first segment
                      | (1  << 21); // end of ring
    ETH->DMASR = ETH_DMASR_ETS; // reset ETS flag in status register
    ETH->DMATPDR = 0;           // start transmission
    while ((ETH->DMASR & ETH_DMASR_ETS) == 0)
    {
        // wait for data to be copied into Tx FIFO
    }
    return ERR_OK;
}
ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้