diff --git a/Drivers/W5500.cpp b/Drivers/W5500.cpp index e3786a4f..cc23e2a8 100644 --- a/Drivers/W5500.cpp +++ b/Drivers/W5500.cpp @@ -539,6 +539,11 @@ void W5500::Recovery() frame.Data.SetPosition(0); frame.Data.Write(phy.ToByte()); WriteFrame(frame); + for(int i = 0; i < 8; i++) + { + if(_socket[i] != NULL) + if(_socket[i]->Recovery != NULL)_socket[i]->Recovery(); + } } byte W5500::GetSocket() diff --git a/Drivers/W5500.h b/Drivers/W5500.h index 4ce227aa..5da39de8 100644 --- a/Drivers/W5500.h +++ b/Drivers/W5500.h @@ -1,4 +1,4 @@ -#ifndef _W5500_H_ +#ifndef _W5500_H_ #define _W5500_H_ #include "Sys.h" @@ -19,137 +19,137 @@ __inline void w5500_printf( const char *format, ... ) {} #endif -// ӲSocket +// 硬件Socket基类 class HardwareSocket; -// ֡ʽ +// 数据帧格式 // 2byte Address + 1byte CONFIG_Phase + nbyte Data Phase typedef struct { ushort Address; - byte BSB; // 5λ CONFIG_Phase ɵ·װ ֻҪ֪BSBͺ + byte BSB; // 5位 CONFIG_Phase 由底下封装 这里只需要知道BSB就好 Stream Data; void Clear(){ ArrayZero2(this,3);}; }Frame; -class W5500 //: public ITransport // ֻ߱IP Լ ߱Socket ԲITransport +class W5500 //: public ITransport // 只具备IP 以及相关整体配置 不具备Socket发送能力 所以不是ITransport { - // ͨüĴṹ + // 通用寄存器结构 struct T_GenReg{ - byte MR; // ģʽ 0x0000 - byte GAR[4]; // صַ 0x0001 - byte SUBR[4]; // 0x0005 - byte SHAR[6]; // ԴMACַ 0x0009 - byte SIPR[4]; // ԴIPַ 0x000f - byte INTLEVEL[2]; // ͵ƽж϶ʱĴ 0x0013 - byte IR; // жϼĴ 0x0015 - byte IMR; // жμĴ 0x0016 - byte SIR; // SocketжϼĴ 0x0017 - byte SIMR; // SocketжμĴ 0x0018 - byte RTR[2]; // ʱ 0x0019 - byte RCR; // Լ 0x001b - byte PTIMER; // PPP ӿЭʱĴ 0x001c - byte PMAGIC; // PPP ӿЭĴ 0x001d - byte PHAR[6]; // PPPoE ģʽĿ MAC Ĵ 0x001e - byte PSID[2]; // PPPoE ģʽ»Ự ID Ĵ 0x0024 - byte PMRU[2]; // PPPoE ģʽյԪ 0x0026 - byte UIPR[4]; // ޷ִ IP ַĴֻ 0x0028 - byte UPORTR[2]; // ޷ִ˿ڼĴֻ 0x002c - byte PHYCFGR; // PHY üĴ 0x002e - //byte VERSIONR // оƬ汾Ĵֻ 0x0039 // ַ - }General_reg; // ֻһ ֱӶͺ + byte MR; // 模式 0x0000 + byte GAR[4]; // 网关地址 0x0001 + byte SUBR[4]; // 子网掩码 0x0005 + byte SHAR[6]; // 源MAC地址 0x0009 + byte SIPR[4]; // 源IP地址 0x000f + byte INTLEVEL[2]; // 低电平中断定时器寄存器 0x0013 + byte IR; // 中断寄存器 0x0015 + byte IMR; // 中断屏蔽寄存器 0x0016 + byte SIR; // Socket中断寄存器 0x0017 + byte SIMR; // Socket中断屏蔽寄存器 0x0018 + byte RTR[2]; // 重试时间 0x0019 + byte RCR; // 重试计数 0x001b + byte PTIMER; // PPP 连接控制协议请求定时寄存器 0x001c + byte PMAGIC; // PPP 连接控制协议幻数寄存器 0x001d + byte PHAR[6]; // PPPoE 模式下目标 MAC 寄存器 0x001e + byte PSID[2]; // PPPoE 模式下会话 ID 寄存器 0x0024 + byte PMRU[2]; // PPPoE 模式下最大接收单元 0x0026 + byte UIPR[4]; // 无法抵达 IP 地址寄存器【只读】 0x0028 + byte UPORTR[2]; // 无法抵达端口寄存器【只读】 0x002c + byte PHYCFGR; // PHY 配置寄存器 0x002e + //byte VERSIONR // 芯片版本寄存器【只读】 0x0039 // 地址不连续 + }General_reg; // 只有一份 所以直接定义就好 private: - // շȷͬʱֻһʹ + // 收发数据锁,确保同时只有一个对象使用 volatile byte _Lock; - // ip ǷDhcpõ 1 0 + // 本地 ip 是否是Dhcp得到的 1 是 0 不是 //byte IsDhcpIp; Spi* _spi; InputPort _IRQ; - // 8Ӳsocket + // 8个硬件socket HardwareSocket* _socket[8]; - // mac + // mac对象 MacAddress _mac; IPAddress _ip; - // д֡֡ⲿ ֡ڲĶд־ + // 读写帧,帧本身由外部构造 (包括帧数据内部的读写标志) bool WriteFrame(Frame& fra); bool ReadFrame(Frame& fra,uint length); - // spi ģʽĬϱ䳤 + // spi 模式(默认变长) byte PhaseOM; - byte RX_FREE_SIZE; // ʣջ kbyte - byte TX_FREE_SIZE; // ʣ෢ͻ kbyte + byte RX_FREE_SIZE; // 剩余接收缓存 kbyte + byte TX_FREE_SIZE; // 剩余发送缓存 kbyte public: - // rstſܲǶ ֻһָ + // rst引脚可能不是独享的 这里只留一个指针 OutputPort* nRest; - // DHCPIP + // DHCP服务器IP //IPAddress DHCPServer; //IPAddress DNSServer; - // λ + // 软件复位 void SoftwareReset(); - // λ Ӳλλ + // 复位 包含硬件复位和软件复位 void Reset(); - // + // 构造 W5500(); - W5500(Spi* spi, Pin irq = P0 ,OutputPort* rst = NULL); // ߱λ Ĵܶ + W5500(Spi* spi, Pin irq = P0 ,OutputPort* rst = NULL); // 必须具备复位引脚 否则寄存器不能读 ~W5500(); - // ʼ + // 初始化 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(); - // PHY״̬ Ƿ + // 测试PHY状态 返回是否连接网线 bool CheckLnk(); - // ·״̬ + // 输出物理链路层状态 void PhyStateShow(); - // ñMAC + // 设置本地MAC bool SetMac(MacAddress& mac); - // һMAC + // “随机”一个MAC 并设置 void AutoMac(); - // MacAddress + // 返回 MacAddress MacAddress Mac(); - // IP + // 设置网关IP void SetGateway(IPAddress& ip); - // ĬIP + // 设置默认网关IP void DefGateway(); - // ȡIP + // 获取网关IP IPAddress GetGateway(){ _ip.Value = *(uint*)General_reg.GAR; return _ip; }; - // + // 子网掩码 void SetIpMask(IPAddress& mask); - // Ĭ + // 设置默认子网掩码 void DefIpMask(); - // ȡ + // 获取子网掩码 IPAddress GetIpMask(){ _ip.Value = *(uint*)General_reg.SUBR; return _ip; }; - // ԼIP + // 设置自己的IP void SetMyIp(IPAddress& ip); - // ȡԼIP + // 获取自己的IP IPAddress GetMyIp(){ _ip.Value = *(uint*)General_reg.SIPR; return _ip; }; - /* ʱʱ = ʱ*Դ */ - // ʱ ʱش/ʱж 6553ms Ĭ200ms + /* 超时时间 = 重试时间*重试次数 */ + // 设置重试时间 超时重传/触发超时中断 最大 6553ms (默认200ms) void SetRetryTime(ushort ms); - // Դ ʱشĴ 256 Ĭ8Σ + // 设置重试次数 超时重传的次数 最大256 (默认8次) void SetRetryCount(byte count); - // жʱ͵ƽʱ + // 中断时低电平持续时间 void SetIrqLowLevelTime(int us); - // PINGӦ + // 开启PING应答 void OpenPingACK(); void ClosePingACK(); - //void OpenWol(); // 绽 + //void OpenWol(); // 网络唤醒 void Recovery(); private: - // жϽŻص + // 中断脚回调 static void OnIRQ(Pin pin, bool down, void* param); void OnIRQ(); @@ -160,7 +160,7 @@ public: void Register(byte Index,HardwareSocket* handler); }; -// ӲSocket +// 硬件Socket控制器 class HardwareSocket { public: @@ -173,51 +173,51 @@ public: }; private: struct T_HSocketReg{ - byte Sn_MR ; //0x0000 // Socket ģʽĴ - byte Sn_CR ; //0x0001 // üĴ Ϊ⡿ֻдΪ0x00 - byte Sn_IR ; //0x0002 // жϼĴ д10 - byte Sn_SR ; //0x0003 // ״̬Ĵ ֻ - byte Sn_PORT[2] ; //0x0004 // TCP UDP ģʽ¶˿ں OPEN֮ǰú - byte Sn_DHAR[6] ; //0x0006 // ĿMAC,SEND_MACʹ;CONNECT/SEND ʱARPȡMAC - byte Sn_DIPR[4] ; //0x000c // ĿIPַ - byte Sn_DPORT[2] ; //0x0010 // Ŀ˿ - byte Sn_MSSR[2] ; //0x0012 // TCP UDP ģʽ MTU 䵥ԪС Ĭֵ + byte Sn_MR ; //0x0000 // Socket 模式寄存器 + byte Sn_CR ; //0x0001 // 配置寄存器 【较为特殊】【只写,读为0x00】 + byte Sn_IR ; //0x0002 // 中断寄存器 写1清0?? + byte Sn_SR ; //0x0003 // 状态寄存器 【只读】 + byte Sn_PORT[2] ; //0x0004 // TCP UDP 模式下端口号 OPEN之前配置好 + byte Sn_DHAR[6] ; //0x0006 // 目的MAC,SEND_MAC使用;CONNECT/SEND 命令时ARP获取到的MAC + byte Sn_DIPR[4] ; //0x000c // 目标IP地址 + byte Sn_DPORT[2] ; //0x0010 // 目标端口 + byte Sn_MSSR[2] ; //0x0012 // TCP UDP 模式下 MTU 最大传输单元大小 默认最大值 // TCP:1460; UDP:1472; MACRAW:1514; - // MACRAW ģʽʱ MTU ڲĬMTUЧ - // PPPoE ģʽ - // TCP UDP ģʽ£ݱ MTUʱݽԶֳĬMTU ԪС + // MACRAW 模式时 由于MTU 不在内部处理,默认MTU将会生效 + // PPPoE 模式下 略 + // TCP UDP 模式下,传输数据比 MTU大时,数据将会自动划分成默认MTU 单元大小 byte Reserved ; //0x0014 - byte Sn_TOS ; //0x0015 // IPͷ OPEN֮ǰ - byte Sn_TTL ; //0x0016 // ʱ TTL OPEN֮ǰ + byte Sn_TOS ; //0x0015 // IP包头 服务类型 OPEN之前配置 + byte Sn_TTL ; //0x0016 // 生存时间 TTL OPEN之前配置 byte Reserved2[7] ; //0x0017 - 0x001d - byte Sn_RXBUF_SIZE ;//0x001e // ջС 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_RD[2] ; //0x0022 // Ͷָ - byte Sn_TX_WR[2] ; //0x0024 // дָ - byte Sn_RX_RSR[2] ; //0x0026 // нռĴС - byte Sn_RX_RD[2] ; //0x0028 // Ͷָ - byte Sn_RX_WR[2] ; //0x002a // дָ - byte Sn_IMR ; //0x002c // жμĴ ṹSn_IRһ 0 1 - byte Sn_FRAG[2] ; //0x002d // IPͷ ֶβ ֶμĴ + byte Sn_RXBUF_SIZE ;//0x001e // 接收缓存大小 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_RD[2] ; //0x0022 // 发送读缓存指针 + byte Sn_TX_WR[2] ; //0x0024 // 发送写缓存指针 + byte Sn_RX_RSR[2] ; //0x0026 // 空闲接收寄存器大小 + byte Sn_RX_RD[2] ; //0x0028 // 发送读缓存指针 + byte Sn_RX_WR[2] ; //0x002a // 发送写缓存指针 + byte Sn_IMR ; //0x002c // 中断屏蔽寄存器 结构跟Sn_IR一样 0屏蔽 1不屏蔽 + byte Sn_FRAG[2] ; //0x002d // IP包头 分段部分 分段寄存器 - byte Sn_KPALVTR ; //0x002f // ֻTCPģʽʹ ʱĴ λ5s - // Ϊ0 ʱ ֶSEND_KEEP - // > 0 ʱ SEND_KEEP + byte Sn_KPALVTR ; //0x002f // 只在TCP模式下使用 在线时间寄存器 单位:5s + // 为0 时 手动SEND_KEEP + // > 0 时 忽略SEND_KEEP操作 }HSocketReg; private: - W5500* _THard; // W5500ֿ + W5500* _THard; // W5500公共部分控制器 public: - bool Enable; // - byte Index; // ʹõӲSocket ҲBSBѡһ + bool Enable; // 启用 + byte Index; // 使用的硬Socket编号 也是BSB选项的一部分 HardwareSocket(W5500* thard); virtual ~HardwareSocket(); - // Socket + // 打开Socket virtual bool OpenSocket() = 0; - // ָ + // 恢复配置 virtual void Recovery() = 0; - // ݰ + // 处理数据包 virtual bool Process() = 0; };