引言
随着信息技术的快速发展,网络技术的应用越来越广泛。以太网接口是以太网中各节点的通信基础,处于TCP/IP协议栈的数据链路层,是信息传递和管理的重要环节[1]。对于单片机来说,由于内部资源有限,既要完成主控任务,又要实现TCP/IP协议栈,难度较大,经综合考虑采用意法半导体公司生产的STM32F103作为控制核心[2]。韩国WIZnet公司生产的W5300芯片内部集成了以太网协议,可以简化软件设计,减少调试时间,从而缩短开发周期;同时,能够简化系统布局,有利于系统升级。
1 芯片介绍
1.1 STM32F103芯片
STM32F103是基于ARM CortexM3核的32位处理器芯片。其最高工作频率为72 MHz;内置高速存储器(512 KB Flash、64 KB RAM);丰富的增强I/O端口和外设资源,包括5路USART、2个12通道DMA控制器、3路SPI以及12位的ADC、DAC、FSMC、SDIO、USB、CAN、I2C等;具有标准和先进的通信接口;提供可编程电压检测器(PVD),保证整个系统的稳定工作,提高抗干扰能力;温度传感器直接与内部ADC相连,能够对器件周围环境的温度进行监测;工作温度为-40~85 ℃[3],能够满足设计的要求。
1.2 W5300芯片
W5300是一款高性能以太网芯片,采用0.18 μm CMOS工艺,内部集成10/100M以太网控制器,MAC和TCP/IP协议栈。它支持固件TCP/IP协议TCP、UDP、ICMP、IPv4、ARP、IGMP、PPPoE、Ethernet;8个独立端口同时工作;高速网络数据传输,速度可达到50 Mbps;支持混合网络TCP/IP协议栈(软件/硬件TCP/IP协议栈);支持存储器到存储器的DMA功能(只有16位数据总线宽度才支持,从模式);内嵌10BaseT/100BaseTX的以太网物理层;自动握手功能(全双工,半双工);自动MDI/MDIX(信号线极性交叉);LED网络指示;第三方物理(PHY)接口;支持8/16位数据总线;支持2种主机接口模式(直接访问模式和间接访问模式)等[45]。
2 系统硬件组成
系统硬件结构框图如图1所示。该系统包括以下几个模块:
① 电源模块,为系统工作提供稳定的电源;
② 晶振模块,为系统提供时钟;
③ 复位模块,复位MCU;
④ RS232接口模块,输出调试信息及部分网络信息的设置;
⑤ I2C存储模块,用于大量信息的存储;
⑥ JTAG接口模块,下载程序;
⑦ W5 300模块,实现以太网功能;
⑧ RJ45接口模块,以太网接口。
图1 系统硬件结构框图
图2 W5300与STM32F103的接口电路
STM32F103与W5300的接口电路如图2所示。W5300的数据线DATA0~DATA15与STM32F103的D0~D15相连;W5300的地址线ADDR0~ADDR15与STM32F103的A0~A15相连;STM32F103的片选信号/CS与W5300的FSMC_NE4相连,使W5300映射到主机的地址范围为0x6C000000~0x6C0003FF;STM32F103的读使能信号/RD与W5300的FSMC_NOE相连;STM32F103的写使能信号/WR与W5300的FSMC_NWE相连;因为STM32F103需要供电电压3.0 V以上才能够正常工作,所以要求复位时间较长,采用软件对其进行硬件复位,以保证正确复位。系统采用内部PHY模式,相应的TEST_MODE[3:0]引脚均拉低;采用16位数据总线传输,相应的BIT16EN引脚要接高电平;采用直接访问模式。
3 系统软件实现
3.1 开发环境IAR和仿真器JLink简介
IAR EWARM(IAR Embedded Workbench for ARM)是一个针对ARM处理器的集成开发环境,它包含项目管理器、编辑器、C/C++编译器和ARM汇编器、连接器XLINK和支持 RTOS的调试工具CSPY。在EWARM环境下,可以使用 C/C++和汇编语言方便地开发嵌入式应用程序。较其他的ARM开发环境而言,IAR EWARM具有入门容易、使用方便和代码紧凑等特点[67]。
JLink是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器。配合IAR EWARM、ADS、Keil、WinARM、RealView等集成开发环境,即可支持所有ARM7/ARM9内核芯片的仿真,仿真通过RDI接口和各集成开发环境进行无缝连接。它具有操作方便、连接方便、简单易学的特点,是ARM处理器最实用的开发工具。
3.2 主程序
W5300的Socket就可以配置为TCP、UDP、IPRAW、MACRAW模式进行数据的发送或接收。基于一般工程的应用模式,下面只讨论TCP和UDP的通信流程。由于W5300固化了TCP/IP协议栈,只需创建Socket接口即可实现网络通信,大大简化了软件设计流程。其主程序如下:
int main(void){
Stm32_init();/*STM32初始化*/
W5300_init();/*初始化W5300*/
while(1){
loopback_tcp_sever(0,8000,data_buf,0); /*TCP服务器回调函数*/
loopback_tcp_sever(1,8001,data_buf,0);
loopback_tcp_sever(2,8002,data_buf,0);
loopback_tcp_sever(3,8003,data_buf,0);
loopback_tcp_sever(4,8004,data_buf,0);
loopback_tcp_sever(5,8005,data_buf,0);
loopback_tcp_client(6,serverip, 8006,data_buf,0); /*TCP客户端回调函数*/
loopback_udp(7,1025,source_data,0,0); /*UDP回调函数*/
}
}
STM32F103初始化程序如下:
void Stm32_init(void){
RCC_Configuration();/*配置系统时钟*/
IWDG_Configuration();/*配置看门狗定时器*/
GPIO_Configuration();/*配置I/O引脚*/
USART_Configuration();/*配置串口参数*/
I2C_Configuration();/*配置I2C参数*/
FSMC_SRAM4_Configuration (); /*配置FSMC*/
}
W5300初始化程序如下:
void W5300_init(void){
Reset_h5300();/*硬件复位W5300*/
Reset_r5300();/*软件复位W5300*/
Set_SHAR(mac);/*设置本机硬件地址*/
Set_GAR(gw);/*设置本机网关地址*/
Set_SUBR(sn);/*设置本机子网掩码*/
Set_SIPR(ip);/*设置本机IP地址*/
Buf_init(tx_mem_buf,rx_mem_buf); /*内部TX/RX存储器初始化*/
}
以UDP为例介绍Socket接口的设计。UDP是一种不可靠的、无连接的数据传输方式。它不需要建立连接就可以进行数据传输[2]。UDP通信流程如图3所示[8]。
图3 UDP通信流程
UDP回调函数程序如下:
void loopback_udp(SOCKET s, u16 port, u8* buf, u16 mode, u8 cs_flag){
u32 len=sizeof(source_data)-1; /*缓冲区的数据长度*/
u8 destip[4]={192,168,0,10};/*目的IP地址*/
u16 destport=1025;/*目的端口*/
switch(getSn_SSR(s)) { /*获取Socket状态*/
case SOCK_UDP:/*Socket处于UDP模式*/
if(cs_flag) { /*相当于UDP客户端*/
sendto(s,buf,len,destip,destport);
}
else {/*相当于UDP服务器*/
if((len=getSn_RX_RSR(s)) > 0) { /*判断是否接收到数据*/
len=recvfrom(s,buf,len,destip,&destport); /*接收数据,返回收到的数据长度*/
sendto(s,buf,len,destip,destport); /*把收到的数据发送到对端*/
}
}
break;
case SOCK_CLOSED:/*Socket端口释放*/
close(s); /*关闭该Socke端口*/
socket(s,Sn_MR_UDP,port,mode); /*创建该Socke端口*/
break;
default:
break;
}
}
4 实验与结论
UDP服务器的测试方法是:打开SocketTool,创建UDP客户端模式,设置好对方IP、对方端口、本地端口后,在数据发送窗口中输入字符串“Please send data”,点击发送数据后,在数据接收与提示窗口中将显示接收到的字符串“Hello Harbin!”。
UDP客户端的测试方法是:打开SocketTool,创建UDP服务器模式,设置好本地端口后,在数据接收与提示窗口中将显示以一定的时间间隔接收到的字符串“Hello Harbin!”。
测试结果表明,该系统运行稳定,实现了以太网的接口功能;没有操作系统的支持实现单芯片与Internet的连接,可以为嵌入式网络的开发提供硬件平台[9]。