DMA描述符的 RDes0 FL 帧长域 的长度 跟 DMA描述符缓冲区里面实际ip数据包不匹配。几率不是很大,现在能正常通讯的,就是会丢包。
int ETHPoll(uint8_t* pkt) {
? ? int rc = 0;
? ? //描述属于CPU
? ? if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) {
? ? ? ? if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) &&
? ? ? ? ? ?((DMARxDescToGet->Status & ETH_DMARxDesc_LS) ) &&
? ? ? ? ? ?((DMARxDescToGet->Status & ETH_DMARxDesc_FS) )) {
? ? ? ? ? ? if(DMARxDescToGet->Status & ETH_DMARxDesc_LE) {
? ? ? ? ? ? ? ? CLOG_WRN("LE\n");
? ? ? ? ? ? }
? ? ? ? ? ? if(DMARxDescToGet->Status & ETH_DMARxDesc_OE) {
? ? ? ? ? ? ? ? CLOG_WRN("OE\n");
? ? ? ? ? ? }
? ? ? ? ? ? if(DMARxDescToGet->Status & ETH_DMARxDesc_IPV4HCE) {
? ? ? ? ? ? ? ? CLOG_WRN("IPV4HCE\n");
? ? ? ? ? ? }
? ? ? ? ? ? rc = (int)((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARXDESC_FRAME_LENGTHSHIFT) - 4;
? ? ??
? ? ? ? ? ? rt_memcpy(pkt, (uint8_t*)DMARxDescToGet->Buffer1Addr, rc);
? ? ? ? }else {
? ? ? ? ? ? CLOG_WRN("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
? ? ? ? }
? ? ? ? DMARxDescToGet->Status |= ETH_DMARxDesc_OWN;
? ? ? ? if((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) {
? ? ? ? ? ? ETH->DMASR = ETH_DMASR_RBUS;
? ? ? ? ? ? ETH->DMARPDR = 0;
? ? ? ? ? ? g_rbus++;
? ? ? ? }
? ? ? ? DMARxDescToGet = (ETH_DMADESCTypeDef *)(DMARxDescToGet->Buffer2NextDescAddr);
? ? }
? ? return rc;
}