Eth使用指南
基本概述
硬件特性
-
最大支持1000Mbps数据传输速率
-
支持全双工流控操作(包括IEEE 802.3x Pause packets and Priority flow control)
-
支持网络统计功能
-
支持IEEE 1588-2002/1588-2008标准定义的以太网报文时间戳
-
支持输出PPS秒脉冲信号
-
支持可编程以太网帧长度,最大支持16KB
假设和限制
-
发送和接收方向的FIFO最多各支持6个。
-
不支持传输超过所使用控制器可用缓冲区大小的数据,较长的数据必须使用Internet协议(IP)和传输控制协议(TCP)传输。
-
单个接收帧的长度(包括14字节的以太网帧头和4字节的FCS)必须小于或等于RX buffer的配置长度。
-
模块时钟频率为300M,PTP时钟周期为20ns。
代码路径
-
McalCdd/Ethernet/inc # 头文件
-
McalCdd/Ethernet/src/Eth.c # 提供对外API接口
-
McalCdd/Ethernet/src/Eth_Interrupt.c # 中断处理回调函数处理接口
-
McalCdd/Ethernet/src/Mac_Lld.c # 封装寄存器控制接口,供API接口 调用
-
Config/McalCdd/gen_s100_sip_B_mcu1/Ethernet/src/Eth_PBcfg.c # Eth预编译配置,用于提供给对外接口API初始化属性调用
-
Config/McalCdd/gen_s100_sip_B_mcu1/Ethernet/src/Mac_Ip_PBcfg.c # MAC驱动预编译配置,对Eth_PBcfg.c构成静态配置依赖
-
samples/Eth/Eth_Test/Eth_test.c # Eth功能测试示例程序
应用sample
S100以samples/Eth/Eth_Test/Eth_test.c
发送arp报文为例说明:
数据发送
Eth_test.c测试程序外发构造的arp报文,PC通过wiresharke抓包检查数据能否正常收到。其中,IP地址默认且不支持动态修改。
0xd4, 0xfd, 0x9b, 0xae, 0x48, 0xf5, //Sender MAC address: d4:fd:9b:ae:48:f5 //MCU
0xC0, 0xA8, 0x01, 0x32, //Sender IP address: 192.168.1.50
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //Target MAC address: 00:00:00:00:00:00 //PC
0xC0, 0xA8, 0x01, 0xf, //Target IP address: 192.168.1.15
- 调用伪代码
Eth_ProvideTxBuffer //分配buffer
Eth_Transmit //数据发送
Eth_TxConfirmation //释放buffer
- 测试说明
系统启动默认只完成eth初始化,数据发送步骤如下:
# 使能EthTest_Mainfunc周期性调用
setvar Eth_Test 1
# eth up
setvar eth_contrMode 1
setvar eth_testCase 3
# 发送arp报文
setvar eth_testCase 14
数据接收
在EthIf_RxIndication里把接收的报文通过串口打印出来。参考如下:
if(eth_getIngressTsFlag)
{
eth_getIngressTsFlag = FALSE;
/* QT-S01-API-60105 QT-S01-API-60106 QT-S01-API-60107 QT-S01-API-60194 */
Eth_GetIngressTimeStamp(CtrlIdx,DataPtr,&Eth_TimeQual,&Eth_TimeStamp);
//LogSync("Ingress timestamp quality: %s\r\n", (Eth_TimeQual==ETH_VALID)?"ETH_VALID":"ETH_INVALID");
//LogSync("Ingress timestamp: %ds: %dns\r\n", ((uint32)(Eth_TimeStamp.secondsHi) << 16) + Eth_TimeStamp.seconds, Eth_TimeStamp.nanoseconds);
if(Eth_TimeStamp.secondsHi!=0 || Eth_TimeStamp.nanoseconds!=0)
{
eth_checkIngressTsFlg=TRUE;
}
}
if (count % 100 == 0) {
LogSync("Eth packet is received, FrameType: %x, IsBroadcast: %s\r\n", FrameType, (IsBroadcast==TRUE)?"TRUE":"FALSE");
LogSync("DstMac: %x-%x-%x-%x-%x-%x\r\n", *(DataPtr-14),*(DataPtr-13),*(DataPtr-12),*(DataPtr-11),*(DataPtr-10),*(DataPtr-9));
LogSync("SrcMac: %x-%x-%x-%x-%x-%x\r\n", PhysAddrPtr[0],PhysAddrPtr[1],PhysAddrPtr[2],PhysAddrPtr[3],PhysAddrPtr[4],PhysAddrPtr[5]);
}
count++;
if(FrameType==0x800)
{
LogSync("IP header checksum:%x,%x\r\n",DataPtr[10],DataPtr[11]);
if(DataPtr[9]==0x11)//UDP
{
LogSync("UDP checksum:%x,%x\r\n",DataPtr[26],DataPtr[27]);
eth_checkCksFlg=TRUE;
}
else if(DataPtr[9]==0x6)//tcp
{
LogSync("TCP checksum:%x,%x\r\n",DataPtr[36],DataPtr[37]);
eth_checkCksFlg=TRUE;
}
}
注意事项
- S100默认数据传输模式是轮询。轮询模式下的数据发送需要注意申请的buffer在transmit发送之后,调用Eth_TxConfirmation释放buffer。
- Eth_Init之前需要phy解复位保证初始化成功,S100上将phy reset pin拉高实现解复位