This commit is contained in:
parent
81c6ca6d72
commit
a310d9994e
|
@ -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()
|
||||||
|
|
198
Drivers/W5500.h
198
Drivers/W5500.h
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue