ch32v307以太网收到的数据长度不正确

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;


}


您好,关于mac层的接收可以看一下最新例程总mac_raw的例程,里面有想要的接收函数,可以用此例程再测试一下看是否还有丢包的情况,后续有问题可以邮箱联系:kx@wch.cn

image.png


参照mac_raw例程, 处理好 IT_RBU ,数据正常了,调大RXBUFNB ,不丢包了,基本跑满10M了,谢谢。



只有登录才能回复,可以选择微信账号登录