W5100参考程序
北京万维盈创 W5100HBII 环保数据采集仪 说明书
专业、专注、专心铸就一流产品专业无线DTU/RTU生产商--------万维科技W5100HBII环保数据采集仪使用说明书北京万维盈创科技发展有限公司目录1 前言..................................................................................................................................................31.1 概述..........................................................................................................................................31.2 功能特点..................................................................................................................................31.3 技术指标..................................................................................................................................32 安装和接线说明..............................................................................................................................42.1 W5100HBII数据采集仪结构....................................................................................................42.2 接线图.......................................................................................................................................53 W5100HBII数据采集仪设置..........................................................................................................63.1 用设置软件设置................................................................................................................63.1.1 设置前准备.................................................................................................................63.1.2 修改设置参数.............................................................................................................63.2 用显示屏设置....................................................................................................................7W5100HBII数采仪测试说明4....................................................................................................104.1 本地测试........................................................................................................................104.1.1 测试前准备.............................................................................................................104.1.2 测试功能.................................................................................................................114.2 远程测试........................................................................................................................114.2.1 测试前准备.............................................................................................................114.2.2 测试功能.................................................................................................................12W5100HBII数采仪升级说明5......................................................................................................135.1.1 升级操作.................................................................................................................135.1.2 升级注意事项.........................................................................................................141 前言1.1 概述W5100系列环保专用采集仪是完全按照工业级标准设计和生产的,符合HJ/T212-2005《污染源在线自动监测(监控)系统数据传输标准》和IEC-104规约。
W5100中文数据手册
0x0426 0x0427
端口0 的接收数据大小 (S0_RX_RSR0) (S0_RX_RSR1)
0x0428 0x0429
0x042A 0x042B
端口0 的接收存储器读指针 (S0_RX_RD0) (S0_RX_RD1)
保留
0x042C~ 0x04FF
保留
谢氏电子
W5100 提供3 种接口:直接并行总线、间接并行总线和SPI 总线。W5100 与MCU 接口 非常简单,就像访问外部存储器一样。
特点:结构图
z 支持硬件化TCP/IP 协议:TCP,UDP,ICMP,IPv4 ARP,IGMP,PPPoE ,以太网
z 内嵌10BaseT/100BaseTX 以太网物理层 z 支持自动通信握手(全双工和半双工) z 支持自动MDI/MDIX,自动校正信号极性 z 支持ADSL 连接(支持PPPoE 协议中的PAP/CHAP 认证模式) z 支持4 个独立端口同时运行 z 不支持IP 的分片处理 z 内部16KB 存储器用于数据发送/接收缓存
GNDA
GNDD V18
引脚
I/O
2
P
12,18,44 P
7,74
P
15,16,33,
69
P
4,10,77 P
13,14,17, 32 43,68 P
说明
3.3V 模拟系统电源 3.3V 数字系统电源 1.8V 模拟系统电源 1.8V 数字系统电源
模拟电源地
数字电源地
11
O 1.8v 电压输出
1 时钟信号
地址
寄存器
0x0500 端口1 模式(S1_MR)
0x0501 端口1 命令(S1_CR)
0x0502 端口1 中断(S1_IR)
W5100模块手册
温馨提示本用户手册由《泥人通信模块开发平台》开发团队编写与审核,本手册仅适用于由泥人团队开发的NiRen_W5100模块。
本手册将持续更新于泥人的博客,请各位用户持续关注,同时泥人团队将努力开发出更多适合电子开发人员、在校同学们学习的通信模块。
让我们共同努力,迎接物联网时代的到来!!目录一、泥人W5100以太网模块简介 (1)二、模块排针功能表 (1)三、W5100芯片资源介绍 (2)四、电脑调试软件安装 (3)五、调试方法 (5)1、NiRen_W5100模块接线方法 (5)2、W5100客户端模式 (5)3、W5100服务端模式 (10)4、W5100UDP模式 (13)一、泥人W5100以太网模块简介NiRen_W5100模块是一款基于WIZnet W5100芯片的以太网模块,模块集成硬件化TCP/IP 协议;支持10/100Mbps 的传输速率;支持4个独立端口同时运行;同时模块还支持3.3V 或5V 电源供电,5V 供电时还可以输出3.3V 电源,方便用户在不同的单片机系统中使用;模块与单片机系统的通讯方式是简单、方便的SPI 通信。
以下是NiRen_W5100以太网模块的简单介绍:二、模块排针功能表排针标识功能说明排针标识功能说明3.3V 3.3V 电源输入引脚5V 5V 电源输入引脚MISO SPI 主机输入从机输出引脚GND 电源地引脚MOSI SPI 主机输出从机输入引脚RST W5200硬件初始化引脚(低电平有效)SCS SPI SLAVE 选择引脚(低电平有效)INT W5200中断引脚(低电平有效)SCLKSPI 时钟引脚NC保留、悬空1117_3.3V 电源稳压芯片10uF/16V电源滤波钽电容带网络变压器、带通讯指示LED 的RJ45型网口25MHz 的无源晶体振荡器泥人电子LOGOLED 电源指示灯W5100以太网芯片模拟电源滤高频干扰电感5V/3.3V 电源、SPI 通信片选、时钟、数据输入、数据输出、中断输出、复位输入排针预留两个安装孔,供以后用三、W5100芯片资源介绍W5100是一种款多功能的单片网络接口芯片,内部集成有10/100以太网控制器,主要应用于高集成、高稳定、高性能和低成本的嵌入式系统中。
Arduino以太网模块W5100测试
Arduino W5100 测试1.将你的W5100扩展板插在Arduino板上,确保所有的引脚接触良好。
尺寸: 长-69MM 宽-53.6MM2.下载测试程序。
arduino w5100 测试程序代码:/************************************************/#include <SPI.h>/** Web Server** A simple web server that shows the value of the analog input pins. */#include <Ethernet.h>byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };byte ip[] = { 192, 168, 0, 15 };EthernetServer server(80);void setup(){Ethernet.begin(mac, ip);server.begin();}void loop(){EthernetClient client = server.available();if (client) {// an http request ends with a blank lineboolean current_line_is_blank = true;while (client.connected()) {if (client.available()) {char c = client.read();// if we've gotten to the end of the line (received a newline// character) and the line is blank, the http request has ended, // so we can send a replyif (c == 'n' && current_line_is_blank) {// send a standard http response headerclient.println("HTTP/1.1 200 OK");client.println("Content-Type: text/html");client.println();// output the value of each analog input pinclient.print("welcome to tinyos electronics");client.println("<br />");client.print("//*************************************");client.println("<br />");client.print("");client.println("<br />");client.print("//*************************************");client.println("<br />");for (int i = 0; i < 6; i++) {client.print("analog input ");client.print(i);client.print(" is ");client.print(analogRead(i));client.println("<br />");}break;}if (c == 'n') {// we're starting a new linecurrent_line_is_blank = true;} else if (c != 'r') {// we've gotten a character on the current linecurrent_line_is_blank = false;}}}client.stop();}}/************************************************/3.用网线连接您的W5100板和PC(如果你直接连接PC和W5100你可能需要一根交叉网线)4. 设置你的电脑本地ip地址5.你将看见电脑的本地连接已连接并且W5100上以下4个LED灯会点亮。
怎样使用IO口模拟SPI时序访问W5100
怎样使用IO口模拟SPI时序访问W5100 2008-2-23 23:31:48摘自浩然电子:http:很多客户为了简化硬件设计,在对速度要求不高的情况下,常常采用SPI 总线访问W5100。
这里根据浩然电子EVB-W5100/MCS51评估板,给出一个用MCS51的I/O口模拟SPI总线访问的C程序例子。
该程序经过修改可以移植到任何单片机系统中。
/*************定义SPI的引脚端口**************/sbit SCS =P3^3;/*定义SPI的片选信号端口*/sbit SCLK =P2^3;/*定义SPI的时钟信号端口*/sbitMISO =P2^6;/*定义SPI的MISO端口*/sbit MOSI =P2^4;/*定义SPI的MOSI端口*/#define SET_SCS SCS=1;#define RESET_SCS SCS=0;#define SET_SCLK SCLK=1;#define RESET_SCLK SCLK=0;#define SET_MOSI MOSI=1;#defineRESET_MOSI MOSI=0;/***************************************************************** ***IO_Config主要是对IO口进行初始化设置根据不同的MCU添加相应的代码,实现下面注释部分的功能***************************************************************** ***/voidIO_Config (void ){/*定义SCS口为输出,初始化为高电平*/SET_SCS/*定义SCLK口为输出,初始化为低电平*/RESET_SCLK/*定义CPU的MOSI端口为输出, MISO端口为输入*/}/****************************************************************** **通过SPI总线输出一个字节***************************************************************** ***/void SPI_Out (unsigned chardat ){unsigned chari;for ( i = 0; i < 8; i++){if ( dat & 0x80 )SET_MOSIelseRESET_MOSISET_SCLK /*时钟上升*/dat <<= 1;RESET_SCLK /*时钟下降*/}}/***************************************************************** ***通过SPI向W5100写入数据输入参数:写入地址addr,写入的数据dat无返回参数***************************************************************** ***/voidWrite_W5100_SPI (unsigned intaddr,unsigned chardat ){RESET_SCS/* SPI的片选置低*//*输出的第一个字节为写命令*/SPI_Out ( 0xf0 );/*写命令*//*输出的第二个字节为地址高8位*/SPI_Out ( addr / 256 );/*地址高8位*//*输出的第三个字节为地址低8位*/SPI_Out ( addr );/*地址低8位*//*输出的第四个字节为写入的数据*/SPI_Out ( dat );SET_SCS /* SPI的片选置高*/}/****************************************************************** **通过SPI读取W5100的数据输入参数:读取地址addr,返回参数:读取的数据***************************************************************** ***/unsigned charRead_W5100_SPI (unsigned intaddr ){unsigned chari, j;RESET_SCS /* SPI的片选置低*//*输出的第一个字节为写命令*/SPI_Out ( 0x0f );/*读命令*//*输出的第二个字节为地址高8位*/SPI_Out ( addr / 256 );/*地址高8位*//*输出的第三个字节为地址低8位*/SPI_Out ( addr );/*地址低8位*//*输出一个空字节,读取一个字节的数据*/j=0;for( i = 0; i < 8; i++ ){ SET_SCLK/*时钟上升*/j <<= 1;if( MISO )j |= 0x01;RESET_SCLK /*时钟下降*/} SET_SCS/* SPI的片选置高电平*/returnj;}先调用IO_Config()函数对IO口进行初始化设置。
W5100HB系列串口现场测试小工具使用说明
W5100HB系列现场测试小工具使用
说明
一、软件说明
该软件用于模拟监测平台软件,实现以下功能:
1、接收数采仪的串口输出数据(国标212协议),便于数据的查看和导出
2、发送反控指令,实现对数采仪的反控操作
二、软件安装
双击setup.exe,进行安装
点击下一步,
选择您的安装路径,点击下一步
安装完成,点击关闭退出安装程序
三、软件使用
1、将电脑的串口与数采仪的串口(数据上报口)用串口直连线相连
2、双击桌面快捷方式,运行已经安装完毕的串口测试工具
3、软件基本设置
对串口进行设置,在串口名下拉框中选择您使用的PC机串口,将波特率设置为9600
点击打开串口,指示灯由红色变为绿色,说明PC机已经与数采仪建立连接,原始数据列表中显示数采仪的上报的原始数据,实时数据2011、分钟数据2051、小时数据2061、日数据2031会实时解析更新数采仪上报的数据。
4、数据导出功能
分钟、小时、日数据具有数据导出功能,点击导出按钮。
注意,
导出数据时应该关闭串口的情况下才能正常导出。
选择您要存储的路径和文件名,数据文件将以office Excel文本的格式存储
5、反控指令
在反控指令下拉框中,共有8条反控指令,其中取实时数据、提取现场时间、设置现场时间、提取实时间隔四条指令,选中相应指令后直接点击下发指令即可;
设置实施间隔指令应在间隔时间框中输入间隔时间,然后点击下发指令即可;
提取历史分钟数据、提取历史小时数据、提取历史日数据三条指令,在选中相应指令后,选取起始时间和结束时间,然后点击下发指
令即可。
W5100
unsigned char S0_Port[2]={0x13,0x88}; /* Socket0 Port number 5000 */
unsigned char S0_DIP[4]={192,168,2,43}; /* Socket0 Destination IP Address */
unsigned char S0_DPort[2]={0x13,0x88}; /* Socket0 Destination Port number 5000*/
unsigned char S0_State=0; /* Socket0 state recorder */
unsigned char S0_Data; /* Socket0 receive data and transmit OK */
/*设置物理地址,6字节,用于唯一标识网络设备的物理地址值
该地址值需要到IEEE申请,按照OUI的规定,前3个字节为厂商代码,后三个字节为产品序号
如果自己定义物理地址,注意第一个字节必须为偶数*/
for(i=0;i<6;i++)
Write_W5100(W5100_SHAR+i,Phy_Addr[i]); /*PHY_ADDR6字节unsigned char数组,自己定义*/
*/
#include"W5100.h" /* 定义W5100的寄存器地址、状态 */
#include"REG51.h"
typedef unsigned char SOCKET;
sbit SPI_CS= P1^0;
sbit SPI_SCK= P1^2;
sbit SPI_SO= P1^3;
w5100资料1
W5100 数据手册Version 1.1.8谢氏电子2009-03谢氏电子在线技术支持如果你有技术或产品方面的问题,请访问深圳谢氏电子网站:http://www.cise.hk电话:+86-755-88823277传真:+86-755-83343747简介W5100 是一款多功能的单片网络接口芯片,内部集成有10/100 以太网控制器,主要应用于高集成、高稳定、高性能和低成本的嵌入式系统中。
使用W5100 可以实现没有操作系统的Internet 连接。
W5100 与IEEE802.3 10BASE-T 和802.3u 100BASE-TX 兼容。
W5100 内部集成了全硬件的、且经过多年市场验证的TCP/IP 协议栈、以太网介质传输层(MAC) 和物理层(PHY)。
硬件TCP/IP 协议栈支持TCP,UDP,IPv4,ICMP,ARP,IGMP 和PPPoE,这些协议已经在很多领域经过了多年的验证。
W5100 内部还集成有16KB 存储器用于数据传输。
使用W5100 不需要考虑以太网的控制,只需要进行简单的端口(Socket)编程。
W5100 提供3 种接口:直接并行总线、间接并行总线和SPI 总线。
W5100 与MCU 接口非常简单,就像访问外部存储器一样。
特点:结构图z 支持硬件化TCP/IP 协议:TCP,UDP,ICMP,IPv4 ARP,IGMP,PPPoE ,以太网z 内嵌10BaseT/100BaseTX 以太网物理层z 支持自动通信握手(全双工和半双工)z 支持自动MDI/MDIX,自动校正信号极性z 支持ADSL 连接(支持PPPoE 协议中的PAP/CHAP 认证模式)z 支持4 个独立端口同时运行z 不支持IP 的分片处理z 内部16KB 存储器用于数据发送/接收缓存0.18µm CMOS 工艺3.3V 工作电压,I/O 口可承受5V 电压80 脚LQFP 小型封装z 环保无铅封装z 支持SPI 接口(SPI 模式0)z 多功能LED 信号输出(TX、RX、全双工/半双工、地址冲突、连接、速度等)1. 管脚定义1.1 MCU 接口信号符号 管脚 I/O 说明/RESET 59 I 复置输入,低电平有效低电平初始化或重新初始化W5100低电平持续时间不小于2µs,所有内部寄存器均置为默认状态ADDR[14~0]38,39,40,41,42,45,46,47,48,49,50,51,52,53,54I 地址总线这些引脚用来选择寄存器或存储器,地址总线内部下拉为低电平DATA[7-0] 19,20,21,22,23,24,25,26I/O 数据总线这些引脚用来读/写W5100 内部寄存或存储器谢氏电子http://www.cise.hk/CS 55 I 片选,低电平有效片选是用于MCU 访问W5100 内部寄存器或存储器,/WR 和/RD 选择数据传输方向/INT 56 O 中断输出,低电平有效当W5100 在端口(Socket)产生连接、断开、接收数据、数据发送完成以及通信超时等条件下,该引脚输出信号以指示MCU 。
W5100配置指导手册
1
Base address of W5100 Define W5100’s base address as ‘__DEF_IINCHIP_MAP_BASE__’. #define __DEF_IINCHIP_MAP_BASE__ 0x8000
If its base address is more than 0xFFFF, following parts should be changed. <Refer to /iinchip/w5100.c> static u32 SBUFBASEADDRESS[MAX_SOCK_NUM]; static u32 RBUFBASEADDRESS[MAX_SOCK_NUM]; u32 getIINCHIP_RxBASE(u8 s) u32 getIINCHIP_TxBASE(u8 s) u8 IINCHIP_WRITE(u32 addr, u8 data) u8 IINCHIP_READ(u32 addr) Interrupt service routine When you develop an application using W5100, you can use the interrupt-driven mode or polled mode. If you build F/W using the interrupt-driven mode, you should define interrupt enable/disable. <Refer to /mcu/type.h> #define IINCHIP_ISR_DISABLE() #define IINCHIP_ISR_ENABLE() (EIMSK &= ~(0x10)) (EIMSK |= 0x10)
W5100在单片机实现以太网通信中的应用
硬件接口结构框图。通过片选信号/CS 选中 (RTR)、重试次数寄存器 (RCR)、接收数据
W5100 芯片,通过直接总线模式,读 (/WR)、 缓冲区大小寄存器 (RMSR)、发送数据缓冲
图 1 W5100 功能框图
写 (/RD) 信号和数据 (DATA)、地址 (AD- 区大小寄存器 (TMSR) 以及套接字寄存器控
STC89C52 单片机 (MCU) 和 W5100 相结合的 接。由此可见,该模式下硬件电路的设计相对 制寄存器平均分为 4 部分,对 (下转 15 页)
-76-
科技论坛
时隙被浪费掉。
3.1 当多个标签进入阅读器范围的时候,阅 立连接,完成数据通信,但若此时信道状态为忙
2.4 动态帧时隙算法
读器首先发言,向所有标签发送唤醒命令,标签 碌,标签将再次进入随机延时状态。
力系统的测量监控、音视频传输、远程信息传
输等领域。
嵌入式网络控制系统,应用程序由 MCU 来执 简单,形式类似于 MCU 芯片外扩 RAM,只是
1 硬件设计
行 , 而 网 络 协 议 的 处 理 与 数 据 的 传 输 则 由 增加了中断控制线。
W5100 是韩国 WIZnet 公司生产的以太网 W5100 来实现。在进行系统设计时不必考虑
环中的帧的时隙个数 N,一个帧内的时隙的数 读器范围内),则阅读器与此标签建立连接,完 的实现[J].单片机与嵌入式系统应用,2006(5):
目 N 能随阅读区域中的标签的数目而动态改 成一次信息传送,成功传送信息后,阅读器发送 33-35.
变,或通过增加时隙数以减少帧中的冲突数目, 灭活指令,使该标签进入休眠状态;如果发生冲 [2]陈香,张思东,薛小平.防碰撞技术研究[J].应
W5100使用手册
W5100使用手册一、 板子尺寸尺寸单位毫米,插针间距2.54毫米。
二、 接线说明3V3--------------3.3伏GND-------------接地RST---------------P1_1SCS---------------P1_0SCLK-------------P1_2MISO-------------P1_3MOSI-------------P1_4以上是51单片机程序接线。
三、 模块的测试接好线后,打开提供的“TCP服务端”程序,修改网络参数设置,让模块的IP设置在你在连接的网络的范围内,程序默认的,网关是192.168.0.1,根据实际修改。
Gateway_IP数组是网关设置,Sub_Mask数组是子码掩网设置,数组Phy_Addr是模块物理地址设置,同一局域网内不能有相同的物理地址。
IP_Addr数组是模块的IP设置,S0_Port数组是端口设置,程序设置默认是5000,S0_DIP数组是目标IP地址设置,在模块工作在UDP或TCP客户端里才用到,S0_DPort数组是目标连接端口设置,在模块工作在UDP或TCP客户端才用到。
修改好上面的参数好,把程序下载到单片机,连接好线,上电后,正常状态,黄灯常亮,绿灯不规则闪烁。
模块跟电脑直接连接采用的是交叉网线,模块跟路由器或交换机,采用的是直通网线。
对于这两个网线的区别,用户自己找资料。
看到以上灯的正常闪烁后,打开WINDOWS的命令窗口,PING模块的地址,下面是连接正常的界面。
打开提供的网络调试助手工具,设置界面如下点击连接,成功后界面如下TCP服务端程序例程提供的测试程序,向模块发送数据,模块会把收到的数据返回给发送方。
程序开始处的Rx_Buffer跟Tx_Buffer数组分别表示发送跟接收到的缓冲数组,一次发送的数据不能超过数组的长度,用户根据需要自己修改。
例如发送1234567890界面如下。
W5100S数据手册V1.0.0
PHYCR1 (PHY 控制寄存器 1) ...................................................... 35 SLCR (SOCKET-less 控制寄存器) ................................................... 36 SLRTR (SOCKET-less 重传超时时间寄存器) ...................................... 37 SLRCR (SOCKET-less 重传次数寄存器) ........................................... 37 SLPIPR (SOCKET-less 目标 IP 地址寄存器) ........................................ 37 SLPHAR (SOCKET-less 目标 MAC 地址寄存器) ................................... 37 PINGSEQR (PING 序列号寄存器) ................................................... 38 PINGIDR (PING ID 寄存器) .......................................................... 38 SLIMR (SOCKET-less 中断屏蔽寄存器) ............................................ 38 SLIR (SOCKET-less 中断寄存器) .................................................... 39 CLKLCKR (时钟锁定寄存器) ......................................................... 39 NETLCKR (网络锁定寄存器)......................................................... 40 PHYLCKR (PHY 锁定寄存器 ) ....................................................... 40 VERR (芯片版本寄存器) ............................................................. 40 TCNTR (Ticker 计数器寄存器) ..................................................... 40 TCNTCLR (Ticker 计数器清除寄存器) ............................................ 40 Sn_MR (SOCKET n 模式寄存器) .................................................... 41 Sn_CR (SOCKET n 控制寄存器) .................................................... 42 Sn_IR (SOCKET n 中断寄存器) ..................................................... 44 Sn_SR (SOCKET n 状态寄存器) ..................................................... 44 Sn_PORTR (SOCKET n 源端口寄存器)............................................. 46 Sn_DHAR (SOCKET n 目标 MAC 地址寄存器) ..................................... 47 Sn_DIPR (SOCKET n 目标 IP 地址寄存器) ......................................... 47 Sn_DPORTR (SOCKET n 目标端口寄存器) ........................................ 48 Sn_MSS (SOCKET n 最大分段寄存器) ............................................. 48 Sn_PROTOR (SOCKET n IP 协议寄存器) .......................................... 48 Sn_TOS (SOCKET n IP 服务类型寄存器) .......................................... 49 Sn_TTL (SOCKET n IP 生存时间寄存器) .......................................... 49 Sn_RXBUF_SIZE (SOCKET n 接收缓存大小寄存器) .............................. 49 Sn_TXBUF_SIZE (SOCKET n 发送缓存大小寄存器) .............................. 49 Sn_TX_FSR (SOCKET n 空闲发送缓存寄存器) ................................... 50 Sn_TX_RD (SOCKET n 发送读指针寄存器) ........................................ 50 Sn_TX_WR (SOCKET n 发送写指针寄存器) ....................................... 50 Sn_RX_RSR (SOCKET n 接收大小寄存器) ......................................... 51 Sn_RX_RD (SOCKET n 接收读指针寄存器) ....................................... 51 Sn_RX_WR (SOCKET n 接收写指针寄存器) ....................................... 51 Sn_IMR (SOCKET n 中断屏蔽寄存器) .............................................. 52 Sn_FRAGR (SOCKET n IP 包头片段偏移寄存器) .................................. 52
基于spi总线和w5100的医疗仪器网络接口设计
蛐畔工程翟_艄.27(3):20h204JournalofBiomedicalResearchEngiI螂inE‘””‘’基于SPI总线和W5100的医疗仪器网络接口设计*刘关德,余学飞△(南方医科大学生物医学工程学院,广州510515)摘要:介绍了一种基于SPI总线和W5100的医疗仪器网络接口的设计方法。
网络接口由PIC单片机、W5100网络芯片和RJ一45组成。
W5100通过RJ一45接口PC机、局域网或Intemet;单片机通过SPI总线获取W5100的网络信息,并实现与医疗仪器的信息交换与控制。
实验结果表明:基于SPI总线弄口W5100的医疗仪器网络接口的硬件结构简单、性能稳定、兼容性强。
关键词:PIC单片机;W5100;SPI通信;OSI模型;TCP/IP协议栈中图分类号:R318文献标识码:A文章编号:1672.6278(2008)03舵01.04DesignofMedicalInstrumentationNetworkInterfacebasedonSPIBUSandW51OOLIUGuande.YUXuefei(&hodq-B/omed/ca/Eng/nar/ng,So.amnMed/ca/u池,=/ty,臼叨咖M510515,Omla)朋—瑚d:Toi砷舭amedicalinsUllnenl施onnetworkinterfacebasedOnSerialPe响删Interface(SPI)busandW5100.1henetworkinterface1’8∞唧呻。
dofPICmicrocom如llerunit(MCU),W5100network—chipandIU一45。
WSl00inteffaeesw懈1日lcomputer(Pc),L0calAreaNetwork(L悄)OrIraemetbyllJ一45,Wl'lileMGUgetsnetwarkinfonmfionfromW5100研SPIbIIBandaehiev璐informationexchangeandcontrolwithmedicaliTI曲mm即I妇岫.Tl艳resultsofexperimentindicatethatthis矗舄j炉hasthesimplicityofll毒哦I眦—nxmⅡe.highstabilityofdataconmaunicatimandf'mncompatibility.K眄WOi庙"-HCMCU;W5100;SPIcommunication;0sImodel;TCP/IPsuite1引言进入21世纪,医疗仪器逐渐进入数字网络化时代。
W5100硬件设计指导手册
W5100 Layout Guide1. GoalMake a low noise and stable environment for W5100 working.Reduce the possibility of EMI, EMC.Make a better circuit for W5100 by simplifying the signal trace.Figure 1Block A and B may be better placed as close to magnetic as possible. Let the trace between W5100 and magnetic as short as possible, and keep the Tx+/-(So as Rx+/-) signal traces to be symmetry. The traces should not be too long and 12cm will be the maximum of path’s length. Besides, the distance between RJ-45 and magnetic should be as short as possible.Crystal shouldn’t be placed close to Input /Output ports, edge of PCB board and magnetic devices. The most important thing is that crystal should not be placed close to high-frequency devices or traces, such as MII interface signals, Tx+/-, Rx+/- and Power signals.3. Power and Ground PlaneIt is better that do not try to partition GND at all.No power and GND planes can be underneath the isolated area for the RJ-45 connector and magnetic. Also RJ-45 connector has its isolated GND (Chassis GND) to connect to RJ-45’s case.Try to keep the GND plane as large as possible.4. Trace RoutingAvoid right angle signal trace:For Tx+/−, Rx+/− traces:Avoid signal noise or loss on these traces.Tx+ & Tx- should be equal length to each other. Rx+ & Rx- should be equal length to each other.The line width and distance between Tx+/− and Rx+/− :TXOP TXONRXIPRXINLLD : Line width is as wide as possible in the range of (6mil ~ 12 mil), ex: 8mil. L : Width between differential pair should be small, ex: 4mil.W : Isolation width between TX+/- and RX+/- is as wide as possible, ex: 30mil.GND used as isolation is recommended.K : Isolation width between TX/RX and noisy signal/power is as wide as possible,ex: 30mil. GND used as isolation is recommended.For W & K need better isolation, ex: shielding with GND.Try to avoid via for TX+/-, RX+/- traces. Via will degrade signal quality.Try to avoid digital signals (like Clocks or MII signal traces) interfere with analog signals(like Tx+/-, Rx+/- traces) and power lines. Never running noisy digital signals in parallel with TX+/- and RX+/-.The traces of power, ground, and those need de-couple cap should be shorter and wider.For some critical signals, clock and the other high speed signal traces should be as short and wide as possible. (Surely that is compared with normal signal traces.) And it’s better having the GND plane under them, and it is even better with the GND plane around it.De-couple cap should be placed as close to IC as possible, and the traces should be short.Try to keep the distance between Tx+/- & Rx+/- differential pairs for good isolation.When these two pair of traces run together in parallel, don’t place them too close for unwanted interference. Shielding by GND planes can get a better isolation to these two differential pairs.The signal trace length difference between Tx+ and Tx- (Same as Rx+ and Rx-) should be kept as small as possible, better within 1 inch.5. For better analog performanceBoth Analog GND pins and Digital GND pins must maintain a good GND return path.One GND plane is recommended.When using 25MHz crystal as clock source, the spec of crystal is better under 50ppm 6. ESD ProtectingFor ESD protection, we suggest to keep a distance(D) at least 80 mil for good isolation, which avoid ESD energy jumping by traces nearby IC. (See Figure 1)。
STM32F103驱动W5500网络程序
#include "W5500.h"/***************----- 网络参数变量定义-----***************/unsigned char Gateway_IP[4];//网关IP地址unsigned char Sub_Mask[4]; //子网掩码unsigned char Phy_Addr[6]; //物理地址(MAC)unsigned char IP_Addr[4]; //本机IP地址unsigned char S0_Port[2]; //端口0的端口号(5000)unsigned char S0_DIP[4]; //端口0目的IP地址unsigned char S0_DPort[2]; //端口0目的端口号(6000)unsigned char UDP_DIPR[4]; //UDP(广播)模式,目的主机IP地址unsigned char UDP_DPORT[2]; //UDP(广播)模式,目的主机端口号/***************----- 端口的运行模式-----***************/unsigned char S0_Mode =3; //端口0的运行模式,0:TCP服务器模式,1:TCP客户端模式,2:UDP(广播)模式#define TCP_SERVER 0x00 //TCP服务器模式#define TCP_CLIENT 0x01 //TCP客户端模式#define UDP_MODE 0x02 //UDP(广播)模式/***************----- 端口的运行状态-----***************/unsigned char S0_State =0; //端口0状态记录,1:端口完成初始化,2端口完成连接(可以正常传输数据)#define S_INIT 0x01 //端口完成初始化#define S_CONN 0x02 //端口完成连接,可以正常传输数据/***************----- 端口收发数据的状态-----***************/unsigned char S0_Data; //端口0接收和发送数据的状态,1:端口接收到数据,2:端口发送数据完成#define S_RECEIVE 0x01 //端口接收到一个数据包#define S_TRANSMITOK 0x02 //端口发送一个数据包完成/***************----- 端口数据缓冲区-----***************/unsigned char Rx_Buffer[2048]; //端口接收数据缓冲区unsigned char Tx_Buffer[2048]; //端口发送数据缓冲区unsigned char W5500_Interrupt; //W5500中断标志(0:无中断,1:有中断)/*外部中断4服务程序*/void EXTI4_IRQHandler(void){if(W5500_INT==0){W5500_Interrupt=1;EXTI->PR=1<<4; //清除LINE4上的中断标志位}}void SPI1_Init(void){RCC->APB2ENR|=1<<2; //PORTA时钟使能RCC->APB2ENR|=1<<12; //SPI1时钟使能RCC->APB2ENR|=1<<0;GPIOA->CRL&=0XFFF0FFFF;GPIOA->CRL|=0X00030000;//PA4通用挽推输出,输出速度50MHzGPIOA->ODR|=1<<4; //PA4上拉,设置片选引脚//这里只针对SPI口初始化GPIOA->CRL&=0X000FFFFF;GPIOA->CRL|=0XBBB00000;//PA5.6.7复用功能挽推输出,输出速度50MHzGPIOA->ODR|=0X7<<5; //PA5.6.7上拉SPI1->CR1&=~(1<<10);//全双工模式SPI1->CR1=1<<9; //外部管理NSS引脚SPI1->CR1&=~(1<<11);//8bit数据格式SPI1->CR1&=~(1<<1); //CPOL=0时空闲模式下SCK为0 CPOL=0SPI1->CR1&=~(1<<0); //数据采样从第一个时间边沿开始,CPHA=0SPI1->CR1|=1<<8;SPI1->CR1|=1<<2; //SPI主机SPI1->CR1|=0<<3; //Fsck=Fcpu/2SPI1->CR1&=~(1<<7); //MSBfirst先发送高位SPI1->CRCPR = 0X07;SPI1->CR1|=1<<6; //SPI设备使能}/****************************************************************************** ** 函数名: W5500_GPIO_Configuration* 描述: W5500 GPIO初始化配置* 输入: 无* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void W5500_GPIO_Configuration(void){RCC->APB2ENR|=1<<4; //PORTC时钟使能GPIOC->CRL&=0XFF00FFFF;GPIOC->CRL|=0X00380000;GPIOC->ODR|=3<<4; //PC4上拉,PC5输出高SPI1_Init();Ex_NVIC_Config(GPIO_C,4,FTIR); //下降沿触发MY_NVIC_Init(2,0,EXTI4_IRQChannel,2); //抢占2,子优先级0,组2}/****************************************************************************** ** 函数名: Write_W5500_1Byte* 描述: 通过SPI1向指定地址寄存器写1个字节数据* 输入: reg:16位寄存器地址,dat:待写入的数据* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_1Byte(u16 reg, u8 dat){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM1|RWB_WRITE|COMMON_R);//通过SPI1写控制字节,1个字节数据长度,写数据,选择通用寄存器SPI1_ReadWriteByte(dat);//写1个字节数据W5500_CS_High(); //置W5500的SCS为高电平}/****************************************************************************** ** 函数名: Write_W5500_2Byte* 描述: 通过SPI1向指定地址寄存器写2个字节数据* 输入: reg:16位寄存器地址,dat:16位待写入的数据(2个字节)* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_2Byte(u16 reg, u16 dat){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM2|RWB_WRITE|COMMON_R);//通过SPI1写控制字节,2个字节数据长度,写数据,选择通用寄存器SPI1_Send_Short(dat);//写16位数据W5500_CS_High(); //置W5500的SCS为高电平}/****************************************************************************** ** 函数名: Write_W5500_nByte* 描述: 通过SPI1向指定地址寄存器写n个字节数据* 输入: reg:16位寄存器地址,*dat_ptr:待写入数据缓冲区指针,size:待写入的数据长度* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_nByte(u16 reg, u8 *dat_ptr, u16 size){u16 i;W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(VDM|RWB_WRITE|COMMON_R);//通过SPI1写控制字节,N个字节数据长度,写数据,选择通用寄存器for(i=0;i<size;i++)//循环将缓冲区的size个字节数据写入W5500{SPI1_ReadWriteByte(*dat_ptr++);//写一个字节数据}W5500_CS_High(); //置W5500的SCS为高电平/****************************************************************************** ** 函数名: Write_W5500_SOCK_1Byte* 描述: 通过SPI1向指定端口寄存器写1个字节数据* 输入: s:端口号,reg:16位寄存器地址,dat:待写入的数据* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_SOCK_1Byte(SOCKET s, u16 reg, u8 dat){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM1|RWB_WRITE|(s*0x20+0x08));//通过SPI1写控制字节,1个字节数据长度,写数据,选择端口s的寄存器SPI1_ReadWriteByte(dat);//写1个字节数据W5500_CS_High(); //置W5500的SCS为高电平}/****************************************************************************** ** 函数名: Write_W5500_SOCK_2Byte* 描述: 通过SPI1向指定端口寄存器写2个字节数据* 输入: s:端口号,reg:16位寄存器地址,dat:16位待写入的数据(2个字节)* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_SOCK_2Byte(SOCKET s, u16 reg, u16 dat){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM2|RWB_WRITE|(s*0x20+0x08));//通过SPI1写控制字节,2个字节数据长度,写数据,选择端口s的寄存器SPI1_Send_Short(dat);//写16位数据W5500_CS_High(); //置W5500的SCS为高电平/****************************************************************************** ** 函数名: Write_W5500_SOCK_4Byte* 描述: 通过SPI1向指定端口寄存器写4个字节数据* 输入: s:端口号,reg:16位寄存器地址,*dat_ptr:待写入的4个字节缓冲区指针* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_W5500_SOCK_4Byte(SOCKET s, u16 reg, u8 *dat_ptr){W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址SPI1_ReadWriteByte(FDM4|RWB_WRITE|(s*0x20+0x08));//通过SPI1写控制字节,4个字节数据长度,写数据,选择端口s的寄存器SPI1_ReadWriteByte(*dat_ptr++);//写第1个字节数据SPI1_ReadWriteByte(*dat_ptr++);//写第2个字节数据SPI1_ReadWriteByte(*dat_ptr++);//写第3个字节数据SPI1_ReadWriteByte(*dat_ptr++);//写第4个字节数据W5500_CS_High(); //置W5500的SCS为高电平}/****************************************************************************** ** 函数名: Read_W5500_1Byte* 描述: 读W5500指定地址寄存器的1个字节数据* 输入: reg:16位寄存器地址* 输出: 无* 返回值: 读取到寄存器的1个字节数据* 说明: 无******************************************************************************* /u8 Read_W5500_1Byte(u16 reg){u8 i;W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址i=SPI1_ReadWriteByte(FDM1|RWB_READ|COMMON_R);//通过SPI1写控制字节,1个字节数据长度,读数据,选择通用寄存器// i=Read_W5500_1Byte(0x00);// SPI1_Send_Byte(0x00);//发送一个哑数据i=SPI1_ReadWriteByte(0x00);//读取1个字节数据W5500_CS_High();//置W5500的SCS为高电平return i;//返回读取到的寄存器数据}/****************************************************************************** ** 函数名: Read_W5500_SOCK_1Byte* 描述: 读W5500指定端口寄存器的1个字节数据* 输入: s:端口号,reg:16位寄存器地址* 输出: 无* 返回值: 读取到寄存器的1个字节数据* 说明: 无******************************************************************************* /u8 Read_W5500_SOCK_1Byte(SOCKET s, u16 reg){u8 i;W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址i=SPI1_ReadWriteByte(FDM1|RWB_READ|(s*0x20+0x08));//通过SPI1写控制字节,1个字节数据长度,读数据,选择端口s的寄存器// i=SPI_I2S_ReceiveData(SPI1);// SPI1_Send_Byte(0x00);//发送一个哑数据i=SPI1_ReadWriteByte(0X00);//读取1个字节数据W5500_CS_High();//置W5500的SCS为高电平return i;//返回读取到的寄存器数据}/****************************************************************************** ** 函数名: Read_W5500_SOCK_2Byte* 描述: 读W5500指定端口寄存器的2个字节数据* 输入: s:端口号,reg:16位寄存器地址* 输出: 无* 返回值: 读取到寄存器的2个字节数据(16位)* 说明: 无******************************************************************************* /u16 Read_W5500_SOCK_2Byte(SOCKET s, u16 reg){u16 i;W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址i=SPI1_ReadWriteByte(FDM2|RWB_READ|(s*0x20+0x08));//通过SPI1写控制字节,2个字节数据长度,读数据,选择端口s的寄存器// i=SPI_I2S_ReceiveData(SPI1);// SPI1_Send_Byte(0x00);//发送一个哑数据i=SPI1_ReadWriteByte(0x00);//读取高位数据// SPI1_Send_Byte(0x00);//发送一个哑数据i*=256;i+=SPI1_ReadWriteByte(0x00);//读取低位数据W5500_CS_High();//置W5500的SCS为高电平return i;//返回读取到的寄存器数据}/****************************************************************************** ** 函数名: Read_SOCK_Data_Buffer* 描述: 从W5500接收数据缓冲区中读取数据* 输入: s:端口号,*dat_ptr:数据保存缓冲区指针* 输出: 无* 返回值: 读取到的数据长度,rx_size个字节* 说明: 无******************************************************************************* /u16 Read_SOCK_Data_Buffer(SOCKET s, u8 *dat_ptr){u16 rx_size;u16 offset, offset1;u16 i;u8 j;rx_size=Read_W5500_SOCK_2Byte(s,Sn_RX_RSR);if(rx_size==0) return 0;//没接收到数据则返回if(rx_size>1460) rx_size=1460;offset=Read_W5500_SOCK_2Byte(s,Sn_RX_RD);offset1=offset;offset&=(S_RX_SIZE-1);//计算实际的物理地址W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(offset);//写16位地址j=SPI1_ReadWriteByte(VDM|RWB_READ|(s*0x20+0x18));//写控制字节,N个字节数据长度,读数据,选择端口s的寄存器// j=SPI_I2S_ReceiveData(SPI1);if((offset+rx_size)<S_RX_SIZE)//如果最大地址未超过W5500接收缓冲区寄存器的最大地址{for(i=0;i<rx_size;i++)//循环读取rx_size个字节数据{// SPI1_Send_Byte(0x00);//发送一个哑数据j=SPI1_ReadWriteByte(0X00);//读取1个字节数据*dat_ptr=j;//将读取到的数据保存到数据保存缓冲区dat_ptr++;//数据保存缓冲区指针地址自增1}}else//如果最大地址超过W5500接收缓冲区寄存器的最大地址{offset=S_RX_SIZE-offset;for(i=0;i<offset;i++)//循环读取出前offset个字节数据{// SPI1_Send_Byte(0x00);//发送一个哑数据j=SPI1_ReadWriteByte(0X00);//读取1个字节数据*dat_ptr=j;//将读取到的数据保存到数据保存缓冲区dat_ptr++;//数据保存缓冲区指针地址自增1}W5500_CS_High(); //置W5500的SCS为高电平W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(0x00);//写16位地址j=SPI1_ReadWriteByte(VDM|RWB_READ|(s*0x20+0x18));//写控制字节,N个字节数据长度,读数据,选择端口s的寄存器// j=SPI_I2S_ReceiveData(SPI1);for(;i<rx_size;i++)//循环读取后rx_size-offset个字节数据{// SPI1_Send_Byte(0x00);//发送一个哑数据j=SPI1_ReadWriteByte(0X00);//读取1个字节数据*dat_ptr=j;//将读取到的数据保存到数据保存缓冲区dat_ptr++;//数据保存缓冲区指针地址自增1}}W5500_CS_High(); //置W5500的SCS为高电平offset1+=rx_size;//更新实际物理地址,即下次读取接收到的数据的起始地址Write_W5500_SOCK_2Byte(s, Sn_RX_RD, offset1);Write_W5500_SOCK_1Byte(s, Sn_CR, RECV);//发送启动接收命令return rx_size;//返回接收到数据的长度}/****************************************************************************** ** 函数名: Write_SOCK_Data_Buffer* 描述: 将数据写入W5500的数据发送缓冲区* 输入: s:端口号,*dat_ptr:数据保存缓冲区指针,size:待写入数据的长度* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Write_SOCK_Data_Buffer(SOCKET s, u8 *dat_ptr, u16 size){u16 offset,offset1;u16 i;//如果是UDP模式,可以在此设置目的主机的IP和端口号if((Read_W5500_SOCK_1Byte(s,Sn_MR)&0x0f) != SOCK_UDP)//如果Socket打开失败{UDP_DIPR[0] = Flash_Tab[2]; //UDP(广播)模式,目的主机IP地址UDP_DIPR[1] = Flash_Tab[3];UDP_DIPR[2] = Flash_Tab[4];UDP_DIPR[3] = Flash_Tab[5];//UDP_DPORT[0] = Flash_Tab[8]; //UDP(广播)模式,目的主机端口号UDP_DPORT[1] = Flash_Tab[7];Write_W5500_SOCK_4Byte(s, Sn_DIPR, UDP_DIPR);//设置目的主机IPWrite_W5500_SOCK_2Byte(s, Sn_DPORTR, UDP_DPORT[0]*256+UDP_DPORT[1]);//设置目的主机端口号}offset=Read_W5500_SOCK_2Byte(s,Sn_TX_WR);offset1=offset;offset&=(S_TX_SIZE-1);//计算实际的物理地址W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(offset);//写16位地址SPI1_ReadWriteByte(VDM|RWB_WRITE|(s*0x20+0x10));//写控制字节,N个字节数据长度,写数据,选择端口s的寄存器if((offset+size)<S_TX_SIZE)//如果最大地址未超过W5500发送缓冲区寄存器的最大地址{for(i=0;i<size;i++)//循环写入size个字节数据{SPI1_ReadWriteByte(*dat_ptr++);//写入一个字节的数据}}else//如果最大地址超过W5500发送缓冲区寄存器的最大地址{offset=S_TX_SIZE-offset;for(i=0;i<offset;i++)//循环写入前offset个字节数据{SPI1_ReadWriteByte(*dat_ptr++);//写入一个字节的数据}W5500_CS_High(); //置W5500的SCS为高电平W5500_CS_Low();//置W5500的SCS为低电平SPI1_Send_Short(0x00);//写16位地址SPI1_ReadWriteByte(VDM|RWB_WRITE|(s*0x20+0x10));//写控制字节,N个字节数据长度,写数据,选择端口s的寄存器for(;i<size;i++)//循环写入size-offset个字节数据{SPI1_ReadWriteByte(*dat_ptr++);//写入一个字节的数据}}W5500_CS_High(); //置W5500的SCS为高电平offset1+=size;//更新实际物理地址,即下次写待发送数据到发送数据缓冲区的起始地址Write_W5500_SOCK_2Byte(s, Sn_TX_WR, offset1);Write_W5500_SOCK_1Byte(s, Sn_CR, SEND);//发送启动发送命令}/****************************************************************************** ** 函数名: W5500_Hardware_Reset* 描述: 硬件复位W5500* 输入: 无* 输出: 无* 返回值: 无* 说明: W5500的复位引脚保持低电平至少500us以上,才能重围W5500******************************************************************************* /void W5500_Hardware_Reset(void){W5500_RST_Low();//复位引脚拉低delay_ms(50);W5500_RST_High();//复位引脚拉高delay_ms(200);// while((Read_W5500_1Byte(PHYCFGR)&LINK)==0);//等待以太网连接完成}/****************************************************************************** ** 函数名: W5500_Init* 描述: 初始化W5500寄存器函数* 输入: 无* 输出: 无* 返回值: 无* 说明: 在使用W5500之前,先对W5500初始化******************************************************************************* /void W5500_Init(void){u8 i=0;Write_W5500_1Byte(MR, RST);//软件复位W5500,置1有效,复位后自动清0delay_ms(10);//延时10ms,自己定义该函数//设置网关(Gateway)的IP地址,Gateway_IP为4字节unsigned char数组,自己定义//使用网关可以使通信突破子网的局限,通过网关可以访问到其它子网或进入Internet Write_W5500_nByte(GAR, Gateway_IP, 4);//设置子网掩码(MASK)值,SUB_MASK为4字节unsigned char数组,自己定义//子网掩码用于子网运算Write_W5500_nByte(SUBR,Sub_Mask,4);//设置物理地址,PHY_ADDR为6字节unsigned char数组,自己定义,用于唯一标识网络设备的物理地址值//该地址值需要到IEEE申请,按照OUI的规定,前3个字节为厂商代码,后三个字节为产品序号//如果自己定义物理地址,注意第一个字节必须为偶数Write_W5500_nByte(SHAR,Phy_Addr,6);//设置本机的IP地址,IP_ADDR为4字节unsigned char数组,自己定义//注意,网关IP必须与本机IP属于同一个子网,否则本机将无法找到网关Write_W5500_nByte(SIPR,IP_Addr,4);//设置发送缓冲区和接收缓冲区的大小,参考W5500数据手册for(i=0;i<8;i++){Write_W5500_SOCK_1Byte(i,Sn_RXBUF_SIZE, 0x02);//Socket Rx memory size=2kWrite_W5500_SOCK_1Byte(i,Sn_TXBUF_SIZE, 0x02);//Socket Tx mempry size=2k }//设置重试时间,默认为2000(200ms)//每一单位数值为100微秒,初始化时值设为2000(0x07D0),等于200毫秒Write_W5500_2Byte(RTR, 0x07d0);//设置重试次数,默认为8次//如果重发的次数超过设定值,则产生超时中断(相关的端口中断寄存器中的Sn_IR 超时位(TIMEOUT)置“1”)Write_W5500_1Byte(RCR,8);//启动中断,参考W5500数据手册确定自己需要的中断类型//IMR_CONFLICT是IP地址冲突异常中断,IMR_UNREACH是UDP通信时,地址无法到达的异常中断//其它是Socket事件中断,根据需要添加Write_W5500_1Byte(IMR,IM_IR7 | IM_IR6);Write_W5500_1Byte(SIMR,S0_IMR);Write_W5500_SOCK_1Byte(0, Sn_IMR, IMR_SENDOK | IMR_TIMEOUT | IMR_RECV | IMR_DISCON | IMR_CON);}/****************************************************************************** ** 函数名: Detect_Gateway* 描述: 检查网关服务器* 输入: 无* 输出: 无* 返回值: 成功返回TRUE(0xFF),失败返回FALSE(0x00)* 说明: 无******************************************************************************* /u8 Detect_Gateway(void){u8 ip_adde[4];ip_adde[0]=IP_Addr[0]+1;ip_adde[1]=IP_Addr[1]+1;ip_adde[2]=IP_Addr[2]+1;ip_adde[3]=IP_Addr[3]+1;//检查网关及获取网关的物理地址Write_W5500_SOCK_4Byte(0,Sn_DIPR,ip_adde);//向目的地址寄存器写入与本机IP不同的IP值Write_W5500_SOCK_1Byte(0,Sn_MR,MR_TCP);//设置socket为TCP模式Write_W5500_SOCK_1Byte(0,Sn_CR,OPEN);//打开Socketdelay_ms(5);//延时5msif(Read_W5500_SOCK_1Byte(0,Sn_SR) != SOCK_INIT)//如果socket打开失败{Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//打开不成功,关闭Socketreturn FALSE;//返回FALSE(0x00)}Write_W5500_SOCK_1Byte(0,Sn_CR,CONNECT);//设置Socket为Connect模式do{u8 j=0;j=Read_W5500_SOCK_1Byte(0,Sn_IR);//读取Socket0中断标志寄存器if(j!=0)Write_W5500_SOCK_1Byte(0,Sn_IR,j);delay_ms(5);//延时5msif((j&IR_TIMEOUT) == IR_TIMEOUT){return FALSE;}else if(Read_W5500_SOCK_1Byte(0,Sn_DHAR) != 0xff){Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//关闭Socketreturn TRUE;}}while(1);}/****************************************************************************** ** 函数名: Socket_Init* 描述: 指定Socket(0~7)初始化* 输入: s:待初始化的端口* 输出: 无* 返回值: 无* 说明: 无******************************************************************************* /void Socket_Init(SOCKET s){//设置分片长度,参考W5500数据手册,该值可以不修改Write_W5500_SOCK_2Byte(0, Sn_MSSR, 1460);//最大分片字节数=1460(0x5b4)//设置指定端口switch(s){case 0://设置端口0的端口号Write_W5500_SOCK_2Byte(0, Sn_PORT, S0_Port[0]*256+S0_Port[1]);break;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;case 7:break;default:break;}}/****************************************************************************** ** 函数名: Socket_Connect* 描述: 设置指定Socket(0~7)为客户端与远程服务器连接* 输入: s:待设定的端口* 输出: 无* 返回值: 成功返回TRUE(0xFF),失败返回FALSE(0x00)* 说明: 当本机Socket工作在客户端模式时,引用该程序,与远程服务器建立连接* 如果启动连接后出现超时中断,则与服务器连接失败,需要重新调用该程序连接* 该程序每调用一次,就与服务器产生一次连接******************************************************************************* /unsigned char Socket_Connect(SOCKET s){Write_W5500_SOCK_1Byte(s,Sn_MR,MR_TCP);//设置socket为TCP模式Write_W5500_SOCK_1Byte(s,Sn_CR,OPEN);//打开Socketdelay_ms(5);//延时5msif(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_INIT)//如果socket打开失败{Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//打开不成功,关闭Socketreturn FALSE;//返回FALSE(0x00)}Write_W5500_SOCK_1Byte(s,Sn_CR,CONNECT);//设置Socket为Connect模式return TRUE;//返回TRUE,设置成功}/****************************************************************************** ** 函数名: Socket_Listen* 描述: 设置指定Socket(0~7)作为服务器等待远程主机的连接* 输入: s:待设定的端口* 输出: 无* 返回值: 成功返回TRUE(0xFF),失败返回FALSE(0x00)* 说明: 当本机Socket工作在服务器模式时,引用该程序,等等远程主机的连接* 该程序只调用一次,就使W5500设置为服务器模式******************************************************************************* /unsigned char Socket_Listen(SOCKET s){Write_W5500_SOCK_1Byte(s,Sn_MR,MR_TCP);//设置socket为TCP模式Write_W5500_SOCK_1Byte(s,Sn_CR,OPEN);//打开Socketdelay_ms(5);//延时5msif(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_INIT)//如果socket打开失败{Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//打开不成功,关闭Socketreturn FALSE;//返回FALSE(0x00)}Write_W5500_SOCK_1Byte(s,Sn_CR,LISTEN);//设置Socket为侦听模式delay_ms(5);//延时5msif(Read_W5500_SOCK_1Byte(s,Sn_SR)!=SOCK_LISTEN)//如果socket设置失败{Write_W5500_SOCK_1Byte(s,Sn_CR,CLOSE);//设置不成功,关闭Socketreturn FALSE;//返回FALSE(0x00)}return TRUE;//至此完成了Socket的打开和设置侦听工作,至于远程客户端是否与它建立连接,则需要等待Socket中断,//以判断Socket的连接是否成功。
W5100头文件
W5100头文件.txt如果我能够看到自己的影子,我想它一定很忧伤,因为我把快乐都留在了前面。
容易伤害别人和自己的人,总是对距离的边缘模糊不清的人。
#define S_RX_SIZE 2048 /*定义Socket接收缓冲区的大小,可以根据W5100_RMSR的设置修改 */ #define S_TX_SIZE 2048 /*定义Socket发送缓冲区的大小,可以根据W5100_TMSR的设置修改 *///W5100 Register definition#define COMMON_BASE 0x0000 //Base address,根据需要修改//----------------------------------------------------------------------------- // Common register//----------------------------------------------------------------------------- //Mode register, R/W, Default=0x00#define W5100_MODE COMMON_BASE#define MODE_RST 0x80 //Software reset#define MODE_MT 0x20 //Memory test#define MODE_PB 0x10 //Ping block mode#define MODE_PPPOE 0x08 //PPOE mode#define MODE_LB 0x04 //Little_endian/Big_endian ordering in indirect bus I/F#define MODE_AI 0x02 //Address auto increment in indirect bus I/F #define MODE_IND 0x01 //Indirect bus I/F mode//Gateway address register, R/W, default=0x00#define W5100_GAR COMMON_BASE+0x01//Subnet mask address, R/W, default=0x00#define W5100_SUBR COMMON_BASE+0x05//Source hardware address, R/W, default=0x00#define W5100_SHAR COMMON_BASE+0x09//Source IP address, R/W, default=0x00#define W5100_SIPR COMMON_BASE+0x0f//Interrupt and interrupt mask register#define W5100_IR COMMON_BASE+0x15 //RO, Default=0x00#define IR_CONFLICT 0x80 //IP conflict#define IR_UNREACH 0x40 //Destination unreachable#define IR_PPPOE 0x20 //PPOE close#define IR_S3_INT 0x08 //Occurrence of socket 3 socket interrupt #define IR_S2_INT 0x04 //Occurrence of socket 2 socket interrupt #define IR_S1_INT 0x02 //Occurrence of socket 1 socket interrupt #define IR_S0_INT 0x01 //Occurrence of socket 0 socket interrupt#define W5100_IMR COMMON_BASE+0x16 //R/W, Default=0x00#define IMR_CONFLICT 0x80 //IP conflict#define IMR_UNREACH 0x40 //Destination unreachable#define IMR_PPPOE 0x20 //PPOE close#define IMR_S3_INT 0x08 //Occurrence of socket 3 socket interrupt#define IMR_S2_INT 0x04 //Occurrence of socket 2 socket interrupt#define IMR_S1_INT 0x02 //Occurrence of socket 1 socket interrupt#define IMR_S0_INT 0x01 //Occurrence of socket 0 socket interrupt//Retry time value. Value 1 means 100us, R/W, default=0x07D0#define W5100_RTR COMMON_BASE+0x17//Retry count, R/W, Default=0x08#define W5100_RCR COMMON_BASE+0X19//RX memory size register, R/W, default=0x55//-------------------------------------------------------- S1 S0 Memory size// Socket3 | Socket2 | Socket1 | Socket0 | 0 0 1KB//-------------|-------------|-------------|-------------| 0 1 2KB//S1 S0 |S1 S0 |S1 S0 |S1 S0 | 1 0 4KB//-------------------------------------------------------- 1 1 8KB#define W5100_RMSR COMMON_BASE+0x1a//TX memory size register, R/W, default=0x55#define W5100_TMSR COMMON_BASE+0x1b//Authentication type in PPPOE mode, R, default=0x0000#define W5100_PATR COMMON_BASE+0x1c//PPP LCP request timer register, R/W, default=0x28//Value 1 is about 25ms#define W5100_PTIMER COMMON_BASE+0x28//PPP LCP magic number register, R/W, default=0x00#define W5100_PMAGIC COMMON_BASE+0x29//Unreachable IP address, RO, default=0x00#define W5100_UIPR COMMON_BASE+0x2a//Unreachable port register, RO, default=0x0000#define W5100_UPORT COMMON_BASE+0x2e//----------------------------------------------------------------------------- // Socket register//----------------------------------------------------------------------------- //Socket mode register, R/W, default=0x00#define W5100_S0_MR COMMON_BASE+0x0400 //Socket 0#define W5100_S1_MR COMMON_BASE+0x0500 //Socket 1#define W5100_S2_MR COMMON_BASE+0x0600 //Socket 2#define W5100_S3_MR COMMON_BASE+0x0700 //Socket 3#define S_MR_MULTI 0x80 //Multcasting#define S_MR_MC 0x20 //Multcast// P3 P2 P1 P0 Meaning#define S_MR_CLOSED 0x00 // 0 0 0 0 Closed#define S_MR_TCP 0x01 // 0 0 0 1 TCP#define S_MR_UDP 0x02 // 0 0 1 0 UDP#define S_MR_IPRAW 0x03 // 0 0 1 1 IPRAW#define S_MR_MACRAW 0x04 // 0 1 0 0 MACRAW#define S_MR_PPPOE 0x05 // 0 1 0 1 PPPOE//Socket command register, R/W, default=0x00#define W5100_S0_CR COMMON_BASE+0x0401 //Socket 0#define W5100_S1_CR COMMON_BASE+0x0501 //Socket 1#define W5100_S2_CR COMMON_BASE+0x0601 //Socket 2#define W5100_S3_CR COMMON_BASE+0x0701 //Socket 3#define S_CR_OPEN 0x01 //It is used to initialize the socket#define S_CR_LISTEN 0x02 //In TCP mode, it waits for a connection request from any remote//peer(Client)#define S_CR_CONNECT 0x04 //In TCP mode, it sends a connection request to remote peer(SERVER)#define S_CR_DISCON 0x08 //In TCP mode, it sends a connection termination request#define S_CR_CLOSE 0x10 //Used to close the socket#define S_CR_SEND 0x20 //It transmit the data as much as the increase size of write pointer#define S_CR_SEND_MAC 0x21 //In UDP mode, same as SEND#define S_CR_SEND_KEEP 0x22 //In TCP mode#define S_CR_RECV 0x40 //Receiving is processed including the value of socket RX read//pointer register/* Definition for PPPOE */#define S_CR_PCON 0x23 //Start of ADSL connection#define S_CR_PDISCON 0x24 //End of ADSL connection#define S_CR_PCR 0x25 //Send REQ message ineach phase#define S_CR_PCN 0x26 //Send NAK message in each phase#define S_CR_PCJ 0x27 //Senf REJECT message in each phase//Socket interrup register, RO, default=0x00#define W5100_S0_IR COMMON_BASE+0x0402 //Socket 0#define W5100_S1_IR COMMON_BASE+0x0502 //Socket 1#define W5100_S2_IR COMMON_BASE+0x0602 //Socket 2#define W5100_S3_IR COMMON_BASE+0x0702 //Socket 3#define S_IR_SENDOK 0x10 //Send data complete#define S_IR_TIMEOUT 0x08 //Set if timeout occurs during connection or termination//or data transmission#define S_IR_RECV 0x04 //Set if data is received#define S_IR_DISCON 0x02 //Set if receiv connection termination request #define S_IR_CON 0x01 //Set if connetion is established/* Definition for PPPOE */#define S_IR_PRECV 0x80 //Indicate receiving no support option data #define S_IR_PFAIL 0x40 //Indicate PAP Authentication fail#define S_IR_PNEXT 0x20 //Go next phase//Socket status register, RO, default=0x00#define W5100_S0_SSR COMMON_BASE+0x0403 //Socket 0#define W5100_S1_SSR COMMON_BASE+0x0503 //Socket 1#define W5100_S2_SSR COMMON_BASE+0x0603 //Socket 2#define W5100_S3_SSR COMMON_BASE+0x0703 //Socket 3#define S_SSR_CLOSED 0x00 //In case that OPEN command are given to Sn_CR, Timeout interrupt//is asserted or connection is terminated #define S_SSR_INIT 0x13 //In case that Sn_MR is set as TCP and OPEN commands are given to Sn_CR#define S_SSR_LISTEN 0x14 //In case that under the SOCK_INIT status, LISTEN commands//are given to Sn_CR#define S_SSR_ESTABLISHED 0x17 //In case that connection is established #define S_SSR_CLOSE_WAIT 0x1c //In case that connection temination request is received#define S_SSR_UDP 0x22 //In case that OPEN command is given to Sn_CR when Sn_MR is set as UDP#define S_SSR_IPRAW 0x32 //In case that OPEN command is given to Sn_CR when Sn_MR is set as IPRAW#define S_SSR_MACRAW 0x42 //In case that OPEN command is given to S0_CR when S0_MR is set as MACRAW#define S_SSR_PPPOE 0x5f //In case that OPEN command is given to S0_CR when S0_MR is set as PPPOE//Below is shown in the status change, and does not need much attention#define S_SSR_SYNSEND 0x15#define S_SSR_SYNRECV 0x16#define S_SSR_FIN_WAIT 0x18#define S_SSR_CLOSING 0x1a#define S_SSR_TIME_WAIT 0x1b#define S_SSR_LAST_ACK 0x1d#define S_SSR_ARP0 0x11#define S_SSR_ARP1 0x21#define S_SSR_ARP2 0x31//Socket Source port register, R/W, default=0x00#define W5100_S0_PORT COMMON_BASE+0x0404 //Socket 0#define W5100_S1_PORT COMMON_BASE+0x0504 //Socket 1#define W5100_S2_PORT COMMON_BASE+0x0604 //Socket 2#define W5100_S3_PORT COMMON_BASE+0x0704 //Socket 3//Socket destination hardware address register, R/W, default=0x00#define W5100_S0_DHAR COMMON_BASE+0x0406 //Socket 0#define W5100_S1_DHAR COMMON_BASE+0x0506 //Socket 1#define W5100_S2_DHAR COMMON_BASE+0x0606 //Socket 2#define W5100_S3_DHAR COMMON_BASE+0x0706 //Socket 3//Socket destination IP address register, R/W, default=0x00#define W5100_S0_DIPR COMMON_BASE+0x040c //Socket 0#define W5100_S1_DIPR COMMON_BASE+0x050c //Socket 1#define W5100_S2_DIPR COMMON_BASE+0x060c //Socket 2#define W5100_S3_DIPR COMMON_BASE+0x070c //Socket 3//Socket destionation port register, R/W, default=0x00#define W5100_S0_DPORT COMMON_BASE+0x0410 //Socket 0#define W5100_S1_DPORT COMMON_BASE+0x0510 //Socket 1#define W5100_S2_DPORT COMMON_BASE+0x0610 //Socket 2#define W5100_S3_DPORT COMMON_BASE+0x0710 //Socket 3//Socket maximum segment size register, R/W, default=0x00#define W5100_S0_MSS COMMON_BASE+0x0412 //Socket 0#define W5100_S1_MSS COMMON_BASE+0x0512 //Socket 1#define W5100_S2_MSS COMMON_BASE+0x0612 //Socket 2#define W5100_S3_MSS COMMON_BASE+0x0712 //Socket 3//Socket IP protocol register, R/W, default=0x00//See /assignments/protocol-number#define W5100_S0_PROTO COMMON_BASE+0x0414 //Socket 0#define W5100_S1_PROTO COMMON_BASE+0x0514 //Socket 1#define W5100_S2_PROTO COMMON_BASE+0x0614 //Socket 2#define W5100_S3_PROTO COMMON_BASE+0x0714 //Socket 3//Socket IP type of servce register, R/W, default=0x00#define W5100_S0_TOS COMMON_BASE+0x0415 //Socket 0#define W5100_S1_TOS COMMON_BASE+0x0515 //Socket 1#define W5100_S2_TOS COMMON_BASE+0x0615 //Socket 2#define W5100_S3_TOS COMMON_BASE+0x0715 //Socket 3//Socket IP time to live register, R/W, default=0x80#define W5100_S0_TTL COMMON_BASE+0x0416 //Socket 0#define W5100_S1_TTL COMMON_BASE+0x0516 //Socket 1#define W5100_S2_TTL COMMON_BASE+0x0616 //Socket 2#define W5100_S3_TTL COMMON_BASE+0x0716 //Socket 3//Socket TX free size register, RO, default=0x0800//should read upper byte first and lower byte later#define W5100_S0_TX_FSR COMMON_BASE+0x0420 //Socket 0 #define W5100_S1_TX_FSR COMMON_BASE+0x0520 //Socket 1 #define W5100_S2_TX_FSR COMMON_BASE+0x0620 //Socket 2 #define W5100_S3_TX_FSR COMMON_BASE+0x0720 //Socket 3//Socket TX read pointer register, RO, default=0x0000//should read upper byte first and lower byte later#define W5100_S0_TX_RR COMMON_BASE+0x0422 //Socket 0 #define W5100_S1_TX_RR COMMON_BASE+0x0522 //Socket 1 #define W5100_S2_TX_RR COMMON_BASE+0x0622 //Socket 2 #define W5100_S3_TX_RR COMMON_BASE+0x0722 //Socket 3//Socket TX write pointer register, R/W, default=0x0000//should read upper byte first and lower byte later#define W5100_S0_TX_WR COMMON_BASE+0x0424 //Socket 0 #define W5100_S1_TX_WR COMMON_BASE+0x0524 //Socket 1 #define W5100_S2_TX_WR COMMON_BASE+0x0624 //Socket 2 #define W5100_S3_TX_WR COMMON_BASE+0x0724 //Socket 3//Socket RX size register, RO, default=0x0000//should read upper byte first and lower byte later#define W5100_S0_RX_RSR COMMON_BASE+0x0426 //Socket 0 #define W5100_S1_RX_RSR COMMON_BASE+0x0526 //Socket 1 #define W5100_S2_RX_RSR COMMON_BASE+0x0626 //Socket 2 #define W5100_S3_RX_RSR COMMON_BASE+0x0726 //Socket 3//Socket RX read pointer register, R/W, default=0x0000//should read upper byte first and lower byte later#define W5100_S0_RX_RR COMMON_BASE+0x0428 //Socket 0 #define W5100_S1_RX_RR COMMON_BASE+0x0528 //Socket 1 #define W5100_S2_RX_RR COMMON_BASE+0x0628 //Socket 2 #define W5100_S3_RX_RR COMMON_BASE+0x0728 //Socket 3//Socket RX read pointer register, R/W, default=0x0000//should read upper byte first and lower byte later#define W5100_S0_RX_WR COMMON_BASE+0x042A //Socket 0 #define W5100_S1_RX_WR COMMON_BASE+0x052A //Socket 1 #define W5100_S2_RX_WR COMMON_BASE+0x062A //Socket 2 #define W5100_S3_RX_WR COMMON_BASE+0x072A //Socket 3//TX memory#define W5100_TX COMMON_BASE+0x4000//RX memory#define W5100_RX COMMON_BASE+0x6000#define S_INIT 0x01#define S_CONN 0x02#define S_RECEIVE 0x01#define S_TRANSMITOK 0x02#define TRUE 0xff#define FALSE 0x00。
w5100学习笔记
/* 设置重试时间,默认为2000(200ms) */
Write_W5100(W5100_RTR,0x07);
Write_W5100(W5100_RTR+1,0xd0);
Write_W5100(W5100_SUBR+i,Sub_Mask[i]); /*SUB_MASK为4字节unsigned char数组,自己定义*/
/*设置物理地址,6字节,用于唯一标识网络设备的物理地址值
该地址值需要到IEEE申请,按照OUI的规定,前3个字节为厂商代码,后三个字节为产品序号
w5100初始化程序:
Write_W5100(W5100_MODE,MODE_RST); /*软复位W5100*/
Delay(100); /*延时100ms,自己定义该函数*/
/*设置网关(Gateway)的IP地址,4字节 */
/*使用网关可以使通信突破子网的局限,通过网关可以访问到其它子网或进入Internet*/
前几天从淘宝买了个w5100模块,学习了一下。这个芯片真的不错,集成了硬件tcp/ip协议栈。操作很简单,主要是通过spi接口(当然也支持并口总线操作)配置网络的相关ip 掩码 物理地址 之类的值。
参数配置好后,就是读写通讯的内容,w5100有个中断引脚来指示通讯的完成,我们通过在中断到来之后读取状态值,就会知道是那个端口的中断,以此来进行相关数据解析。
Write_W5100(W5100_IMR,(IMR_CONFLICT|IMR_UNREACH|IMR_S0_INT|IMR_S1_INT|IMR_S2_INT|IMR_S3_INT));
W5100HB-III使用小技巧
ARM基本知识与常见问题北京万维盈创科技发展有限公司2009-8-11目录一、直连网线和交叉网线使用区别 (3)二、网线长度超过100米带来的影响 (3)三、如何实现Ping指令 (3)四、如何实现Telnet (6)五、如何查看ARM网口的MAC地址 (7)六、如何修改计算机网卡连接速度 (8)七、关于COM2作为控制台的注意事项 (9)八、如何使用CuteFtp登录到设备 (9)九、如何使用IE浏览器Ftp登录到设备 (11)十、设置时“离线”是否勾选带来的问题 (11)十一、Linux的基本指令 (11)十二、环保数采仪常见问题及解决方法 (12)1、网口升级:遇到升级错误如何解决 (12)2、网口配置:网口1ping不通如何解决 (12)3、屏出现的问题 (12)4、设备不停的重启 (13)5、模拟量显示0 (13)6、联网连不上 (13)7、串口数据查看(污染物和数值不对应) (13)8、MCU指示灯状态 (13)9、DTU指示灯状态 (13)2HBIII常见问题与基本知识汇总一、 直连网线和交叉网线使用区别A.交叉线:电脑<=>电脑B.交叉线的顺序:一头(从左到右):绿白、绿、橙白、蓝、蓝白、橙、棕白、棕。
1 2 3 6 5 4 7 8另一头(从左到右):橙白、橙、绿白、蓝、蓝白、绿、棕白、棕 3 6 1 2 5 4 7 8C.直连线:交换机<=>电脑D.直通线的顺序:两头一样(从左到右):绿白、绿、橙白、蓝、蓝白、橙、棕白、棕 1 2 3 6 5 4 7 8或者(从左到右):绿白、绿、橙白、蓝、蓝白、橙、棕白、棕 1 2 3 6 5 4 7 8二、网线长度超过100米带来的影响超五类网线最远距离100米,当距离在75--100米时用计算机上网可以,原因为计算机操作系统的纠错处理功能,但丢包率依然会很高。
用设备联网是不可以的,高丢包率会带来数据的丢失,必须在中间或设备端加一台路由器或HUB。
基于ARM的W5100底层驱动设计
基于ARM的W5100底层驱动设计如下:classObject{public:Object*Father;};由于所有设备类都是从该类间接继承下来,所以都拥有这个Father 指针。
NetOutInt.Father=&Net5100;的目的是把Net5100 对象地址赋给该指针,因此该指针就指向Net5100,说明NetOutInt拥有一个指向Net5100 的指针。
main.cpp 中,外部中断1 的服务程序代码如下:void__irqIRQ_Eint1(){NetOutInt.HardInt(Null);VICVectAddr=0 乘以00;NetOutInt.ClearInt();}NetOutInt.HardInt(Null);其本质就是调用到HardInt 函数,如下:voidOutInt_2138::HardInt(Device*IntDevice){this->Msg.MsgID=Sys_Msg_OutInt;this->Msg.Parm1=this->SubDeviceName;this->Father->Message(Msg);}this->Father->Message(Msg);即中断服务最后把该工作交给Father 指针指向的Net5100,接着该对象调用了其Message 函数。
NetWork_W5100 类的Message 函数伪代码如下:voidNetWork_W5100::Message(MessageBodySystemMsg){ifSocket3SelectSocket(3);ifSocket2SelectSocket(2);ifSocket1SelectSocket(1);elseSelectSocket(0);};其中NetWork_W5100 类的SelectSocket 函数如下:voidNetWork_W5100::SelectSocket(charsocket){uint16address,inttype;address=COMMON_BASE+0 乘以100*socket+0 乘以0402;inttype=NetWork_Read(address);if((inttype&0 乘以04)==0 乘以04){//接收数据引起中断S_UDP_RX_Process(socket,&ReceiveBuffer[0],&ReceiveBuffer[8]);//从对应的Socket 接收数据Msg.MsgID=Sys_Msg_UdpGetData;Msg.Msg=&ReceiveBuffer[0]; VclPointer[socket]->Message(Msg);//向支撑控件发送消息}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* +20071122[chungs]:wait to process the command... */ while( IINCHIP_READ(Sn_CR(s)) )
; /* ------- */
/* +2008.01 [hwkim]: clear interrupt */ #ifdef __DEF_IINCHIP_INT__ /* m2008.01 [bj] : all clear */
/** @brief This function close the socket and parameter is "s" which represent the socket number */ void close(SOCKET s) { #ifdef __DEF_IINCHIP_DBG__
printf("close()\r\n"); #endif
#endif
readme.txt
if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size.
else ret = len;
// if freebuf is available, start. do { freesize = getSn_TX_FSR(s); status = IINCHIP_READ(Sn_SR(s)); if ((status != SOCK_ESTABLISHED) && (status !=
IINCHIP_WRITE(Sn_MR(s),protocol | flag);
if (port != 0) {
IINCHIP_WRITE(Sn_PORT0(s),(uint8)((port & 0xff00) >>
8));
第1页
readme.txt IINCHIP_WRITE((Sn_PORT0(s) + 1),(uint8)(port & 0x00ff)); } else { local_port++; // if don't set the source port, set local_port number. IINCHIP_WRITE(Sn_PORT0(s),(uint8)((local_port & 0xff00) >> 8)); IINCHIP_WRITE((Sn_PORT0(s) + 1),(uint8)(local_port & 0x00ff)); } IINCHIP_WRITE(Sn_CR(s),Sn_CR_OPEN); // run sockinit Sn_CR
the port and wait for W5100 done it.
@return
1 for sucess else 0.
*/
uint8 socket(
SOCKET s,
/**< for socket number */
uint8 protocol,
/**< for socket protocol */
while( IINCHIP_READ(Sn_CR(s)) )
;
/* ------- */
ret = 1;
}
else
{
ret = 0;
#ifdef __DEF_IINCHIP_DBG__
printf("Fail[invalid ip,port]\r\n");
#endif
}
return ret;
}
/** @brief This function established the connection for the channel in Active (client) mode.
Please download the latest driver from WIZnet Homepage and copy and paste in this folder.
http://www.wiznet.co.kr/support_download.htm
search keyword : W5100 or driver
////////////////////////////////////// //////////////////////////////////////
分隔线
/* * @file @brief
* */
socket.c setting chip register for socket
last update : 2008. Jan
#include "../mcu/types.h" #include "../iinchip/w5100.h" #include "../iinchip/socket.h"
static uint16 local_port;
/**
@brief This Socket function initialize the channel in perticular mode, and set
const uint8 * buf,
/**< a pointer to data */
uint16 len
/**< the data size to be send */
)
第4页
{ uint8 status=0; uint16 ret=0; uint16 freesize=0;
#ifdef __DEF_IINCHIP_DBG__ printf("send()\r\n");
uint8 ret; #ifdef __DEF_IINCHIP_DBG__
printf("connect()\r\n"); #endif
if ( ((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] ==
0xFF) && (addr[3] == 0xFF)) || ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] ==
/* +20071122[chungs]:wait to process the command... */ while( IINCHIP_READ(Sn_CR(s)) )
; /* ------- */ ret = 1; } else { ret = 0; } #ifdef __DEF_IINCHIP_DBG__ printf("Sn_SR = %.2x , Protocol = %.2x\r\n", IINCHIP_READ(Sn_SR(s)), IINCHIP_READ(Sn_MR(s))); #endif return ret; }
putISR(s, 0x00); #else /* m2008.01 [bj] : all clear */
IINCHIP_WRITE(Sn_IR(s), 0xFF); #endif }
第2页
readme.txt
/**
@brief This function established the connection for the channel in passive
readme.txt
----------------------------------------------------------------------------<iinchip folder's contents> md5.c / md5.h / socket.c / socket.h / spi.h / w5100.c / w5100.h -----------------------------------------------------------------------------
#ifdef __DEF_IINCHIP_DBG__
printf("listen()\r\n");
#endif
if (IINCHIP_READ(Sn_SR(s)) == SOCK_INIT)
{
IINCHIP_WRITE(Sn_CR(s),Sn_CR_LISTEN);
/* +20071122[chungs]:wait to process the command... */
; /* ------- */ }
/**
@brief This function used to send the data in TCP mode
@return 1 for success else 0.
*/
uint16 send(
SOCKET s,
/**< the socket index */
0x00) && (addr[3] == 0x00)) || (port == 0x00)
第3页
readme.txt
) {
ret = 0; #ifdef __DEF_IINCHIP_DBG__
printf("Fail[invalid ip,port]\r\n"); #endif
} else {
ret = 1; // set destination IP IINCHIP_WRITE(Sn_DIPR0(s),addr[0]); IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]); IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]); IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]); IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8)); IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff)); IINCHIP_WRITE(Sn_CR(s),Sn_CR_CONNECT); /* m2008.01 [bj] : wait for completion */ while ( IINCHIP_READ(Sn_CR(s)) ) ;