This commit is contained in:
WangQiang 2015-07-27 07:18:00 +00:00
parent 81c6ca6d72
commit a310d9994e
2 changed files with 104 additions and 99 deletions

View File

@ -539,6 +539,11 @@ void W5500::Recovery()
frame.Data.SetPosition(0); frame.Data.SetPosition(0);
frame.Data.Write<byte>(phy.ToByte()); frame.Data.Write<byte>(phy.ToByte());
WriteFrame(frame); WriteFrame(frame);
for(int i = 0; i < 8; i++)
{
if(_socket[i] != NULL)
if(_socket[i]->Recovery != NULL)_socket[i]->Recovery();
}
} }
byte W5500::GetSocket() byte W5500::GetSocket()

View File

@ -1,4 +1,4 @@
#ifndef _W5500_H_ #ifndef _W5500_H_
#define _W5500_H_ #define _W5500_H_
#include "Sys.h" #include "Sys.h"
@ -19,137 +19,137 @@ __inline void w5500_printf( const char *format, ... ) {}
#endif #endif
// 硬件Socket基类 // 硬件Socket基类
class HardwareSocket; class HardwareSocket;
// 数据帧格式 // 数据帧格式
// 2byte Address + 1byte CONFIG_Phase + nbyte Data Phase // 2byte Address + 1byte CONFIG_Phase + nbyte Data Phase
typedef struct typedef struct
{ {
ushort Address; ushort Address;
byte BSB; // 5位 CONFIG_Phase 由底下封装 这里只需要知道BSB就好 byte BSB; // 5位 CONFIG_Phase 由底下封装 这里只需要知道BSB就好
Stream Data; Stream Data;
void Clear(){ ArrayZero2(this,3);}; void Clear(){ ArrayZero2(this,3);};
}Frame; }Frame;
class W5500 //: public ITransport // 只具备IP 以及相关整体配置 不具备Socket发送能力 所以不是ITransport class W5500 //: public ITransport // 只具备IP 以及相关整体配置 不具备Socket发送能力 所以不是ITransport
{ {
// 通用寄存器结构 // 通用寄存器结构
struct T_GenReg{ struct T_GenReg{
byte MR; // 模式 0x0000 byte MR; // 模式 0x0000
byte GAR[4]; // 网关地址 0x0001 byte GAR[4]; // 网关地址 0x0001
byte SUBR[4]; // 子网掩码 0x0005 byte SUBR[4]; // 子网掩码 0x0005
byte SHAR[6]; // 源MAC地址 0x0009 byte SHAR[6]; // 源MAC地址 0x0009
byte SIPR[4]; // 源IP地址 0x000f byte SIPR[4]; // 源IP地址 0x000f
byte INTLEVEL[2]; // 低电平中断定时器寄存器 0x0013 byte INTLEVEL[2]; // 低电平中断定时器寄存器 0x0013
byte IR; // 中断寄存器 0x0015 byte IR; // 中断寄存器 0x0015
byte IMR; // 中断屏蔽寄存器 0x0016 byte IMR; // 中断屏蔽寄存器 0x0016
byte SIR; // Socket中断寄存器 0x0017 byte SIR; // Socket中断寄存器 0x0017
byte SIMR; // Socket中断屏蔽寄存器 0x0018 byte SIMR; // Socket中断屏蔽寄存器 0x0018
byte RTR[2]; // 重试时间 0x0019 byte RTR[2]; // 重试时间 0x0019
byte RCR; // 重试计数 0x001b byte RCR; // 重试计数 0x001b
byte PTIMER; // PPP 连接控制协议请求定时寄存器 0x001c byte PTIMER; // PPP 连接控制协议请求定时寄存器 0x001c
byte PMAGIC; // PPP 连接控制协议幻数寄存器 0x001d byte PMAGIC; // PPP 连接控制协议幻数寄存器 0x001d
byte PHAR[6]; // PPPoE 模式下目标 MAC 寄存器 0x001e byte PHAR[6]; // PPPoE 模式下目标 MAC 寄存器 0x001e
byte PSID[2]; // PPPoE 模式下会话 ID 寄存器 0x0024 byte PSID[2]; // PPPoE 模式下会话 ID 寄存器 0x0024
byte PMRU[2]; // PPPoE 模式下最大接收单元 0x0026 byte PMRU[2]; // PPPoE 模式下最大接收单元 0x0026
byte UIPR[4]; // 无法抵达 IP 地址寄存器【只读】 0x0028 byte UIPR[4]; // 无法抵达 IP 地址寄存器【只读】 0x0028
byte UPORTR[2]; // 无法抵达端口寄存器【只读】 0x002c byte UPORTR[2]; // 无法抵达端口寄存器【只读】 0x002c
byte PHYCFGR; // PHY 配置寄存器 0x002e byte PHYCFGR; // PHY 配置寄存器 0x002e
//byte VERSIONR // 芯片版本寄存器【只读】 0x0039 // 地址不连续 //byte VERSIONR // 芯片版本寄存器【只读】 0x0039 // 地址不连续
}General_reg; // 只有一份 所以直接定义就好 }General_reg; // 只有一份 所以直接定义就好
private: private:
// 收发数据锁,确保同时只有一个对象使用 // 收发数据锁,确保同时只有一个对象使用
volatile byte _Lock; volatile byte _Lock;
// 本地 ip 是否是Dhcp得到的 1 是 0 不是 // 本地 ip 是否是Dhcp得到的 1 是 0 不是
//byte IsDhcpIp; //byte IsDhcpIp;
Spi* _spi; Spi* _spi;
InputPort _IRQ; InputPort _IRQ;
// 8个硬件socket // 8个硬件socket
HardwareSocket* _socket[8]; HardwareSocket* _socket[8];
// mac对象 // mac对象
MacAddress _mac; MacAddress _mac;
IPAddress _ip; IPAddress _ip;
// 读写帧,帧本身由外部构造 (包括帧数据内部的读写标志) // 读写帧,帧本身由外部构造 (包括帧数据内部的读写标志)
bool WriteFrame(Frame& fra); bool WriteFrame(Frame& fra);
bool ReadFrame(Frame& fra,uint length); bool ReadFrame(Frame& fra,uint length);
// spi 模式(默认变长) // spi 模式(默认变长)
byte PhaseOM; byte PhaseOM;
byte RX_FREE_SIZE; // 剩余接收缓存 kbyte byte RX_FREE_SIZE; // 剩余接收缓存 kbyte
byte TX_FREE_SIZE; // 剩余发送缓存 kbyte byte TX_FREE_SIZE; // 剩余发送缓存 kbyte
public: public:
// rst引脚可能不是独享的 这里只留一个指针 // rst引脚可能不是独享的 这里只留一个指针
OutputPort* nRest; OutputPort* nRest;
// DHCP服务器IP // DHCP服务器IP
//IPAddress DHCPServer; //IPAddress DHCPServer;
//IPAddress DNSServer; //IPAddress DNSServer;
// 软件复位 // 软件复位
void SoftwareReset(); void SoftwareReset();
// 复位 包含硬件复位和软件复位 // 复位 包含硬件复位和软件复位
void Reset(); void Reset();
// 构造 // 构造
W5500(); W5500();
W5500(Spi* spi, Pin irq = P0 ,OutputPort* rst = NULL); // 必须具备复位引脚 否则寄存器不能读 W5500(Spi* spi, Pin irq = P0 ,OutputPort* rst = NULL); // 必须具备复位引脚 否则寄存器不能读
~W5500(); ~W5500();
// 初始化 // 初始化
void Init(); void Init();
void Init(Spi* spi, Pin irq = P0, OutputPort* rst = NULL); // 必须给出 rst 控制引脚 void Init(Spi* spi, Pin irq = P0, OutputPort* rst = NULL); // 必须给出 rst 控制引脚
// 网卡状态输出 // 网卡状态输出
void StateShow(); void StateShow();
// 测试PHY状态 返回是否连接网线 // 测试PHY状态 返回是否连接网线
bool CheckLnk(); bool CheckLnk();
// 输出物理链路层状态 // 输出物理链路层状态
void PhyStateShow(); void PhyStateShow();
// 设置本地MAC // 设置本地MAC
bool SetMac(MacAddress& mac); bool SetMac(MacAddress& mac);
// “随机”一个MAC 并设置 // “随机”一个MAC 并设置
void AutoMac(); void AutoMac();
// 返回 MacAddress // 返回 MacAddress
MacAddress Mac(); MacAddress Mac();
// 设置网关IP // 设置网关IP
void SetGateway(IPAddress& ip); void SetGateway(IPAddress& ip);
// 设置默认网关IP // 设置默认网关IP
void DefGateway(); void DefGateway();
// 获取网关IP // 获取网关IP
IPAddress GetGateway(){ _ip.Value = *(uint*)General_reg.GAR; return _ip; }; IPAddress GetGateway(){ _ip.Value = *(uint*)General_reg.GAR; return _ip; };
// 子网掩码 // 子网掩码
void SetIpMask(IPAddress& mask); void SetIpMask(IPAddress& mask);
// 设置默认子网掩码 // 设置默认子网掩码
void DefIpMask(); void DefIpMask();
// 获取子网掩码 // 获取子网掩码
IPAddress GetIpMask(){ _ip.Value = *(uint*)General_reg.SUBR; return _ip; }; IPAddress GetIpMask(){ _ip.Value = *(uint*)General_reg.SUBR; return _ip; };
// 设置自己的IP // 设置自己的IP
void SetMyIp(IPAddress& ip); void SetMyIp(IPAddress& ip);
// 获取自己的IP // 获取自己的IP
IPAddress GetMyIp(){ _ip.Value = *(uint*)General_reg.SIPR; return _ip; }; IPAddress GetMyIp(){ _ip.Value = *(uint*)General_reg.SIPR; return _ip; };
/* 超时时间 = 重试时间*重试次数 */ /* 超时时间 = 重试时间*重试次数 */
// 设置重试时间 超时重传/触发超时中断 最大 6553ms 默认200ms // 设置重试时间 超时重传/触发超时中断 最大 6553ms 默认200ms
void SetRetryTime(ushort ms); void SetRetryTime(ushort ms);
// 设置重试次数 超时重传的次数 最大256 默认8次 // 设置重试次数 超时重传的次数 最大256 默认8次
void SetRetryCount(byte count); void SetRetryCount(byte count);
// 中断时低电平持续时间 // 中断时低电平持续时间
void SetIrqLowLevelTime(int us); void SetIrqLowLevelTime(int us);
// 开启PING应答 // 开启PING应答
void OpenPingACK(); void OpenPingACK();
void ClosePingACK(); void ClosePingACK();
//void OpenWol(); // 网络唤醒 //void OpenWol(); // 网络唤醒
void Recovery(); void Recovery();
private: private:
// 中断脚回调 // 中断脚回调
static void OnIRQ(Pin pin, bool down, void* param); static void OnIRQ(Pin pin, bool down, void* param);
void OnIRQ(); void OnIRQ();
@ -160,7 +160,7 @@ public:
void Register(byte Index,HardwareSocket* handler); void Register(byte Index,HardwareSocket* handler);
}; };
// 硬件Socket控制器 // 硬件Socket控制器
class HardwareSocket class HardwareSocket
{ {
public: public:
@ -173,51 +173,51 @@ public:
}; };
private: private:
struct T_HSocketReg{ struct T_HSocketReg{
byte Sn_MR ; //0x0000 // Socket 模式寄存器 byte Sn_MR ; //0x0000 // Socket 模式寄存器
byte Sn_CR ; //0x0001 // 配置寄存器 【较为特殊】【只写读为0x00】 byte Sn_CR ; //0x0001 // 配置寄存器 【较为特殊】【只写读为0x00】
byte Sn_IR ; //0x0002 // 中断寄存器 写1清0 byte Sn_IR ; //0x0002 // 中断寄存器 写1清0
byte Sn_SR ; //0x0003 // 状态寄存器 【只读】 byte Sn_SR ; //0x0003 // 状态寄存器 【只读】
byte Sn_PORT[2] ; //0x0004 // TCP UDP 模式下端口号 OPEN之前配置好 byte Sn_PORT[2] ; //0x0004 // TCP UDP 模式下端口号 OPEN之前配置好
byte Sn_DHAR[6] ; //0x0006 // 目的MAC,SEND_MAC使用;CONNECT/SEND 命令时ARP获取到的MAC byte Sn_DHAR[6] ; //0x0006 // 目的MAC,SEND_MAC使用;CONNECT/SEND 命令时ARP获取到的MAC
byte Sn_DIPR[4] ; //0x000c // 目标IP地址 byte Sn_DIPR[4] ; //0x000c // 目标IP地址
byte Sn_DPORT[2] ; //0x0010 // 目标端口 byte Sn_DPORT[2] ; //0x0010 // 目标端口
byte Sn_MSSR[2] ; //0x0012 // TCP UDP 模式下 MTU 最大传输单元大小 默认最大值 byte Sn_MSSR[2] ; //0x0012 // TCP UDP 模式下 MTU 最大传输单元大小 默认最大值
// TCP:1460; UDP:1472; MACRAW:1514; // TCP:1460; UDP:1472; MACRAW:1514;
// MACRAW 模式时 由于MTU 不在内部处理默认MTU将会生效 // MACRAW 模式时 由于MTU 不在内部处理默认MTU将会生效
// PPPoE 模式下 略 // PPPoE 模式下 略
// TCP UDP 模式下,传输数据比 MTU大时数据将会自动划分成默认MTU 单元大小 // TCP UDP 模式下,传输数据比 MTU大时数据将会自动划分成默认MTU 单元大小
byte Reserved ; //0x0014 byte Reserved ; //0x0014
byte Sn_TOS ; //0x0015 // IP包头 服务类型 OPEN之前配置 byte Sn_TOS ; //0x0015 // IP包头 服务类型 OPEN之前配置
byte Sn_TTL ; //0x0016 // 生存时间 TTL OPEN之前配置 byte Sn_TTL ; //0x0016 // 生存时间 TTL OPEN之前配置
byte Reserved2[7] ; //0x0017 - 0x001d byte Reserved2[7] ; //0x0017 - 0x001d
byte Sn_RXBUF_SIZE ;//0x001e // 接收缓存大小 1 2 4 8 16 单位KByte byte Sn_RXBUF_SIZE ;//0x001e // 接收缓存大小 1 2 4 8 16 单位KByte
byte Sn_TXBUF_SIZE ;//0x001f // 发送缓存大小 1 2 4 8 16 单位KByte byte Sn_TXBUF_SIZE ;//0x001f // 发送缓存大小 1 2 4 8 16 单位KByte
byte Sn_TX_FSR[2] ; //0x0020 // 空闲发送寄存器大小 byte Sn_TX_FSR[2] ; //0x0020 // 空闲发送寄存器大小
byte Sn_TX_RD[2] ; //0x0022 // 发送读缓存指针 byte Sn_TX_RD[2] ; //0x0022 // 发送读缓存指针
byte Sn_TX_WR[2] ; //0x0024 // 发送写缓存指针 byte Sn_TX_WR[2] ; //0x0024 // 发送写缓存指针
byte Sn_RX_RSR[2] ; //0x0026 // 空闲接收寄存器大小 byte Sn_RX_RSR[2] ; //0x0026 // 空闲接收寄存器大小
byte Sn_RX_RD[2] ; //0x0028 // 发送读缓存指针 byte Sn_RX_RD[2] ; //0x0028 // 发送读缓存指针
byte Sn_RX_WR[2] ; //0x002a // 发送写缓存指针 byte Sn_RX_WR[2] ; //0x002a // 发送写缓存指针
byte Sn_IMR ; //0x002c // 中断屏蔽寄存器 结构跟Sn_IR一样 0屏蔽 1不屏蔽 byte Sn_IMR ; //0x002c // 中断屏蔽寄存器 结构跟Sn_IR一样 0屏蔽 1不屏蔽
byte Sn_FRAG[2] ; //0x002d // IP包头 分段部分 分段寄存器 byte Sn_FRAG[2] ; //0x002d // IP包头 分段部分 分段寄存器
byte Sn_KPALVTR ; //0x002f // 只在TCP模式下使用 在线时间寄存器 单位5s byte Sn_KPALVTR ; //0x002f // 只在TCP模式下使用 在线时间寄存器 单位5s
// 为0 时 手动SEND_KEEP // 为0 时 手动SEND_KEEP
// > 0 时 忽略SEND_KEEP操作 // > 0 时 忽略SEND_KEEP操作
}HSocketReg; }HSocketReg;
private: private:
W5500* _THard; // W5500公共部分控制器 W5500* _THard; // W5500公共部分控制器
public: public:
bool Enable; // 启用 bool Enable; // 启用
byte Index; // 使用的硬Socket编号 也是BSB选项的一部分 byte Index; // 使用的硬Socket编号 也是BSB选项的一部分
HardwareSocket(W5500* thard); HardwareSocket(W5500* thard);
virtual ~HardwareSocket(); virtual ~HardwareSocket();
// 打开Socket // 打开Socket
virtual bool OpenSocket() = 0; virtual bool OpenSocket() = 0;
// 恢复配置 // 恢复配置
virtual void Recovery() = 0; virtual void Recovery() = 0;
// 处理数据包 // 处理数据包
virtual bool Process() = 0; virtual bool Process() = 0;
}; };