野火启明2L1开发板MCU:R7FA2L1AB3CFP(RA2L1)主频:48M野火启明4M2开发板MCU:R7FA4M2AD3CFP(RA4M2)主频:100M野火启明6M5开发板MCU:R7FA6M5BH3CFC(RA6M5)主频:200M野火启明6T2开发板MCU:R7FA6T2BD3CFP(RA6T2)主频:240M野火耀阳开发板MCU:RA8D1主频:480M
通信至少是两个设备的事,需要相互兼容的硬件和软件支持,我们称之为通信协议。以太网通信在结构比较复杂,国际标准组织将整个以太网通信结构制定了OSI模型,总共分层七个层,分别为应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层,每个层功能不同,通信中各司其职,整个模型包括硬件和软件定义。OSI模型是理想分层,一般的网络系统只是涉及其中几层。
TCP/IP是互联网最基本的协议,是互联网通信使用的网络协议,由网络层的IP协议和传输层的TCP协议组成。TCP/IP只有四个分层,分别为应用层、传输层、网络层以及网络访问层。虽然TCP/IP分层少了,但与OSI模型是不冲突的,它把OSI模型一些层次整合一起的,本质上可以实现相同功能。
图34_1TCP/IP混合参考模型
设计网络时,为了降低网络设计的复杂性,对组成网络的硬件、软件进行封装、分层,这些分层即构成了网络体系模型。在两个设备相同层之间的对话、通信约定,构成了层级协议。设备中使用的所有协议加起来统称协议栈。在这个网络模型中,每一层完成不同的任务,都提供接口供上一层访问。而在每层的内部,可以使用不同的方式来实现接口,因而内部的改变不会影响其它层。
在TCP/IP混合参考模型中,数据链路层又被分为LLC层(逻辑链路层)和MAC层(媒体介质访问层)。目前,对于普通的接入网络终端的设备,LLC层和MAC层是软、硬件的分界线。如PC的网卡主要负责实现参考模型中的MAC子层和物理层,在PC的软件系统中则有一套庞大程序实现了LLC层及以上的所有网络层次的协议。
由硬件实现的物理层和MAC子层在不同的网络形式有很大的区别,如以太网和WiFi,这是由物理传输方式决定的。但由软件实现的其它网络层次通常不会有太大区别,在PC上也许能实现完整的功能,一般支持所有协议,而在嵌入式领域则按需要进行裁剪。
以太网(Ethernet)是互联网技术的一种,由于它是在组网技术中占的比例最高,很多人直接把以太网理解为互联网。
以太网是指遵守IEEE802.3标准组成的局域网,由IEEE802.3标准规定的主要是位于参考模型的物理层(PHY)和数据链路层中的介质访问控制子层(MAC)。在家庭、企业和学校所组建的PC局域网形式一般也是以太网,其标志是使用水晶头网线来连接(当然还有其它形式)。IEEE还有其它局域网标准,如IEEE802.11是无线局域网,俗称WiFi。IEEE802.15是个人域网,即蓝牙技术,其中的IEEE802.15.4标准则是ZigBee技术。
现阶段,工业控制、环境监测、智能家居的嵌入式设备产生了接入互联网的需求,利用以太网技术,嵌入式设备可以非常容易地接入到现有的计算机网络中。
在物理层,由IEEE802.3标准规定了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,物理层一般是通过一个PHY芯片实现其功能的。
传输介质包括同轴电缆、双绞线(水晶头网线是一种双绞线)、光纤。根据不同的传输速度和距离要求,基于这三类介质的信号线又衍生出很多不同的种类。最常用的是“五类线”适用于100BASE-T和10BASE-T的网络,它们的网络速率分别为100Mbps和10Mbps。
为了让接收方在没有外部时钟参考的情况也能确定每一位的起始、结束和中间位置,在传输信号时不直接采用二进制编码。在10BASE-T的传输方式中采用曼彻斯特编码,在100BASE-T中则采用4B/5B编码。
图34_2曼彻斯特编码
采用曼彻斯特码在每个位周期都有电压变化,便于同步。但这样的编码方式效率太低,只有50%。
在100BASE-T采用的4B/5B编码是把待发送数据位流的每4位分为一组,以特定的5位编码来表示,这些特定的5位编码能使数据流有足够多的跳变,达到同步的目的,而且效率也从曼彻斯特编码的50%提高到了80%。
现在大多数局域网组建的时候很少采用总线型网络,大多是一个设备接入到一个独立的路由或交换机接口,组成星型网络,不会产生冲突。但为了兼容,新出的产品还是带有冲突检测机制。
MAC子层是属于数据链路层的下半部分,它主要负责与物理层进行数据交接,如是否可以发送数据,发送的数据是否正确,对数据流进行控制等。它自动对来自上层的数据包加上一些控制信号,交给物理层。接收方得到正常数据时,自动去除MAC控制信号,把该数据包交给上层。
图34_3MAC数据包格式
MAC数据包由前导字段、帧起始定界符、目标地址、源地址、数据包类型、数据域、填充域、校验和域组成。
以上是标准的MAC数据包,IEEE802.3同时还规定了扩展的MAC数据包,它是在标准的MAC数据包的SA和数据包类型之间添加4个字节的QTag前缀字段,用于获取标志的MAC帧。前2个字节固定为0x8100,用于识别QTag前缀的存在;后两个字节内容分别为3个位的用户优先级、1个位的标准格式指示符(CFI)和一个12位的VLAN标识符。
标准TCP/IP协议是用于计算机通信的一组协议,通常称为TCP/IP协议栈,通俗讲就是符合以太网通信要求的代码集合,一般要求它可以实现互联网模型中每个层对应的协议,比如应用层的HTTP、FTP、DNS、SMTP协议,传输层的TCP、UDP协议、网络层的IP、ICMP协议等等。关于TCP/IP协议详细内容推荐阅读《TCP-IP详解》和《用TCP/IP进行网际互连》理解。
Windows操作系统、UNIX类操作系统都有自己的一套方法来实现TCP/IP通信协议,它们都提供非常完整的TCP/IP协议。对于一般的嵌入式设备,受制于硬件条件没办法支持使用在Window或UNIX类操作系统的运行的TCP/IP协议栈,一般只能使用简化版本的TCP/IP协议栈,目前开源的适合嵌入式的有LwIP、FreeRTOS-Plus-TCP、uC/TCP-IP、uIP、TinyTCP等等,其中LwIP是目前在嵌入式网络领域被讨论和使用广泛的协议栈。
使用以太网接口的目的就是为了方便与其它设备互联,如果所有设备都约定使用一种互联方式,在软件上加一些层次来封装,这样不同系统、不同的设备通讯就变得相对容易了。而且只要新加入的设备也使用同一种方式,就可以直接与之前存在于网络上的其它设备通讯。这就是为什么产生了在MAC之上的其它层次的网络协议及为什么要使用协议栈的原因。又由于在各种协议栈中TCP/IP协议栈得到了最广泛使用,所有接入互联网的设备都遵守TCP/IP协议。所以,想方便地与其它设备互联通信,需要提供对TCP/IP协议的支持。
用以太网和WiFi作例子,它们的MAC子层和物理层有较大的区别,但在MAC之上的LLC层、网络层、传输层和应用层的协议,是基本相同的,这几层协议由软件实现,并对各层进行封装。根据TCP/IP协议,各层的要实现的功能如下:
实际上,在发送数据时,经过网络协议栈的每一层,都会给来自上层的数据添加上一个数据包的头,再传递给下一层。在接收方收到数据时,一层层地把所在层的数据包的头去掉,向上层递交数据,如图所示。
瑞萨RA6M5提供一个单通道以太网控制器(ETHERC),符合以太网或IEEE802.3媒体访问控制(MAC)层协议。每个ETHERC通道有一个MAC层接口通道,将MCU连接到物理层LSI(PHY-LSI),可以传输和接收符合以太网/IEEE802.3标准的帧。ETHERC连接到以太网专用DMA控制器(EDMAC),因此可以在不使用CPU的情况下传输数据。
ETHERC特性
RA6M5的ETHERC外设模块框图如下图所示。
见图中①处。
以太网总线(ETHERbus)向上连接到外部总线控制器和SRAM,向下连接到EDMAC仲裁器。
见图中②处。
EDMAC仲裁器用于在多个EDMAC通道之间进行仲裁,以确认要访问的EDMAC通道。而RA6M5只有一个ETHERC通道,因此只能访问ETHERC通道0(ETHERC0)。
见图中③处。
ETHERC0当中包含MDIO、接收电路(Receivecircuit)和发送电路(Transmitcircuit),它们都连接到了MII/RMII接口(MIIinterface)。
MII(MediaIndependentInterface)为介质独立接口。在IEEE802.3中规定的MII接口是一种用于将不同类型的PHY与相同MAC控制器相连接的通用总线。MAC控制器可以用同样的硬件接口与任何PHY进行连接。RMII(ReducedMediaIndependentInterface)为简化介质独立接口,也是标准的以太网接口之一。在数据的收发上RMII比MII接口少了一倍的信号线,所以RMII一般要求是50MHz的时钟。
MDIO(ManagementDataInput/Output)接口,即管理数据输入输出接口,也叫SMI(SerialManagementInterface)接口,即串行管理接口。MDIO或者SMI接口,是一个管理PHY的接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态。该接口包含MDC和MDIO两条信号线,MDIO属于双向数据线,而MDC是时钟线,为MDIO提供时钟。
引脚
方向
说明
ET0_TX_CLK
Input
发送时钟
作为ET0_TX_EN,ET0_ETXD[3:0],ET0_TX_ER的时序参考信号
标称速率为10Mbit/s时为2.5MHz;速率为100Mbit/s时为25MHz
ET0_RX_CLK
接收时钟
作为ET0_RX_EN,ET0_ERXD[3:0],ET0_RX_ER的时序参考信号
ET0_TX_EN
Output
发送数据有效
该信号指示ET0_ETXD[3:0]引脚上发送的数据有效
ET0_ETXD[3:0]
4位发送数据
ET0_TX_ER
发送错误
ET0_RX_DV
接收数据有效
该信号指示ET0_ERXD[3:0]引脚上接收的数据有效
ET0_ERXD[3:0]
4位接收数据
ET0_RX_ER
接收错误
由PHY驱动,向MAC控制器报告在帧某处检测到错误。
ET0_CRS
载波侦听信号
由PHY芯片负责驱动,当发送或接收介质处于非空闲状态时使能该信号
在全双工模式该信号线无效
ET0_COL
冲突检测信号
由PHY芯片负责驱动,检测到介质上存在冲突后该线被使能,
并且保持至冲突解除。在全双工模式该信号线无效
ET0_MDC
管理数据时钟(ET0_MDIO的参考时钟信号)
ET0_MDIO
I/O
管理数据输入输出(双向数据信号)
ET0_LINKSTA
PHY-LSI的连接状态
ET0_EXOUT
通用输出引脚
ET0_WOL
Wake-on-LAN信号(指示接收到一个魔术包)
REF50CK0
RMII0接口的参考时钟信号
RMII0_TXD_EN
该信号指示RMII0_TXD1和RMII0_TXD0引脚上发送的数据有效
RMII0_TXD1,RMII0_TXD0
2位发送数据
RMII0_CRS_DV
载波侦听信号/接收数据有效
该信号指示RMII0_RXD1和RMII0_RXD0引脚上接收的数据有效
在RMII接口中,CRS和RX_DV整合成了CRS_DV信号引脚
RMII0_RXD1,RMII0_RXD0
2位接收数据
RMII0_RX_ER
对比上面两张表格,可以发现当我们使用RMII接口时,会比使用MII接口时少了一些引脚。具体如下:
注解
在本章后面介绍的PHY芯片LAN8720A,它使用RMII接口连接,但是不需要使用到ET0_LINKSTA,ET0_EXOUT,ET0_WOL这三个引脚。
见图中④处。
EDMAC是以太网专用DMA控制器,就如ETHERC0表示的是ETHERC通道0一样,EDMAC0表示的是EDMAC通道0。如果在ETHERC0和EDMAC0中都使能了相应的中断,当ETHERC0触发该中断时,会先通知到EDMAC0,然后再通过EDMAC0发送一个ETHER_EINT0中断请求信号到CPU进行进一步的处理。
LAN8720A是SMSC公司(已被Microchip公司收购)设计的一个体积小、功耗低、全能型10/100Mbps的以太网物理层收发器。它是针对消费类电子和企业应用而设计的。LAN8720A总共只有24Pin,仅支持RMII接口。由LAN8720A组成的网络系统结构如图所示。
在上图中:
LAN8720A内部系统结构如图所示。
PHYAD0引脚用于配置SMI通信的LAN8720A地址,在芯片内部该引脚已经自带下拉电阻,默认认为0(即使外部悬空不接),在系统上电时会检测该引脚获取得到LAN8720A的地址为0或者1,并保存在特殊模式寄存器(R18)的PHYAD位中,该寄存器的PHYAD字段有5个位,在需要超过2个LAN8720A时可以通过软件设置不同SMI通信地址。PHYAD0是与RXER引脚共用。
MODE[2:0]引脚用于选择LAN8720A网络通信速率和工作模式,可选10Mbps或100Mbps通信速度,半双工或全双工工作模式,另外LAN8720A支持HPAuto-MDIX自动翻转功能,即可自动识别直连或交叉网线并自适应。一般将MODE引脚都设置为1,可以让LAN8720A启动自适应功能,它会自动寻找最优工作方式。MODE[0]与RXD0引脚共用、MODE[1]与RXD1引脚共用、MODE[2]与CRS_DV引脚共用。
nINT/REFCLKO引脚用于MCURMII接口中的REF50CK0信号线。
REGOFF引脚用于配置内部+1.2V电压源。LAN8720A内部需要+1.2V电压,可以通过VDDCR引脚输入+1.2V电压提供,也可以直接利用LAN8720A内部+1.2V稳压器提供。当REGOFF引脚为低电平时选择内部+1.2V稳压器。REGOFF与LED1引脚共用。
SMI支持寻址32个寄存器,LAN8720A只用到其中14个,参考下表。
表LAN8720A寄存器列表
序号
寄存器名称
分组
0
BasicControlRegister
Basic
1
BasicStatusRegister
2
PHYIdentifier1
Extended
3
PHYIdentifier2
4
Auto-NegotiationAdvertisementRegister
5
Auto-NegotiationLinkPartnerAbilityRegister
6
Auto-NegotiationExpansionRegister
17
ModeControl/StatusRegister
Vendor-specific
18
SpecialModes
26
SymbolErrorCounterRegister
27
Control/StatusIndicationRegister
29
InterruptSourceRegister
30
InterruptMaskRegister
31
PHYSpecialControl/StatusRegister
序号与SMI数据帧中的RADDR是对应的,这在编写驱动时非常重要,本文将它们标记为R0~R31。寄存器可规划为三个组:Basic、Extended和Vendor-specific。
注:本实验需要读者有一定的FreeRTOS基础知识,可以到FreeRTOS官网阅读FreeRTOS内核和FreeRTOS-Plus库的中文版入门文档。
本次实验需要用到FreeRTOS及其自带的TCP/IP网络协议栈:FreeRTOS-Plus-TCP,而前面所有章节的例程都是没有使用FreeRTOS的,因此不能直接拷贝以前的例程,需要重新新建一个带有FreeRTOS的工程。
参照本教程第5章和第6章的步骤,区别是在“RTOSSelection”下拉列表里选择RTOS时选择FreeRTOS即可。
在e2studio工作空间中新建工程,工程名为“34_Ethernet_FreeRTOS”。新建工程时要注意选择FreeRTOS。
首先在指定的路径新建文件夹:“34_Ethernet_FreeRTOS”,用于存放我们即将新建的Keil工程。打开RASC软件来新建工程,工程路径选到“34_Ethernet_FreeRTOS”文件夹下面,工程名为“EBF_RA6M5”。新建工程时要注意选择FreeRTOS。
工程新建好之后,在工程根目录的“src”文件夹下面新建源文件“ether_phy_target_lan8720.c”,该文件是LAN8720的底层驱动文件。再新建源文件和头文件:“net_user_app.c”和“net_user_app.h”。
由于调试需要,可将LED和串口的驱动文件拷贝过来:直接复制前面例程里面的“led”和“debug_uart”文件夹并粘贴到工程根目录的“src”文件夹下面。
工程文件结构如下。
34_Ethernet_FreeRTOS├─......└─src├─led│├─bsp_led.c│└─bsp_led.h├─debug_uart│├─bsp_debug_uart.c│└─bsp_debug_uart.h├─ether_phy_target_lan8720.c├─net_user_app.c├─net_user_app.h├─net_thread_entry.c└─hal_entry.c注:其中net_thread_entry.c该源文件若是不存在则会由软件自动生成,若存在,软件生成代码时该文件不会被覆盖。
按照前面的章节来配置LED的GPIO引脚和调试串口,此处不再赘述。
使用e2studio环境的用户使用printf注意需要对工程做如图所示的设置:
在FSP配置界面的BSP页面,分配主栈大小为0x1000、堆大小为0x2000,如下图所示:
根据硬件原理图,我们需要配置连接PHYLAN8720的RMII引脚,以及LAN8720复位引脚。LAN8720的复位引脚为P802,由于复位引脚是低电平有效,可直接配置为输出高电平模式即可,如下图所示。
RMII引脚配置如下图所示。
首先新建一个线程:NetThread(网络线程),该线程用于运行网络协议栈,然后向其中添加:FreeRTOSHeap4和FreeRTOS+TCP。步骤如下。
在Threads区域点击“NewThread”按钮,新建得到一个默认名为“NewThread”线程。
线程名“NewThread”会在后面对线程进行配置时更改为“NetThread”。现在让我们先在这个线程下面添加:FreeRTOSHeap4和FreeRTOS+TCP。
添加FreeRTOSHeap4步骤:“NewStack”→“RTOS”→“FreeRTOSHeap4”。
添加FreeRTOS+TCP步骤:“NewStack”→“Networking”→“FreeRTOS+TCP”。
添加完成后的结果如下图所示。
接下来继续设置该线程的参数。点击“NewThread”线程,如下图所示。
上图中出现两个区域的配置属性,其中①是FreeRTOS全局的配置属性,②是“NewThread”这个线程的配置属性。
首先,按照下表的描述来配置“NewThread”线程。
属性
描述
Symbol
net_thread
Symbol是指C语言符号,此处设置为net_thread,
生成代码时会自动生成一个源文件net_thread_entry.c,
其中包含了名为net_thread_entry的线程入口函数。
Name
NetThread
线程名。由于该线程运行网络协议栈,因此线程名设置为NetThread。
Stacksize(bytes)
1024
该线程栈大小设置为1024。
Priority
该线程的运行优先级设置为1。
ThreadContext
NULL
线程上下文参数指针设置为NULL。
MemoryAllocation
Static
线程的内存分配方式设置为Static。
AllocateSecureContext
Enable
分配安全上下文。
FreeRTOS全局的配置如下:
General>CustomFreeRTOSConfig.h
为自定义FreeRTOSConfig.h文件添加路径。
它可用于覆盖此处定义的部分或全部配置,并定义其他配置。
没有自定义文件FreeRTOSConfig.h的话留空即可。
General>UsePreemption
Enabled
General>UsePortOptimisedTaskSelection
Disabled
启用端口优化任务选择。
General>UseTicklessIdle
General>CpuClockHz
SystemCoreClock
CPU时钟频率。
General>TickRateHz
100
RTOS滴答中断的频率。
General>MaxPriorities
应用程序任务可用的优先级数。任意数量的任务可以共享相同的优先级。
General>MinimalStackSize
512
空闲任务使用的堆栈的大小。单位为字,而不是字节。
General>MaxTaskNameLen
16
任务名称的最大允许长度。该长度包括NULL终止字节。
General>Use16-bitTicks
使用16位Ticks将大大提高8位和16位架构的性能,
General>IdleShouldYield
General>UseTaskNotifications
使用任务通知。
General>UseMutexes
使用互斥量。
General>UseRecursiveMutexes
使用递归互斥量。
General>UseCountingSemaphores
使用计数信号量。
General>QueueRegistrySize
10
队列注册表大小。
General>UseQueueSets
使用队列集。
General>UseTimeSlicing
General>UseNewlibReentrant
使用Newlib可重入。
General>EnableBackwardCompatibility
使能向后兼容。
General>NumThreadLocalStoragePointers
设置每个任务的线程本地存储数组中的索引数。
General>StackDepthType
uint32_t
栈深度类型。
General>MessageBufferLengthType
size_t
FreeRTOS消息缓冲区使用消息缓冲区长度类型的变量来存储每条消息的长度。
如果没有定义消息缓冲区长度类型,那么它将默认为size_t。
General>LibraryMaxSyscallInterruptPriority
Priority1
General>Assert
if(!(x)){__BKPT(0);}
General>IncludeApplicationDefinedPrivilegedFunctions
Hooks>UseIdleHook
如果希望使用空闲钩子,则将其设置为“启用”,或者“禁用”以省略空闲钩子。
Hooks>UseMallocFailedHook
Hooks>UseDaemonTaskStartupHook
Hooks>UseTickHook
Hooks>CheckForStackOverflow
Stats>UseTraceFacility
Stats>UseStatsFormattingFunctions
Stats>GenerateRunTimeStats
MemoryAllocation>SupportStaticAllocation
支持静态内存分配。
MemoryAllocation>SupportDynamicAllocation
支持动态内存分配。
MemoryAllocation>TotalHeapSize
0x8000
FreeRTOS堆中可用的RAM总量。
MemoryAllocation>ApplicationAllocatedHeap
Timers>UseTimers
使用软件定时器功能。
Timers>TimerTaskPriority
定时器任务优先级。
Timers>TimerQueueLength
定时器队列长度。
Timers>TimerTaskStackDepth
128
定时器任务栈深度。
设置分配给软件计时器服务/守护进程任务的堆栈深度。
OptionalFunctions>vTaskPrioritySet()Function
包含vTaskPrioritySet()函数。
OptionalFunctions>uxTaskPriorityGet()Function
包含uxTaskPriorityGet()函数。
OptionalFunctions>vTaskDelete()Function
包含vTaskDelete()函数。
OptionalFunctions>vTaskSuspend()Function
包含vTaskSuspend()函数。
OptionalFunctions>xResumeFromISR()Function
OptionalFunctions>vTaskDelayUntil()Function
包含vTaskDelayUntil()函数。
OptionalFunctions>vTaskDelay()Function
包含vTaskDelay()函数。
OptionalFunctions>xTaskGetSchedulerState()Function
包含xTaskGetSchedulerState()函数。
OptionalFunctions>xTaskGetCurrentTaskHandle()Function
包含xTaskGetCurrentTaskHandle()函数。
OptionalFunctions>uxTaskGetStackHighWaterMark()Function
OptionalFunctions>xTaskGetIdleTaskHandle()Function
OptionalFunctions>eTaskGetState()Function
OptionalFunctions>xEventGroupSetBitFromISR()Function
包含xEventGroupSetBitFromISR()函数。
OptionalFunctions>xTimerPendFunctionCall()Function
OptionalFunctions>xTaskAbortDelay()Function
OptionalFunctions>xTaskGetHandle()Function
OptionalFunctions>xTaskResumeFromISR()Function
包含xTaskResumeFromISR()函数。
RA>HardwareStackMonitor
Logging>PrintStringFunction
printf(x)
Logging>LoggingMaxMessageLength
192
Logging>LoggingIncludeTimeandTaskName
点击“FreeRTOS+TCP”模块,如下图所示。
FreeRTOS+TCP的属性配置如下:
Printdebugmessages
打印调试信息。
Printinfomessages
打印info信息。
ByteorderofthetargetMCU
pdFREERTOS_LITTLE_ENDIAN
IP/TCP/UDPchecksums
计算IP/TCP/UDP校验和。
ReceiveBlockTime
2000
SendBlockTime
DNScaching
DNS缓存。
DNSRequestAttempts
DNS请求尝试。
IPstacktaskpriority
configMAX_PRIORITIES-1
设置执行IP栈任务的优先级。
Stacksizeinwords(notbytes)
configMINIMAL_STACK_SIZE*10
为FreeRTOS+TCP设置栈大小,单位为字。
NetworkEventscallvApplicationIPNetworkEventHook
当网络连接或断开时,vApplicationIPNetworkEventHook会被调用。
MaxUDPsendblocktime
15000/portTICK_PERIOD_MS
UseDHCP
使用DHCP。
DHCPRegisterHostname
使用DHCP时注册主机名。
DHCPUsesUnicast
DHCP使用单播。
DHCPSendDiscoverAfterAutoIP
DHCPcallbackfunction
需提供DHCP回调函数:xApplicationDHCPHook。
Intervalbetweentransmissions
120000/portTICK_PERIOD_MS
ARPCacheEntries
ARP缓存条目。
ARPRequestRetransmissions
ARP请求重传次数。
MaximumtimebeforeARPtableentrybecomesstale
150
UsestringforIPAddress
使用字符串表示IP地址。
Totalnumberofavailablenetworkbuffers
网络数据包缓冲的总数
Setthemaximumnumberofevents
ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS+5
EnableFreeRTOS_sendto()withoutcallingBind
TTLvaluesforUDPpackets
TTLvaluesforTCPpackets
UseTCPandallitsfeatures
使用TCP及其所有特性。
LetTCPusewindowingmechanism
让TCP使用滑动窗口机制。
Maximumnumberofbytesthepayloadofanetworkframecancontain
1500
MTU大小。
BasicDNSclientorresolver
基本的DNS客户端/解析器。
ReplytoincomingICMPecho(ping)requests
应答ICMPecho(ping)请求。
FreeRTOS_SendPingRequest()isavailable
允许使用FreeRTOS_SendPingRequest()。
对应ipconfigREPLY_TO_INCOMING_PINGS宏配置。
FreeRTOS_select()(andassociated)APIfunctionisavailable
FilteroutnonEthernetIIframes.
过滤掉非以太网II格式的以太网帧。
ResponsibilityoftheEthernetinterfacetofilteroutpackets
SendRSTpackets,whenreceiveunknownpackets.
Access32-bitfieldsintheIPpackets
SizeofthepoolofTCPwindowdescriptors
240
SizeofRxbufferforTCPsockets
3000
SizeofTxbufferforTCPsockets
TCPkeep-alive
TCPkeep-aliveinterval
120
ThesocketsemaphoretounblocktheMQTTtask(USER_SEMAPHORE)
ThesocketsemaphoretounblocktheMQTTtask(WAKE_CALLBACK)
ThesocketsemaphoretounblocktheMQTTtask(USE_CALLBACKS)
ThesocketsemaphoretounblocktheMQTTtask(TX_DRIVER)
ThesocketsemaphoretounblocktheMQTTtask(RX_DRIVER)
Possibleoptimisationforexpertusers
点击“g_ether0”模块,如下图所示。
在左下角属性配置窗口进行配置,g_ether0的属性配置如下:
Common>ParameterChecking
Default(BSP)
Common>ET0_LINKSTAPinStatusFlag
Fall->Rise
设置LINKSTA状态变化。
Common>LinkSignalChangeFlag
Unused
使用LINKSTA信号检测链路状态变化。
General>Name
g_ether0
General>Channel
General>MACaddress
00:11:22:33:44:55
General>Zero-copyMode
General>Flowcontrolfunctionality
Filters>MulticastMode
Filters>PromiscuousMode
Filters>Broadcastfilter
Buffers>NumberofTXbuffer
Buffers>NumberofRXbuffer
Buffers>AllocateRXbuffer
Buffers>Buffersize
1514
Buffers>Paddingsize
自动插入到接收数据包中的填充大小。
Buffers>Paddingoffset
在接收缓冲区中插入填充字节的偏移量。
Interrupts>Interruptpriority
Priority12
选择EDMAC中断优先级。
Interrupts>Callback
vEtherISRCallback
该中断回调函数是固定的,无法变更。
点击“g_ether_phy0”模块,如下图所示。
在左下角属性配置窗口进行配置,PHY的属性配置如下:
ParameterChecking
Default
SelectPHY(DEPRECATED)
KSZ8091RNZTarget
KSZ8041Target
DP83620Target
ICS1894Target
ReferenceClock
g_ether_phy0
Channel
PHY-LSIAddress
PHY-LSIResetCompletionTimeout
0x00020000
SelectMIItype
RMII
PhyLSItype
KitComponent
MII/RMIIRegisterAccessWait-time
8
FlowControl
voidupdateDhcpResponseToUsr(void)eDHCPCallbackAnswer_txApplicationDHCPHook(eDHCPCallbackPhase_teDHCPPhase,uint32_tulIPAddress)constchar*pcApplicationHostnameHook(void)uint32_tulRand();uint32_tulApplicationGetNextSequenceNumber(uint32_tulSourceAddress,uint16_tusSourcePort,uint32_tulDestinationAddress,uint16_tusDestinationPort);uint32_tisNetworkUp(void);BaseType_tvSendPing(constchar*pcIPAddress);voidprint_ipconfig(void);voidprint_pingResult(void);voiddnsQuerryFunc(char*domain_name);限于篇幅,暂不对这些函数进行详细地讲解,读者可参考例程源代码。
在使用RTOS并新建了一个线程的情况下,hal_entry已经不再需要,并且网络线程的入口函数被设置为net_thread_entry。net_thread_entry入口函数如下所示。
运行此以太网例程需要先切换芯片DLM状态:从出厂的“CM”切换到“SSD”状态,然后重要的是要设置IDAU边界。否则,Ethernet和EDMAC将无法使用。
NOTE:OnRAMCUswithTrustZone,IDAUboundariesareprogrammedbythisprojectduetotheuseofEthernetandEDMACperipherals.Consequentially,itisnecessarytoconnecttheserialprogramminginterfacetomeetthisrequirement.
可按照以下两种方法当中的其中任意一种进行操作后,即可正常使用本实验的以太网例程:
首先编译程序,并按照上述方法设置IDAU边界,确保能正常使用Ethernet和EDMAC外设。
将程序下载到开发板后,连接串口并打开串口助手,复位板子让程序运行。
如下图所示,可以看到程序会首先打印提示信息:
当连接网线到路由器上之后,稍等片刻,可以看到正常的程序运行结果如下图所示: