/* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (u32)RESET)
{
/* Return ERROR: OWN bit set */
return ETH_ERROR;
}
当该描述符归CPU所有,修改描述符的值
/* Setting the Frame Length: bits[12:0] */
DMATxDescToSet->ControlBufferSize = (len & ETH_DMATxDesc_TBS1);
设置发送缓冲区1的大小,如下图:
memcpy((uint8_t *)DMATxDescToSet->Buffer1Addr, buff, len);
将buff的数据放到发送缓冲区1地址,如下图
/* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */
DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS;
配置表示该描述符指示的缓冲区包含帧的开头和结束部分
/* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */
DMATxDescToSet->Status |= ETH_DMATxDesc_OWN;
配置该描述符归DMA所有,禁止CPU修改
/* Clear TBUS ETHERNET DMA flag */
ETH->DMASR = ETH_DMASR_TBUS;
/* Resume DMA transmission*/
ETH->DMATPDR = 0;
暂停发送流程之后重启发送流程
/* Update the ETHERNET DMA global Tx descriptor with next Tx descriptor */
/* Chained Mode */
/* Selects the next DMA Tx descriptor list for next buffer to send */
DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr);
为要发送的下一个缓冲区选择下一个DMA Tx描述符列表
以上就是整个MAC_RAW例程发送与接收的具体讲解介绍。下面将在该例程的基础上进行发送与接收的测试。
发送测试:基于MAC_RAM例程进行修改,由于测试最大速度,将例程中打印等相关函数去掉。如main函数中while循环中的if判断以及打印去掉。此外,WCHNET_MainTask函数中包含接收部分,将接收也去掉,如下图:
上图红框部分程序注释掉以后,编译下载到开发板,测试速度如下:
发送速度最大能达到900M左右。
以太网帧长度最大是1518字节,目前例程配置ARP包最大长度为490个字节,加上CRC4个字节即494字节。为测试最大速度,将ARP设置为最大,再增加1518-494=1024字节。ARP包配置为最大之后,测试发送速度最大为970Mbps左右,如下图:
若要验证发送的数据是否正确,可以通过Wireshark查看发送的数据,如下图:
接收测试:同样基于MAC_RAM例程进行修改,注释掉程序中发送部分以及打印部分,如下图:
利用两个开发板进行MAC层的收发测试,在接收中断中接收1000M的数据进行一次GPIO翻转,测试GPIO翻转一次的时间为1.072s.
通过该时间,测得接收速度为1000/1.072约等于932.8Mbps。
结果总结:发送速度:970Mbps
接收速度:933Mbps