## 1、概述

CH395 是以太网协议栈管理芯片，用于单片机系统进行以太网通讯。

CH395芯片自带10/100M以太网介质传输层MAC和物理层收发器PHY，完全兼容IEEE802.3协议，内置了 IP、ARP、ICMP、UDP、TCP 等以太网协议栈固件。单片机系统可以方便的通过 CH395 芯片进行网络通讯。

CH395 支持三种通讯接口：8 位并口、SPI 接口和异步串口，单片机/DSP/MCU/MPU 等控制器可以通过上述任何一种通讯接口控制 CH395 芯片进行以太网通讯。

下图为 CH395 的应用框图。

<p align="center">图 CH395 应用框图</p>
![](https://lsky.bitnasdaq.vip/eE81DM.jpg)

## 2、特点

内部自带以太网介质传输层 MAC 和物理层收发器 PHY 支持 10/100M，全双工/半双工自适应，兼容 IEEE802.3 协议 支持 MDI/MDIX 线路自动转换 I/O 口支持 3.3V、2.5V、1.8V 供电，兼容多种电压标准的单片机 内置网口上拉电阻、晶振匹配电容，精简外围电路 内置 TCP/IP 协议簇，支持 IPv4、ARP、ICMP、UDP、TCP 协议 支持 DHCP 自动获取 IP 地址 提供 8 个独立的 Socket 对，可以同时进行数据收发 支持 MACRAW 模式和 IPRAW 模式 提供最高 40MHz 速度的 SPI 设备接口（SPI 模式 0 或 3），高位在前

提供高速 8 位被动并行接口，支持连接到单片机的并行数据总线 提供最高 10Mbps 速度的异步串口，支持连接到单片机的串行口，支持通讯波特率动态调整 CH395F 串口支持 RS485 收发自动切换，支持硬件流控 支持睡眠模式 内置 24K RAM，可用于以太网数据收发，每个 Socket 收发缓冲区可以自由配置 内置 4KB EEPROM 支持 8 路 GPIO 提供 QFN32、LQFP64M 和 LQFP128 无铅封装

## 3、引脚排列

![](https://lsky.bitnasdaq.vip/9dobp9.jpg)

<p align="center">表 封装说明</p>

| 封装形式    | 塑体尺寸    | 引脚节距  |         | 封装说明             | 订货型号   |
| ------- | ------- | ----- | ------- | ---------------- | ------ |
| QFN32   | 4*4mm   | 0.4mm | 15.7mil | 四边无引线32脚         | CH395F |
| LQFP64M | 10*10mm | 0.5mm | 19.7mil | LQFP64M(10*10)贴片 | CH395A |
| LQFP128 | 14*14mm | 0.4mm | 15.7mil | 标准LQFP128贴片      | CH395P |

注：1、新设计建议使用更小封装的CH395F。 2、CH395A基于CH395Q升级，CH395P基于CH395L升级，引脚基本兼容，替换时需调整外围电路。 3、CH395Q、CH395L维持供货但不建议新设计选用。

## 4、引脚定义

## 4.1 CH395F 引脚定义

<p align="center">表 CH395F 引脚定义</p>

| CH395F引脚号 | 引脚名称           | 类型(1)   | 引脚说明(2)                                                                                                                                                   |
| --------- | -------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 2         | RXP            | I/O     | 10BASE-T/100BASE-TX MDI模式下的差分输入;10BASE-T/100BASE-TX MDIX模式下的差分输出。                                                                                         |
| 3         | RXN            |         |                                                                                                                                                           |
| 4         | TXP            | I/O     | 10BASE-T/100BASE-TX MDI模式下的差分输出;10BASE-T/100BASE-TX MDIX模式下的差分输入。                                                                                         |
| 5         | TXN            |         |                                                                                                                                                           |
| 6         | VCC33          | P       | 3.3V电源输入,建议0.1uF并联10uF或4.7uF对地电容贴近芯片放置。                                                                                                                   |
| 19        | VCCIO          | P       | I/O接口的电源输入,建议0.1uF对地电容贴近芯片放置。                                                                                                                             |
| 9         | VDDK           | P       | 外接1uF对地电容贴近芯片放置。                                                                                                                                          |
| 0         | GND            | P       | 公共接地端。                                                                                                                                                    |
| 1、7、8     | NC             | -       | 保留引脚,建议悬空。                                                                                                                                                |
| 12        | XI             | I       | 晶体振荡器输入,需外接25MHz晶体一端,或外部时钟输入,内置晶振匹配电容。                                                                                                                    |
| 13        | XO             | 0       | 晶体振荡器反相输出,需外接25MHz晶体另一端,内置晶振匹配电容。                                                                                                                         |
| 10        | RSTI           | I,PU    | 外部复位输入,低电平有效,内置上拉电阻。                                                                                                                                      |
| 11        | TNOW           | 0       | 发送状态输出,用于控制串口的RS485收发切换。                                                                                                                                  |
| 14        | RST            | 0       | 复位和外部复位输出,高电平有效。                                                                                                                                          |
| 15        | INT#           | 0       | 中断请求输出,低电平有效。                                                                                                                                             |
| 16        | ELINK#         | 0       | 网络连接指示LED输出:低电平表示以太网PHY已连接;高电平表示以太网PHY未连接。                                                                                                                |
| 17        | SEL            | I,PU    | 在芯片内部复位期间作为接口配置输入使用,其具体配置方法详见章节6.1。                                                                                                                       |
| 18        | EACT#          | 0       | 载波感应指示LED输出:LED闪烁表示有载波感应信号。                                                                                                                               |
| 20        | GPI00          | I/O     | 通用输入输出引脚0,默认配置为输入模式。                                                                                                                                      |
| 21        | AO/GPI01       | I/O,PU  | A0:并口的地址输入,区分命令口与数据口,内置上拉电阻;当A0=1时可以写命令,当A0=0时可以读写数据。GPI01:通用输入输出引脚1,默认配置为输入模式。                                                                           |
| 22        | RD#/GPI02      | I/O,PU  | RD#:并口的读选通输入,低电平有效,内置上拉电阻。GPI02:通用输入输出引脚2,默认配置为输入模式。                                                                                                      |
| 23        | WR#/GPI03/RDY# | I/O,PU  | WR#:并口的写选通输入,低电平有效,内置上拉电阻。GPI03:通用输入输出引脚3,默认配置为输出模式。RDY#:CH395F复位完成后,输出低电平;在并口模式下RDY#功能不生效。                                                               |
| 24        | PCS#/GPI04     | I/O, PU | PCS#:并口的片选控制信号输入,低电平有效,内置上拉电阻。GPI04:通用输入输出引脚4,默认配置为输入模式。                                                                                                  |
| 25        | D0/GPI05       | I/O, PU | D0:并口的8位双向数据总线中的第0位,内置上拉电阻。GPI05:通用输入输出引脚5,默认配置为输入模式。                                                                                                     |
| 26        | D1/GPI06       | I/O, PU | D1:并口的8位双向数据总线中的第1位,内置上拉电阻。GPI06:通用输入输出引脚6,默认配置为输入模式。                                                                                                     |
| 27        | RXD/D2/GPI07   | I/O, PU | RXD:异步串口的串行数据输入,内置上拉电阻;D2:并口的8位双向数据总线中的第2位,内置上拉电阻。GPI07:通用输入输出引脚7,默认配置为输入模式。                                                                              |
| 28        | TXD/D3         | I/O, PU | 在芯片内部复位期间为接口配置输入,内置上拉电阻,配置方法详参6.1章节;在芯片复位完成后作为接口引脚使用。TXD:异步串口的串行数据输出。D3:并口的8位双向数据总线中的第3位,内置上拉电阻。                                                          |
| 29        | SCS/D4         | I/O, PU | SCS:SPI接口的片选输入SCS,低电平有效,内置上拉电阻。D4:并口的8位双向数据总线中的第4位,内置上拉电阻。                                                                                                |
| 30        | SCK/CTS/D5     | I/O, PU | SCK:SPI接口的串行时钟输入SCK,内置上拉电阻。CTS:清除发送输入,内置上拉电阻。若是高电平,串口在当前数据传输结束时阻断下一次的数据发送,可以连接对端RTS实现硬件流控(串口流控功能默认关闭,可通过CMD_SET_FUN_PARA命令开启)。D5:并口的8位双向数据总线中的第5位,内置上拉电阻。 |
| 31        | SDI/D6         | I/O, PU | SDI:SPI接口的串行数据输入SDI,内置上拉电阻。D6:并口的8位双向数据总线中的第6位,内置上拉电阻。                                                                                                    |
| 32        | SDO/RTS/D7     | I/O, PU | SDO:作为SPI接口的串行数据输出。RTS:发送请求输出,若是低电平,表明串口准备好接收数据,可以连接对端CTS实现硬件流控(串口流控功能默认关闭,可通过CMD_SET_FUN_PARA命令开启)。D7:并口的8位双向数据总线中的第7位,内置上拉电阻。                           |

注1：表格缩写解释： 丨= 输入；0=输出； 1/0=输入/输出； P =电源；PU= 内置上拉电阻。 注2：CH395F的复用引脚具体功能取决于当前所选的接口模式。当复用引脚被用于接口功能时，其GPIO功能将被占用，导致其GPI0功能失效，同时GPI0寄存器中对应位无实际意义。

## 4.2 CH395A 引脚定义

<p align="center">表 CH395A 引脚定义</p>

| CH395A引脚号                                  | 引脚名称       | 类型(1)  | 引脚说明(2)                                                                                          |
| ------------------------------------------ | ---------- | ------ | ------------------------------------------------------------------------------------------------ |
| 4                                          | RXP        | I/O    | 10BASE-T/100BASE-TX MDI模式下的差分输入;10BASE-T/100BASE-TX MDIX模式下的差分输出。                                |
| 5                                          | RXN        |        |                                                                                                  |
| 7                                          | TXP        | I/O    | 10BASE-T/100BASE-TX MDI模式下的差分输出;10BASE-T/100BASE-TX MDIX模式下的差分输入。                                |
| 8                                          | TXN        |        |                                                                                                  |
| 2、12                                       | VCC33      | P      | 3.3V电源输入,建议0.1uF并联10uF或4.7uF对地电容贴近芯片放置。                                                          |
| 21、29、40、45、63                             | VCCIO      | P      | I/O接口的电源输入,建议0.1uF对地电容贴近芯片放置。                                                                    |
| 19                                         | VDDK       | P      | 外接1uF对地电容贴近芯片放置。                                                                                 |
| 28、43                                      | VDDK       | P      | 外接0.1uF对地电容贴近芯片放置。                                                                               |
| 3、9、13、                                    | GND        | P      | 公共接地端。                                                                                           |
| 18、20、37、41、44                             |            |        |                                                                                                  |
| 1、6、14、15、16、17、30、31、38、39、42、51、53、54、64 | NC         | -      | 保留引脚,建议悬空。                                                                                       |
| 10                                         | XI         | I      | 晶体振荡器输入,需外接25MHz晶体一端,或外部时钟输入,内置晶振匹配电容。                                                           |
| 11                                         | XO         | 0      | 晶体振荡器反相输出,需外接25MHz晶体另一端,内置晶振匹配电容。                                                                |
| 22                                         | GPIO0      | I/O    | 通用输入输出引脚0,默认配置为输入。                                                                               |
| 23                                         | GPIO1      | I/O    | 通用输入输出引脚1,默认配置为输入。                                                                               |
| 24                                         | GPIO2      | I/O    | 通用输入输出引脚2,默认配置为输入。                                                                               |
| 25                                         | GPIO3/RDY# | I/O    | GPIO3:通用输入输出引脚3,默认配置为输出;RDY#:CH395A复位后,输出低电平。                                                    |
| 26                                         | RST        | 0      | 电源上电复位和外部复位输出,高电平有效。                                                                             |
| 27                                         | SEL        | I,PU   | 在芯片内部复位期间作为接口配置输入使用,其具体配置方法详见章节6.1。                                                              |
| 32                                         | GPIO4      | I/O    | 通用输入输出引脚4,默认配置为输入。                                                                               |
| 33                                         | GPIO5/A0   | I/O,PU | GPIO5:通用输入输出引脚5,默认配置为输入模式。A0:并口的地址输入,区分命令口与数据口,内置上拉电阻;当A0=1时可以写命令,当A0=0时可以读写数据。                  |
| 34                                         | GPIO6      | I/O    | 通用输入输出引脚6,默认配置为输入。                                                                               |
| 35                                         | GPIO7      | I/O    | 通用输入输出引脚7,默认配置为输入。                                                                               |
| 36                                         | RSTI       | I,PU   | 外部复位输入,低电平有效,内置上拉电阻。                                                                             |
| 46                                         | RD#        | I,PU   | 并口的读选通输入,低电平有效,内置上拉电阻。                                                                           |
| 47                                         | WR#        | I,PU   | 并口的写选通输入,低电平有效,内置上拉电阻。                                                                           |
| 49                                         | INT#       | 0      | 中断请求输出,低电平有效。                                                                                    |
| 50                                         | PCS#       | I,PU   | 并口的片选控制输入,低电平有效,内置上拉电阻。                                                                          |
| 55                                         | D0         | I/O,PU | 并口的8位双向数据总线中的第0位,内置上拉电阻。                                                                         |
| 56                                         | D1         | I/O,PU | 并口的8位双向数据总线中的第1位,内置上拉电阻。                                                                         |
| 57                                         | RXD/D2     | I/O,PU | RXD:异步串口的串行数据输入,内置上拉电阻;D2:并口的8位双向数据总线中的第2位,内置上拉电阻。                                               |
| 58                                         | TXD/D3     | I/O,PU | 在芯片内部复位期间为接口配置输入,内置上拉电阻,配置方法详参6.1章节;在芯片复位完成后作为接口引脚使用。TXD:异步串口的串行数据输出。D3:并口的8位双向数据总线中的第3位,内置上拉电阻。 |
| 59                                         | SCS/D4     | I/O,PU | SCS:SPI接口的片选输入SCS,低电平有效,内置上拉电阻。D4:并口的8位双向数据总线中的第4位,内置上拉电阻。                                       |
| 60                                         | SCK/D5     | I/O,PU | SCK:SPI接口的串行时钟输入SCK,内置上拉电阻。D5:并口的8位双向数据总线中的第5位,内置上拉电阻。                                           |
| 61                                         | SDI/D6     | I/O,PU | SDI:SPI接口的串行数据输入SDI,内置上拉电阻。D6:并口的8位双向数据总线中的第6位,内置上拉电阻。                                           |
| 62                                         | SDO/D7     | I/O,PU | SDO:作为SPI接口的串行数据输出。D7:并口的8位双向数据总线中的第7位,内置上拉电阻。                                                   |
| 48                                         | ELINK#     | 0      | 网络连接指示LED输出:低电平表示以太网PHY已连接;高电平表示以太网PHY未连接。                                                       |
| 52                                         | EACT#      | 0      | 载波感应指示LED输出:LED闪烁表示有载波感应信号。                                                                      |

注1：表格缩写解释：

丨= 输入；0=输出； 1/0=输入/输出;

P = 电源；PU= 内置上拉电阻。

注2：CH395A的复用引脚具体功能取决于当前所选的接口模式。当复用引脚被用于接口功能时，其GPIO功能将被占用，导致其GPI0功能失效，同时GPI0寄存器中对应位无实际意义。

## 4.3 CH395P 引脚定义

<p align="center">表 CH395P 引脚定义</p>

| CH395P引脚号                                                                                                                                                                                                     | 引脚名称       | 类型(1)  | 引脚说明                                                                |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | ------ | ------------------------------------------------------------------- |
| 10                                                                                                                                                                                                            | RXP        | I/O    | 10BASE-T/100BASE-TX MDI 模式下的差分输入;10BASE-T/100BASE-TX MDIX 模式下的差分输出。 |
| 11                                                                                                                                                                                                            | RXN        |        |                                                                     |
| 14                                                                                                                                                                                                            | TXP        | I/O    | 10BASE-T/100BASE-TX MDI 模式下的差分输出;10BASE-T/100BASE-TX MDIX 模式下的差分输入。 |
| 15                                                                                                                                                                                                            | TXN        |        |                                                                     |
| 7、21                                                                                                                                                                                                          | VCC33      | P      | 3.3V 电源输入,建议 0.1uF 并联 10uF 或 4.7uF 对地电容贴近芯片放置。                      |
| 39、56、70、83、101、122                                                                                                                                                                                           | VCCIO      | P      | I/O 接口的电源输入,建议 0.1uF 对地电容贴近芯片放置。                                    |
| 28                                                                                                                                                                                                            | VDDK       | P      | 外接 1uF 对地电容贴近芯片放置。                                                  |
| 54、82                                                                                                                                                                                                         | VDDK       | P      | 外接 0.1uF 对地电容贴近芯片放置。                                                |
| 2、9、16、17、22、27、29、55、64、71、109                                                                                                                                                                               | GND        | P      | 公共接地端。                                                              |
| 1、3、4、5、6、8、12、13、18、23、24、25、26、30、31、32、33、34、35、36、37、38、40、41、42、43、44、45、46、47、57、58、65、66、67、68、69、72、73、74、75、76、77、78、79、80、81、84、85、86、87、88、89、90、91、92、93、95、96、97、102、103、105、108、110、111、127、128 | NC         | -      | 保留引脚,建议悬空。                                                          |
| 19                                                                                                                                                                                                            | XI         | I      | 晶体振荡器输入,需外接 25MHz 晶体一端,或外部时钟输入,内置晶振匹配电容。                            |
| 20                                                                                                                                                                                                            | XO         | 0      | 晶体振荡器反相输出,需外接 25MHz 晶体另一端,内置晶振匹配电容。                                 |
| 48                                                                                                                                                                                                            | GPI00      | I/O    | 通用输入输出引脚0,默认配置为输入。                                                  |
| 49                                                                                                                                                                                                            | GPI01      | I/O    | 通用输入输出引脚1,默认配置为输入。                                                  |
| 50                                                                                                                                                                                                            | GPI02      | I/O    | 通用输入输出引脚2,默认配置为输入。                                                  |
| 51                                                                                                                                                                                                            | GPI03/RDY# | I/O    | GPI03:通用输入输出引脚3,默认配置为输出;RDY#:CH395P复位后,输出低电平。                       |
| 52                                                                                                                                                                                                            | RST        | 0      | 电源上电复位和外部复位输出,高电平有效。                                                |
| 53                                                                                                                                                                                                            | SEL        | I,PU   | 在芯片内部复位期间作为接口配置输入使用,其具体配置方法详见章节6.1。                                 |
| 59                                                                                                                                                                                                            | GPI04      | I/O    | 通用输入输出引脚4,默认配置为输入。                                                  |
| 60                                                                                                                                                                                                            | GPI05      | I/O    | 通用输入输出引脚5,默认配置为输入。                                                  |
| 61                                                                                                                                                                                                            | GPI06      | I/O    | 通用输入输出引脚6,默认配置为输入。                                                  |
| 62                                                                                                                                                                                                            | GPI07      | I/O    | 通用输入输出引脚7,默认配置为输入。                                                  |
| 63                                                                                                                                                                                                            | RSTI       | I,PU   | 外部复位输入,低电平有效,内置上拉电阻。                                                |
| 98                                                                                                                                                                                                            | INT#       | 0      | 中断请求输出,低电平有效。                                                       |
| 99                                                                                                                                                                                                            | A0         | I,PU   | 并口的地址输入,区分命令口与数据口,内置上拉电阻;当A0=1时可以写命令,当A0=0时可以读写数据。                  |
| 100                                                                                                                                                                                                           | PCS#       | I,PU   | 并口的片选控制输入,低电平有效,内置上拉电阻。                                             |
| 106                                                                                                                                                                                                           | RD#        | I,PU   | 并口的读选通输入,低电平有效,内置上拉电阻。                                              |
| 107                                                                                                                                                                                                           | WR#        | I,PU   | 并口的写选通输入,低电平有效,内置上拉电阻。                                              |
| 112                                                                                                                                                                                                           | RXD        | I,PU   | 异步串口的串行数据输入,内置上拉电阻。                                                 |
| 113                                                                                                                                                                                                           | TXD        | I/O    | 在芯片内部复位期间为接口配置输入,内置上拉电阻,配置方法详参6.1章节;在芯片复位完成后为异步串口的串行数据输出。           |
| 114                                                                                                                                                                                                           | SCS        | I,PU   | SPI接口的片选输入,低电平有效,内置上拉电阻。                                            |
| 115                                                                                                                                                                                                           | SCK        | I,PU   | SPI接口的串行时钟输入,内置上拉电阻。                                                |
| 116                                                                                                                                                                                                           | SDI        | I,PU   | SPI接口的串行数据输入,内置上拉电阻。                                                |
| 117                                                                                                                                                                                                           | SDO        | 0      | SPI接口的串行数据输出。                                                       |
| 118~121123~126                                                                                                                                                                                                | D0~D7      | I/O,PU | 并口的8位双向数据总线,内置上拉电阻。                                                 |
| 94                                                                                                                                                                                                            | ELINK#     | 0      | 网络连接指示LED输出:低电平表示以太网PHY已连接;高电平表示以太网PHY未连接。                          |
| 104                                                                                                                                                                                                           | EACT#      | 0      | 载波感应指示LED输出:LED闪烁表示有载波感应信号。                                         |

注1：表格缩写解释： |=输入；0=输出；I/0=输入/输出; P =电源；PU= 内置上拉电阻。

## 5、命令

本手册中的数据，后缀 B 或 b 为二进制数，后缀 H 为十六进制数，否则为十进制数。

低字节在前（Little-Endian）的双字数据（共 32 位）指：先是最低字节（位 7～位 0），接着是较低字节（位 15～位 8），然后是较高字节（位 23～位 16），最后是最高字节（位 31～位 24）。

数据流是指由若干连续字节组成的数据块，总长度最小为 0。

下表输入数据和输出数据的括号中的数字为参数的字节数，没有括号则默认为 1 个字节。

本手册中所指的单片机基本适用于 DSP 或者 MCU/MPU/SCM 等。

Socket Pair(插口对)包含源 IP，源端口，目的 IP 和目的端口的四元组，可以唯一确定互联网中的连接双方。本手册简称 Socket。CH395 内部可以同时提供 8 个 Socket，其索引值分别为 0、1、2、3、4、5、6、7。

本手册约定的 IP 和 MAC 地址高字节和低字节可能与某些文档不同，仅为方便说明：

如 IP 地址为 192.168.1.2，其中 192 为最低字节，2 为最高字节。本文称(IP)低字节在前。

如 MAC 地址为 00.01.02.03.04.05，其中 00 为最低字节，05 为最高字节。本文称（MAC）低字节在前。

本手册中所有包含 IP 地址输入或者输出的命令，字节顺序均为 IP 低字节在前。

本手册中所有包含 MAC 地址输入或者输出的命令，字节顺序均为 MAC 低字节在前。

<p align="center">表 命令表</p>

| 代码        | 命令名称 CMD_               | 输入数据        | 输出数据      | 命令用途               |
| --------- | ----------------------- | ----------- | --------- | ------------------ |
| 01H       | GET_IC_VER              |             | 版本号       | 获取芯片及固件版本          |
| 02H       | SET_BAUDRATE            | 波特率系数(3)    | 操作状态      | 设置串口通讯波特率          |
| 03H       | ENTER_SLEEP             |             |           | 进入低功耗睡眠挂起状态        |
| 05H       | RESET_ALL               |             | (等15ms)   | 执行硬件复位             |
| 06H       | CHECK_EXIST             | 任意数据        | 按位取反      | 测试通讯接口和工作状态        |
| 19H       | GET_GLOB_INT_STATUS_ALL |             | 全局中断状态(2) | 获取全局中断状态           |
| 20H       | SET_PHY                 | PHY连接方式     |           | 设置PHY连接方式          |
| 21H       | SET_MAC_ADDR            | MAC地址(6)    |           | 设置MAC地址            |
| 22H       | SET_IP_ADDR             | IP地址(4)     |           | 设置IP地址             |
| 23H       | SET_GWIP_ADDR           | 网关地址(4)     |           | 设置网关IP地址           |
| 24H       | SET_MASK_ADDR           | 子网掩码(4)     |           | 设置子网掩码             |
| 25H       | SET_MAC_FILT            | 过滤模式        |           | 设置MAC过滤模式          |
| HASHO(4)  |                         |             |           |                    |
| HASH1(4)  |                         |             |           |                    |
| 26H       | GET_PHY_STATUS          |             | PHY的状态    | 获取PHY的状态           |
| 27H       | INIT_CH395              |             |           | 初始化CH395芯片         |
| 28H       | GET_UNREACH_IPPORT      |             | 不可达信息(8)  | 获取不可达IP,端口和协议      |
| 29H       | GET_GLOB_INT_STATUS     |             | 全局中断状态    | 获取全局中断状态           |
| 2AH       | SET_RETRAN_COUNT        | 重试次数        |           | 设置重试次数,最大20次       |
| 2BH       | SET_RETRAN_PERIOD       | 重试周期(2)     |           | 设置重试周期,最大1000ms    |
| 2CH       | GET_CMD_STATUS          |             | 命令执行状态    | 获取命令执行状态           |
| 2DH       | GET_REMOT_IPP_SN        | Socket索引    | IP和端口(6)  | 获取远端(目的)的IP和端口     |
| 2EH       | CLEAR_RECV_BUF_SN       | Socket索引    |           | 清空Socket的接收缓冲区     |
| 2FH       | GET_SOCKET_STATUS_SN    | Socket索引    | Socket状态  | 获取Socket状态         |
| 30H       | GET_INT_STATUS_SN       | Socket索引    | Socket中断  | 获取Socket的中断状态      |
| 31H       | SET_IP_ADDR_SN          | Socket索引    |           | 设置Socket的目的IP地址    |
| 目的IP(4)   |                         |             |           |                    |
| 32H       | SET_DES_PORT_SN         | Socket索引    |           | 设置Socket的目的端口      |
| 目的端口(2)   |                         |             |           |                    |
| 33H       | SET_SOUR_PORT_SN        | Socket索引    |           | 设置Socket的源端口       |
|           |                         | 源端口(2)      |           |                    |
| 34H       | SET_PROTO_TYPE_SN       | Socket索引    |           | 设置Socket的工作模式      |
| 协议类型      |                         |             |           |                    |
| 35H       | OPEN_SOCKET_SN          | Socket索引    |           | 打开Socket           |
| 36H       | TCP_LISTEN_SN           | Socket索引    |           | 启动Socket监听         |
| 37H       | TCP_CONNECT_SN          | Socket索引    |           | 启动Socket连接         |
| 38H       | TCP_DISCONNECT_SN       | Socket索引    |           | 断开Socket的TCP连接     |
| 39H       | WRITE_SEND_BUF_SN       | Socket索引    |           | 向Socket发送缓冲区写数据    |
| 长度(2)     |                         |             |           |                    |
| 数据流(N)    |                         |             |           |                    |
| 3BH       | GET_RECV_LEN_SN         | Socket索引    | 长度(2)     | 获取Socket接收数据长度     |
| 3CH       | READ_RECV_BUF_SN        | Socket索引    | 数据流(N)    | 从Socket接收缓冲区接收数据   |
| 长度(2)     |                         |             |           |                    |
| 3DH       | CLOSE_SOCKET_SN         | Socket索引    |           | 关闭Socket           |
| 3EH       | SET_IPRAW_PRO_SN        | Socket索引    |           | 设置Socket的IP包的协议字段  |
| IP协议字段    |                         |             |           |                    |
| 3FH       | PING_ENABLE             | 使能标志        |           | PING使能             |
| 40H       | GET_MAC_ADDR            |             | MAC地址(6)  | 获取MAC地址            |
| 41H       | DHCP_ENABLE             | 使能标志        |           | 启动(停止)DHCP         |
| 42H       | GET_DHCP_STATUS         |             | DHCP状态    | 获取DHCP状态           |
| 43H       | GET_IP_INF              |             | IP等信息     | 获取IP,MASK,DNS等信息   |
| 44H       | SET_ARP                 | ARP重传周期     |           | 设置ARP重传周期和次数       |
| ARP重传次数   |                         |             |           |                    |
| 50H       | SET_TCP_MSS             | TCP MSS(2)  |           | 设置TCP MSS          |
| 51H       | SET_TTL                 | TTL         |           | 设置TTL值,最大128       |
| 52H       | SET_RECV_BUF            | Socket索引    |           | 设置Socket接收缓冲区      |
| 起始块地址     |                         |             |           |                    |
| 块个数       |                         |             |           |                    |
| 53H       | SET_SEND_BUF            | Socket索引    |           | 设置Socket发送缓冲区      |
| 起始块地址     |                         |             |           |                    |
| 块个数       |                         |             |           |                    |
| 55H       | SET_FUN_PARA            | 功能参数(4)     |           | 设置功能参数             |
| 56H       | SET_KEEPALIVE_IDLE      | 4字节时间参数     |           | 设置KEEPALIVE空闲时间    |
| 57H       | SET_KEEPALIVE_INTVL     | 4字节时间参数     |           | 设置KEEPALIVE超时时间    |
| 58H       | SET_KEEPALIVE_CNT       | 重试次数        |           | 设置KEEPALIVE超时重试次数  |
| 59H       | SET_KEEPALIVE_SN        | Socket索引    |           | 设置Socket KEEPALIVE |
| 配置        |                         |             |           |                    |
| E9H       | EEPROM_ERASE            |             |           | 擦除EEPROM           |
| EAH       | EEPROM_WRITE            | EEPROM地址(2) |           | 写EEPROM            |
| 长度        |                         |             |           |                    |
| 数据流(N)    |                         |             |           |                    |
| EBH       | EEPROM_READ             | EEPROM地址(2) | 数据流(N)    | 读EEPROM            |
| 长度        |                         |             |           |                    |
| ECH       | READ_GPIO_REG           | GPIPO寄存器地址  | GPIO寄存器值  | 读GPIO寄存器           |
| EDH       | WRITE_GPIO_REG          | GPIPO寄存器地址  |           | 写GPIO寄存器           |
| GPIPO寄存器值 |                         |             |           |                    |

表中阴影部分的命令通常需要执行一定的时间并且查询该命令的执行状态，单片机可以通过GET_CMD_STATUS 来获取状态（关于状态定义参考 CH395INC.H）。

## 5.1 CMD_GET_IC_VER

该命令用于获取芯片及固件版本，返回的 1 个字节数据是版本号。

## 5.2 CMD_SET_BAUDRATE

该命令用于设置 CH395 的串口通讯波特率。在 CH395 工作于串口通讯方式时，复位后默认的通讯波特率由SDO，SDI和SCK三个引脚的电平组合设定（参考本手册第6.3节），这些引脚都悬空时默认 9600bps。如果单片机支持较高的通讯速度，可以通过该命令动态调整串口通讯波特率。该命令需要输入三个数据，分别是波特率系数 0、波特率系数 1、波特率系数 2，下表是与波特率的对应关系。

<p align="center">表 波特率</p>

| 波特率系数2                                              | 波特率系数1 | 波特率系数0 | 串口通讯波特率(bps) |
| --------------------------------------------------- | ------ | ------ | ------------ |
| 00H                                                 | 12H    | COH    | 4800         |
| 00H                                                 | 25H    | 80H    | 9600         |
| 00H                                                 | 4BH    | 00H    | 19200        |
| 00H                                                 | 96H    | 00H    | 38400        |
| 00H                                                 | E1H    | 00H    | 57600        |
| 01H                                                 | 2CH    | 00H    | 76800        |
| 01H                                                 | C2H    | 00H    | 115200       |
| 07H                                                 | 08H    | 00H    | 460800       |
| 0EH                                                 | 10H    | 00H    | 921600       |
| 0FH                                                 | 42H    | 40H    | 1M           |
| 1EH                                                 | 84H    | 80H    | 2M           |
| 4CH                                                 | 4BH    | 40H    | 5M           |
| 98H                                                 | 96H    | 80H    | 10M          |
| 计算公式:BaudRate = (波特率系数2<<16) + (波特率系数1<<8) + 波特率系数0 |        |        |              |

设置串口通信波特率配置命令的执行时间默认为TE8（最短为1ms，见表7-4）。完成后，CH395将以新波特率输出操作状态，单片机需在 TE8 时间内尽快调整好自身波特率，等待 CH395 应答。

## 5.3 CMD_ENTER_SLEEP

该命令使 CH395 芯片进入低功耗睡眠挂起状态。在串口模式下将 CH395 RXD 引脚拉低 35us 及以上，在 SPI 或并口模式下将 SCS 或 PCS#片选脚拉低 35us 及以上可使 CH395 退出低功耗状态，所以单片机在发出 CMD_ENTER_SLEEP 命令后，应该立即使 SCS 或 PCS#片选无效。

进入睡眠状态 CH395 的 MAC 和 PHY 将会进入掉电模式，断开以太网连接。

从睡眠模式唤醒后，CH395 需要约 4ms 的时间来完成唤醒过程。在这段唤醒阶段内，CH395 不会解析或响应任何接收到的命令码。因此，在 CH395 被唤醒期间，请勿向 CH395 发送任何命令码。建议用户唤醒 4ms 后再对 CH395 进行操作。

## 5.4 CMD_RESET_ALL

该命令使 CH395 执行硬件复位。通常情况下，硬件复位在 15ms 时间之内完成。

## 5.5 CMD_CHECK_EXIST

该命令用于测试通讯接口和工作状态，以检查 CH395 是否正常工作。该命令需要输入 1 个字节数据，可以是任意数据，如果 CH395 正常工作，那么 CH395 的输出数据是输入数据的按位取反。例如，输入数据是 57H，则输出数据是 A8H。

## 5.6 CMD_SET_PHY

该命令用设置CH395以太网PHY的连接方式。默认为自动协商方式。该命令需要输入1个字节数据，该数据为连接方式代码：

连接方式代码为 01H 时断开 PHY 连接；

连接方式代码为 02H 时 PHY 为 10M 全双工；

连接方式代码为 04H 时 PHY 为 10M 半双工；

连接方式代码为 08H 时 PHY 为 100M 全双工；

连接方式代码为 10H 时 PHY 为 100M 半双工；

连接方式代码为 20H 时 PHY 自动协商。

CH395 收到此命令后会复位 MAC 和 PHY，按照新设置的连接方式重新进行连接。如果以太网已经连接，则会断开并重新连接。

## 5.7 CMD_SET_MAC_ADDR

该命令用于设置 CH395 的 MAC 地址，需要输入 6 个字节的 MAC，MAC 地址低字节在前。CH395 芯片将会把 MAC 地址保存在内部的 EEPROM 中。该命令需要约 30us 执行完毕。

CH395 芯片出厂时已经烧录了由 IEEE 分配的 MAC 地址，如非必要请勿设置 MAC 地址。

## 5.8 CMD_SET_IP_ADDR

该命令用于设置 CH395 的 IP 地址，需要输入 4 个字节的 IP 地址，IP 低字节在前。本手册中所有包含 IP 输入或者输出的命令，字节顺序均为 IP 低字节在前，以下将不再说明。

## 5.9 CMD_SET_GWIP_ADDR

该命令用于设置 CH395 的网关地址，需要输入 4 个字节的 IP 地址。

## 5.10 CMD_SET_MASK_ADDR

该命令用于设置 CH395 的子网掩码，该命令需要输入 4 个字节的掩码。默认为 255.255.255.0，可以不设置。

## 5.11 CMD_SET_MAC_FILT

该命令用于设置 MAC 过滤模式。MAC 可以设置多种过滤模式。该命令需要输入 9 个字节数据，第1 个字节为过滤模式，该数据的各位含义如下：

<p align="center">表 MAC 过滤表</p>

| 位     | 名称            | 描述     |
| ----- | ------------- | ------ |
| [5:7] | -             | 保留     |
| 4     | SEND_ENABLE   | 发送使能   |
| 3     | RECV_ENABLE   | 接收使能   |
| 2     | RECV_MULTIPKT | 接收多播包  |
| 1     | RECV_ALL      | 接收所有数据 |
| 0     | RECV_BROADPKT | 接收广播包  |

以上各位为 1 表示开启，为 0 表示关闭。CH395 复位后默认 RECV_BROADPKT、RECV_ENABLE、SEND_ENABLE 开启。

下表为各位的含义：

<p align="center">表 MAC 过滤含义</p>

| RECV_ENABLE | RECV_ALL | RECV_BROADPKT | RECV_MULTIPKT | 描述                              |
| ----------- | -------- | ------------- | ------------- | ------------------------------- |
| 1           | 0        | 0             | 0             | 接收与 MAC 地址相匹配的数据包               |
| 1           | 1        | X             | X             | 接收所有数据包                         |
| 1           | 0        | 1             | 0             | 接收与 MAC 地址相匹配的数据包接收广播数据包        |
| 1           | 0        | 0             | 1             | 接收与 MAC 地址相匹配的数据包接收多播数据包        |
| 1           | 0        | 1             | 1             | 接收与 MAC 地址相匹配的数据包接收广播数据包接收多播数据包 |
| 0           | X        | X             | X             | 禁止接收                            |

第 2 至第 5 字节为 HASH0（哈希表 0），第 6 至第 9 字节为 HASH1（哈希表 1），HASH0 与 HASH1 仅在多播开启下有效。

HASH0 和 HASH1 共同构成一个 64 位的 HASH 表，0-31 位为 HASH0，32-63 位为 HASH1。

HASH 表计算方法：将多播地址使用标准的以太网冗余校验（CRC32）计算出一个 32 位的 CRC值，使用此 CRC 值的高 6 位作为索引值，将 HASH 表对应的位写 1。例如，多播地址计算出 CRC 值的高 6 位为 32，则应该将 HASH1 的第 0 位写 1。

## 5.12 CMD_GET_PHY_STATUS

该命令用于获取 PHY 的连接状态。收到该命令后，CH395 会查询当前 PHY 连接状态并输出 1 个字节的 PHY 的连接状态代码：

连接状态代码为 01H 时表示 PHY 连接断开；

连接状态代码为 02H 时表示 PHY 连接为 10M 全双工；

连接状态代码为 04H 时表示 PHY 连接为 10M 半双工；

连接状态代码为 08H 时表示 PHY 连接为 100M 全双工；

连接状态代码为 10H 时表示 PHY 连接为 100M 半双工。

## 5.13 CMD_INIT_CH395

该命令用于初始化 CH395，包括：初始化 CH395 的 MAC、PHY 以及 TCP/IP 协议栈。该命令需要约5ms 执行完毕。单片机可以发送 GET_CMD_STATUS 来查询是否执行完毕和执行状态。

## 5.14 CMD_GET_UNREACH_IPPORT

该命令用于获取不可达 IP，端口以及协议类型。当接收到不可达报文后，CH395 会产生不可达中断。单片机可以用该命令来获取不可达信息，收到此命令后 CH395 会依次输出 1 字节的不可达代码，1 个字节协议类型，2 个字节的端口号（低字节在前），4 个字节 IP。单片机可以根据不可达代码来判断是协议不可达，端口不可达还是IP不可达。关于不可达代码请参考RFC792（CH395INC.H定义了 4 种常见的不可达代码）。

## 5.15 CMD_GET_GLOB_INT_STATUS

该命令用于获取全局中断状态，收到此命令后 CH395 会输出 1 个字节的全局中断状态。全局中断状态定义如下：

\$ 5-5\ncong E F 45 F 1

|   |   |   |
|---|---|---|
|位|名称|描述|
|7|GINT_STAT_SOCK3|Socket3 中断|
|6|GINT_STAT_SOCK2|Socket2 中断|
|5|GINT_STAT_SOCK1|Socket1 中断|
|4|GINT_STAT_SOCK0|Socket0 中断|
|3|GINT_STAT_DHCP|DHCP 中断|
|2|GINT_STAT_PHY_CHANGE|PHY 状态改变中断|
|1|GINT_STAT_IP_CONFLI|IP 冲突|
|0|GINT_STAT_UNREACH|不可达中断|

① GINT_STAT_UNREACH：不可达中断。当 CH395 收到 ICMP 不可达中断报文后，将不可达 IP 数据包的 IP 地址，端口，协议类型保存到不可达信息表中，然后产生此中断，单片机收到此中断，可以发送 GET_UNREACH_IPPORT 命令来获取不可达信息。 ② GINT_STAT_IP_CONFLI：IP 冲突中断。当 CH395 检测到自身 IP 地址和同一网段内的其他网络设备 IP 地址相同时会产生此中断。 ③ GINT_STAT_PHY_CHANGE：PHY 变化中断。当 CH395 的 PHY 连接有变化时产生此中断，例如 PHY状态由连接状态变化为断开状态或者由断开状态变化为连接状态。单片机可以发送 GET_PHY_STATUS命令来获取当前 PHY 连接的状态。 ④ GINT_STAT_DHCP：DHCP 中断。如果单片机使能 CH395 的 DHCP 功能，DHCP 成功或超时后 CH395将会产生此中断，单片机可以发送 CMD_GET_DHCP_STATUS 命令获取 DHCP 状态，如果状态为 0，表示成功，否则为超时失败。 ⑤ GINT_STAT_SOCK0～GINT_STAT_SOCK3：Socket 中断。当 Socket 有中断事件时 CH395 会产生此中断，单片机需要发送 GET_INT_STATUS_SN 获取 Socket 的中断状态。请参考 GET_INT_STATUS_SN部分。

此命令执行完毕后，CH395 会将 INT#引脚置为高电平并将全局中断状态清除。

## 5.16 CMD_GET_GLOB_INT_STATUS_ALL

该命令用于获取全局中断状态，收到此命令后 CH395 会输出 2 个字节的全局中断状态。全局中断状态定义如下：

<p align="center">表 全局中断 2</p>

| 位       | 名称                   | 描述         |
| ------- | -------------------- | ---------- |
| [12:15] | -                    | 保留         |
| 11      | GINT_STAT_SOCK7      | Socket7 中断 |
| 10      | GINT_STAT_SOCK6      | Socket6 中断 |
| 9       | GINT_STAT_SOCK5      | Socket5 中断 |
| 8       | GINT_STAT_SOCK4      | Socket4 中断 |
| 7       | GINT_STAT_SOCK3      | Socket3 中断 |
| 6       | GINT_STAT_SOCK2      | Socket2 中断 |
| 5       | GINT_STAT_SOCK1      | Socket1 中断 |
| 4       | GINT_STAT_SOCK0      | Socket0 中断 |
| 3       | GINT_STAT_DHCP       | DHCP 中断    |
| 2       | GINT_STAT_PHY_CHANGE | PHY 状态改变中断 |
| 1       | GINT_STAT_IP_CONFLI  | IP 冲突      |
| 0       | GINT_STAT_UNREACH    | 不可达中断      |

关于位 0-7 请参考 5.15 章节。

GINT_STAT_SOCK4～GINT_STAT_SOCK7：Socket 中断。当 Socket 有中断事件时 CH395 会产生此中断，单片机需要发送 GET_INT_STATUS_SN 获取 Socket 的中断状态。请参考 GET_INT_STATUS_SN 部分。

CH395 获取可以通过 CMD_GET_GLOB_INT_STATUS 和 CMD_GET_GLOB_INT_STATUS_ALL 两个命令来获取中断状态，前者只能获取到低 8 位的中断状态，后者可以获取全部的中断状态，使用时需要注意，任何版本的芯片都支持 CMD_GET_GLOB_INT_STATUS 命令，如果芯片版本号大于等于 0X44 且使用了Socket4 ～ Socke7 ， 则 只 能 用 CMD_GET_GLOB_INT_STATUS_ALL 。 芯 片 版 本 号 小 于 0X44 不 支 持CMD_GET_GLOB_INT_STATUS_ALL 命令。

## 5.17 CMD_SET_RETRAN_COUNT

该命令用于设置重试次数，需要输入 1 个字节的重试次数，允许最大值为 20，输入数据大于 20，则会按 20 处理。默认重试次数为 12 次，重试仅在 TCP 模式下有效。

## 5.18 CMD_SET_RETRAN_PERIOD

该命令用于设置重试周期，需要输入 2 个字节（低字节在前）的周期数，单位为 ms，允许最大值为 1000。重试的总时间为 N*M，N 为重试次数，M 为重试周期。默认重试周期为 500ms，重试仅在TCP 模式下有效。

## 5.19 CMD_GET_CMD_STATUS

该命令用于获取命令执行的状态。CH395 会输出 1个字节数据，此数据为命令执行的状态。命令执行状态如下：

<p align="center">表 命令执行状态</p>

| 代码  | 名称                | 描述         |
| --- | ----------------- | ---------- |
| 00H | CH395_ERR_SUCCESS | 成功         |
| 10H | CH395_ERR_BUSY    | 忙,表示命令正在执行 |
| 11H | CH395_ERR_MEM     | 内存管理错误     |
| 12H | CH395_ERR_BUF     | 缓冲区错误      |
| 13H | CH395_ERR_TIMEOUT | 超时         |
| 14H | CH395_ERR_RTE     | 路由错误       |
| 15H | CH395_ERR_ABRT    | 连接中止       |
| 16H | CH395_ERR_RST     | 连接复位       |
| 17H | CH395_ERR_CLSD    | 连接关闭       |
| 18H | CH395_ERR_CONN    | 无连接        |
| 19H | CH395_ERR_VAL     | 值错误        |
| 1AH | CH395_ERR_ARG     | 参数错误       |
| 1BH | CH395_ERR_USE     | 已被使用       |
| 1CH | CH395_ERR_IF      | MAC 错误     |
| 1DH | CH395_ERR_ISCONN  | 已连接        |
| 20H | CH395_ERR_OPEN    | 已打开        |

如果单片机收到 CH395_ERR_BUSY，表示 CH395 正在执行命令，单片机则应该延时 2ms 以上再次发送 CMD_GET_CMD_STATUS 命令获取状态。

命令码表中阴影部分的命令均需要发送 CMD_GET_CMD_STATUS 来获取执行状态。

## 5.20 CMD_GET_REMOT_IPP_SN

该命令用于获取远端的 IP 地址和端口号，需要输入 1 个字节的 Socket 索引值，CH395 会输出 4个字节 IP地址，2个字节（低字节在前）端口号。Socket工作在 TCP Server模式且连接建立后，单片机可以通过该命令获取远端的 IP 地址及端口号。

## 5.21 CMD_CLEAR_RECV_BUF_SN

该命令用于清空 Socket 的接收缓冲区，需要输入 1 个字节的 Socket 索引值。收到此命令，CH395 会将此 Socket 的接收长度清零，接收指针指向缓冲区头部。

## 5.22 CMD_GET_SOCKET_STATUS_SN

该命令用于获取 Socket 的状态，需要输入 1 个字节的 Socket 索引值。CH395 接收到此命令后会输出 2 个字节的状态码。

第 1 个状态码为 Socket 的状态码，Socket 的状态码定义如下：

<p align="center">表 Socket 状态码</p>

| 代码  | 名称            |
| --- | ------------- |
| 00H | SOCKET_CLOSED |
| 05H | SOCKET_OPEN   |

第 2 个状态码为 TCP 的状态码，仅在 TCP 模式且已经被打开时有意义，TCP 状态码定义如下：

<p align="center">表 TCP 状态码</p>

| 代码  | 名称              | 描述                |
| --- | --------------- | ----------------- |
| 00H | TCP_CLOSED      | 关闭                |
| 01H | TCP_LISTEN      | 监听                |
| 02H | TCP_SYN_SENT    | SYN 发送            |
| 03H | TCP_SYN_RCVD    | SYN 接收            |
| 04H | TCP_ESTABLISHED | TCP 连接建立          |
| 05H | TCP_FIN_WAIT_1  | 主动关闭方首次发送 FIN     |
| 06H | TCP_FIN_WAIT_2  | 主动关闭方收到 FIN 的 ACK |
| 07H | TCP_CLOSE_WAIT  | 被动关闭方收到 FIN       |
| 08H | TCP_CLOSING     | 正在关闭              |
| 09H | TCP_LAST_ACK    | 被动关闭方发送 FIN       |
| 0AH | TCP_TIME_WAIT   | 2MLS 等待状态         |

TCP 状态均为 TCP/IP 协议中规定的状态，详细的含义请参考 TCP/IP 协议。

应用上只需关心：“TCP_CLOSED”、“TCP_LISTEN”、“TCP_ESTABLISHED”。其他状态芯片会自动处理并更新。

## 5.23 CMD_GET_INT_STATUS_SN

该命令用于获取 Socket 的中断状态，需要输入 1 个字节的 Socket 索引值，CH395 收到该命令后会输出 1 个字节的 Socket 的中断码，中断码各位定义如下：

<p align="center">表 Socket 中断状态</p>

| 位   | 名称                    | 描述      |
| --- | --------------------- | ------- |
| 7   | -                     | 保留      |
| 6   | SINT_STAT_TIM_OUT     | 超时      |
| 5   | -                     | 保留      |
| 4   | SINT_STAT_DISCONNECT  | TCP 断开  |
| 3   | SINT_STAT_CONNECT     | TCP 连接  |
| 2   | SINT_STAT_RECV        | 接收缓冲区非空 |
| 1   | SINT_STAT_SEND_OK     | 发送成功    |
| 0   | SINT_STAT_SENBUF_FREE | 发送缓冲区空闲 |

① SINT_STAT_SENBUF_FREE，发送缓冲区空闲中断，单片机向 Socket 发送缓冲区写入数据后，CH395 会将数据快速复制到内部的协议栈或者 MAC 缓冲区中，以便封装数据，当数据复制完毕后，会产生此中断，单片机可以继续向发送缓冲区写入后续数据。单片机向 Socket 发送缓冲区写入一次数据后，必须等到产生此中断后才可以写入下一次数据。 ② SINT_STAT_SEND_OK，发送成功中断，产生此中断，表示数据包被成功发送，Sokcet 每发送成功一包数据后会产生此中断。单片机向 Socket 缓冲区写入一次数据后，CH395 可能会封装成若干个数据包进行发送，所以可能会产生若干次发送成功中断。 ③ SINT_STAT_CONNECT，TCP 连接中断，仅在在 TCP 模式下有效。表明 TCP 连接成功，单片机必须在产生此中断后，才可以进行数据传输。 ④ SINT_STAT_DISCONNECT，TCP 连接断开中断，仅在 TCP 模式下有效，表明 TCP 连接断开。

⑤ SINT_STAT_TIM_OUT，TCP 模式下，TCP 连接、断开、发送数据等过程中出现超时，会产生此中断。IPRAW、UDP 模式下，发送数据失败也会产生此中断。

产生 SINT_STAT_DISCONNECT 和 SINT_STAT_TIM_OUT 中断后，根据 FUN_PARA_FLAG_SOCKET_CLOSE位为 1 还是为 0，CH395 会做出不同的动作。如果 FUN_PARA_FLAG_SOCKET_CLOSE 为 0 则当产生上述两种中断后，CH395 会主动将 Socket 状态置为关闭状态并将相关缓冲区全部清除。反之则不会对Socket 状态和相关缓冲区做任何操作，以方便外部单片机在 TCP 断开或者超时后将残留的数据读出，当外部单片机将数据读出后，必须发送关闭命令将 Socket 关闭。

## 5.24 CMD_SET_IP_ADDR_SN

该命令用于设置 Socket 目的 IP 地址，需要输入 1 个字节的 Socket 索引值和 4 个字节的目的 IP地址。在 Socket 工作在 IPRAW、UDP、TCP Client 模式下，必须在发送 CMD_OPEN_SOCKET_SN 命令前之前设置目的 IP。

## 5.25 CMD_SET_DES_PORT_SN

该命令用于设置 Socket 目的端口，需要输入 1 个字节的 Socket 索引值和 2 个字节的目的端口（低字节在前）。Socket 工作在 UDP、TCP Client 模式下，此值必须设置。

## 5.26 CMD_SET_SOUR_PORT_SN

该命令用于设置 Socket 源端口，需要输入 1 个字节的 Socket 索引值和 2 个字节的源端口（低字节在前）。如果两个或者多个 Socket 都采用相同的模式，则源端口号不得相同。例如：Socket 0为 UDP 模式，源端口为 600，Socket 1 同样为 UDP 模式，不可以再使用源端口 600，否则可能会导致打开失败。

## 5.27 CMD_SET_PROTO_TYPE_SN

该命令用于设置Socket工作模式，需要输入1个字节的Socket索引值和1个字节的工作模式，工作模式定义如下：

<p align="center">表 Socket 工作模式</p>

| 代码  | 名称                 | 描述         |
| --- | ------------------ | ---------- |
| 03H | PROTO_TYPE_TCP     | TCP 模式     |
| 02H | PROTO_TYPE_UDP     | UDP 模式     |
| 01H | PROTO_TYPE_MAC_RAW | MAC 原始报文模式 |
| 00H | PROTO_TYPE_IP_RAW  | IP 原始报文模式  |

此命令必须在 CMD_OPEN_SOCKET_SN 之前执行，详细步骤请参考 9.2 应用参考步骤。

## 5.28 CMD_OPEN_SOCKET_SN

该命令用于打开 Socket，是使用 Socket 的必要步骤，需要输入 1 个字节的 Socket 索引值。在发送完此命令后，单片机应该发送GET_CMD_STATUS来查询命令执行状态。在UDP、IPRAW、MACRAW模式下打开 Socket 并返回成功后，即可进行数据传输。在发送此命令前，必须对目的 IP、协议类型、源端口、目的端口等进行必要设置，详细步骤请参考 9.2 应用参考步骤。

## 5.29 CMD_TCP_LISTEN_SN

该命令仅在 TCP模式下有效，使能 Socket进入监听模式即 TCP Server模式。需要输入 1个字节的 Socket 索引，该命令必须在 OPEN_SOCKET_SN 之后执行。在发送完此命令后，单片机应该发送GET_CMD_STATUS 来查询命令执行的状态。

在 TCP Server 模 式下 ，Socket 会一直检测连接事件 ，直到 连接成 功 后，会 产生SINT_STAT_CONNECT 中断。每个 Socket 只可以建立一个连接。如果再次接收到符合条件的连接事件，Socket 将向试图连接的远端发送 TCP RESET。

## 5.30 CMD_TCP_CONNECT_SN

该命令仅在 TCP模式下有效，使能 Socket进入连接模式即 TCP Client模式，需要输入 1个字节的 Socket 索引值。在发送完此命令后，单片机应该发送 GET_CMD_STATUS 来查询命令执行的状态。

在收到此命令后，Socket 将会发起连接事件，成功连接后，会产生 SINT_STAT_CONNECT 中断。如果连接过程中出现异常或者超过一定时间后未连接成功，会产生 SINT_STAT_TIM_OUT 中断。单片机接收到此中断，如果需要再次连接，需要重新打开 Socket，并进行 TCP_CONNECT_SN。

## 5.31 CMD_TCP_DISCONNECT_SN

该命令仅在 TCP 模式下有效，用于断开当前 TCP 连接，需要输入 1 个字节的 Socket 索引值，在发送完此命令后，单片机应该发送 GET_CMD_STATUS 来查询命令执行的状态。当前的 TCP 成功断开后会产生 SINT_STAT_DISCONNECT 中断。

## 5.32 CMD_WRITE_SEND_BUF_SN

该命令用于向 Socket 的发送缓冲区写入数据，需要输入 1 个字节的 Socket 索引值，2 个字节的长度（低字节在前）和若干字节的数据流。输入数据的长度不得大于发送缓冲区的大小，但是在MACRAW 模式下，输入的数据的长度最大只能为 1514，多余的数据将被丢弃。当外部单片机写完数据后，CH395 会根据 Socket 的工作模式进行数据包的封装，然后将其发送。在单片机未收到SINT_STAT_SENBUF_FREE 之前，不得向该 Socket 发送缓冲区再次写入数据。

## 5.33 CMD_GET_RECV_LEN_SN

该命令用于获取当前接收缓冲区的有效数据长度，需要输入 1 个字节的 Socket 索引值，CH395接收到该命令后输出 2 个字节的长度(低字节在前)。

## 5.34 CMD_READ_RECV_BUF_SN

该命令用于从 Socket 接收缓冲区读取数据，需要输入 1 个字节的 Socket 索引值，2 个字节的长度(低字节在前)，CH395 会根据长度值输出若干字节的数据流。实际应用中可以先发送 RECV_LEN_SN命令来获取当前缓冲区的实际有效长度。读取的数据长度可以小于缓冲区的实际有效数据长度，未读取的数据仍然保留在接收缓冲区中，单片机可以通过此命令继续读取。

在 MACRAW 模式下，处理方式有所不同，在 MACRAW 模式下，接收缓冲区为帧缓冲区，只可以缓存 1 帧以太网数据，CH395 在处理完 READ_RECV_BUF_SN 命令后，会将 Socket0 的接收缓冲区全部清除，所以单片机应一次将缓冲区的有效数据全部读出。

## 5.35 CMD_CLOSE_SOCKET_SN

该命令用于关闭 Socket，需要输入 1 个字节的 Socket 索引值。在关闭 Socket 后，Socket 的接收发送缓冲区被清空，但是配置信息仍然保留，下次使用该 Socket 时只需再次打开 Socket 即可。

在 TCP 模式下，关闭 Socket 前 CH395 会自动断开 TCP 连接。

## 5.36 CMD_SET_IPRAW_PRO_SN

该命令仅在 IPRAW 模式下有效，需要输入 1 个字节的 Socket 索引值，1 个字节的 IP 包协议字段

的协议码。该命令必须在 OPEN_SOCKET_SN 之前执行。

如果多个 Socket 均采用了 IPRAW 模式，则协议码不得重复使用。例如 Socket 0 和 Socket 1 均采用了 IPRAW 模式，则两个 Socket 的协议码不得相同，否则可能会导致打开 Socket 时失败。

IPRAW数据处理优先级高于UDP和TCP，所以协议码也必须不得与其他Socket相同。例如Socket0 采用 IPRAW 模式，协议码为 17（UDP 协议）。Socket 1 采用了 UDP 模式。这可能会导致 Socket 1 的数据被 Socket 0 接收到。

## 5.37 CMD_PING_ENABLE

该命令用于开启或者关闭 PING，需要输入 1 个字节的标志码，标志码为 1 表示开启 PING，为 0则表示关闭 PING。

## 5.38 CMD_GET_MAC_ADDR

该命令用于获取 MAC 地址，接收到该命令后，CH395 会输出 6 个字节的 MAC 地址。

## 5.39 CMD_DHCP_ENABLE

该命令用于启动或者停止 DHCP，需要输入 1 个字节的标志码，如果标志码为 1 则表示启动 DHCP，如果为 0 表示关闭 DHCP，在启动 DHCP 之前必须先要对 CH395 初始化。

在启动 DHCP 后，CH395 将会向网络上广播 DHCPDISCOVER 报文，用于发现 DHCP Server，找到DHCP Server 后申请地址以及其他配置参数，然后产生 GINT_STAT_DHCP 中断。产生此中断后，单片机可以发送命令 GET_DHCP_STATUS 来获取 DHCP 的状态。如果状态为 0，表示成功，则单片机可以发送命令 GET_IP_INF 来获取 IP、MASK 等信息。如果状态为 1，则表示错误，一般是超时导致的，例如没有发现 DHCP Server。

DHCP 在启动后，一直处于工作状态，除非接收到单片机的关闭 DHCP 的命令。在此过程中，如果DHCP Server 重新给 CH395 分配了一个配置，且此配置和原来不相同，CH395 仍然会产生中断。

产生超时中断后，假如没有发现 DHCP Server，CH395 仍然会继续发送 DHCPDISCOVER 报文，间隔时间约为 16 秒。

此命令大约需要 1ms 执行时间，单片机可以发送 GET_CMD_STATUS 来查询是否执行完毕和执行状态。

## 5.40 CMD_GET_DHCP_STATUS

该命令用于获取DHCP的状态，一般在单片机接收到中断后，发送此命令获取DHCP的执行状态，CH395 收到此命令后，将 DHCP 状态码输出，状态码有 2 个分别为 0 和 1，其含义如下：

如果状态为 0 表示成功，则单片机可以发送命令 GET_IP_INF 来获取 IP，MASK 等信息。

如果状态为 1 则表示错误，一般是超时导致的，例如没有发现 DHCP Server。

## 5.41 CMD_GET_IP_INF

该命令用于获取 IP、GatewayIP、MASK、DNS 等信息，收到此命令后，CH395 会依次输出 20 个字节的数据，分别为：4 字节 IP 地址、4 字节网关 IP、4 字节子网掩码、4 字节 DNS1(主 DNS)、4 字节DNS2(次 DNS)。

在DHCP后，可以发送此命令来获取当前CH395的信息。如果在DHCP中某些配置没获取到则该配置为 0，例如在局域网络 DHCP 时并不一定会分配 DNS，发送该命令获取配置信息时 DNS1，DNS2 全为0。

## 5.42 CMD_SET_ARP

该命令用于设置 ARP 重传周期及次数，需要输入 1 字节的重传周期 n（单位为 100ms）和 1 字节的重传次数 m（单位为次）。CH395F、CH395A、CH395P 支持该命令。

当 CH395 向目标设备发送数据时，会检索 APR 缓存表来查找目标设备的 MAC 地址。若缓存表中没有存储，CH395 会发送 ARP 请求获得目标设备的 MAC 地址。如果目标设备没有回应，CH395 会按照设置的重传周期 n（单位为 100ms）进行重传，最多重传 m 次。

默认情况下，重传次数为 3（次），重传周期为 10（即 1 秒）。若 ARP 重传次数或周期设置为0，则将使用默认值。如果设置重传次数为 255，则表示 CH395 会进行无限重传，直到成功获取到目标设备的 MAC 地址。

该命令应在初始化 CH395 之后设置。

## 5.43 CMD_SET_TCP_MSS

该命令用于设置 TCP MSS，需要输入 2 字节的 TCP MSS 值，最大值为 1460，最小值为 60。应该在初始化 CH395 之前设置此值，初始化之后不允许设置。

## 5.44 CMD_SET_TTL

该命令用于设置 Socket 的 TTL，需要输入 1 字节的 Socket 索引和 1 字节的 TTL 值。应该在打开Socket 之后进行设置，最大值为 128。该命令在 Socket 作为 TCP Sever 模式时不生效。

## 5.45 CMD_SET_RECV_BUF

该命令用于设置Socket的接收缓冲区，需要输入3字节数据，第一个字节为Socket索引，第二个字节为缓冲区的起始块，第三个字节为块数。

|     |     |     |        |      |      |
| --- | --- | --- | ------ | ---- | ---- |
| 第0块 | 第1块 | 第2块 | ...... | 第46块 | 第47块 |

CH395 内部缓冲区结构如上图，一共由 48 个块组成，每个块的长度为 512 字节。单片机可以自由分配每个 Socket 接收缓冲区的大小。CH395 初始化完成后对缓冲区的分配如下：

<p align="center">表 CH395 内部缓冲区</p>

| Socket | 缓冲区   | 起始块            | 块数  |
| ------ | ----- | -------------- | --- |
| 0      | 接收缓冲区 | 0              | 8   |
| 发送缓冲区  | 8     | 4              |     |
| 1      | 接收缓冲区 | 12             | 8   |
| 发送缓冲区  | 20    | 4              |     |
| 2      | 接收缓冲区 | 24             | 8   |
| 发送缓冲区  | 32    | 4              |     |
| 3      | 接收缓冲区 | 36             | 8   |
| 发送缓冲区  | 44    | 4              |     |
| 4      | 接收缓冲区 | NULL(空,未分配,下同) | 0   |
| 发送缓冲区  | NULL  | 0              |     |
| 5      | 接收缓冲区 | NULL           | 0   |
| 发送缓冲区  | NULL  | 0              |     |
| 6      | 接收缓冲区 | NULL           | 0   |
| 发送缓冲区  | NULL  | 0              |     |
| 7      | 接收缓冲区 | NULL           | 0   |
| 发送缓冲区  | NULL  | 0              |     |

由上表可以看出，CH395初始化完成后，将所有的缓冲区分配给Socket0～3，接收缓冲区为8块（4KB），发送缓冲区为 4 块（2KB）。如果单片机需要用到的 Socket 个数大于 4，需要重新对缓冲区进行分配。

## 5.46 CMD_SET_SEND_BUF

该命令用于设置 Socket 的发送缓冲区，需要输入 3 字节数据，第 1 个字节为 Socket 索引，第 2个字节为缓冲区的起始块，第 3 个字节为块数。

关于缓冲区的定义和分配请参考 5.45 章节。

## 5.47 CMD_EEPROM_ERASE

该命令用于擦除 EEPROM，CH395 芯片自带 4KB 的 EEPROM，擦除后数据全部为 0XF5。在对 EEPROM写操作前必须保证目的区域的数据全部为 0XF5。该命令需要约 21us 执行完毕。

## 5.48 CMD_EEPROM_WRITE

该命令用于写 EEPROM，需要输入 2 个字节的地址、1 个字节的长度和若干字节的数据流，字节流的长度不得大于 64 字节。该命令需要约 6.5us 执行完毕。

## 5.49 CMD_EEPROM_READ

该命令用于读EEPROM，需要输入2个字节的地址和1个字节的长度，CH395根据长度输出若干字节的数据流，长度值不得大于 64 字节。外部单片机在发送完长度后，应该等待 27us 再读取数据。该命令需要约 5.2us 执行完毕。

## 5.50 CMD_READ_GPIO_REG

该命令用于读GPIO寄存器，需要输入1个字节的寄存器地址，CH395输出1个字节的寄存器值。所有的寄存器都是 8 位，bit0～7 分别对应 GPIO 0～7，其地址及含义如下表：

<p align="center">表 GPIO 寄存器</p>

| 地址  | 名称           | 描述                  |
| --- | ------------ | ------------------- |
| 80H | GPIO_DIR_REG | 方向寄存器,1:输出;0:输入     |
| 81H | GPIO_IN_REG  | 输入数据寄存器             |
| 82H | GPIO_OUT_REG | 输出数据寄存器             |
| 83H | GPIO_CLR_REG | 0:保持;1:清除           |
| 84H | GPIO_PU_REG  | 下拉寄存器,1:上拉使能;0:上拉禁止 |
| 85H | GPIO_PD_REG  | 上拉寄存器,1:下拉使能;0:下拉禁止 |

CH395 有 8 路 GPIO，GPIO3 默认为输出，在 CH395 初始化成功后，输出低电平，其余 GPIO 默认为输入状态。

## 5.51 CMD_WRITE_GPIO_REG

该命令用于写 GPIO 寄存器，需要输入 1 个字节的寄存器地址和 1 个字节的寄存器值。

关于 GPIO 寄存器的定义参考 5.50 章节。

## 5.52 CMD_SET_FUN_PARA

该命令用于设置功能参数，需要输入 4 字节的参数，参数各位表示的含义如下：

<p align="center">表 功能参数</p>

| Bit    | 名称                              | 复位值 | 描述                             |
| ------ | ------------------------------- | --- | ------------------------------ |
| [31:8] | -                               | -   | 保留,必须为0                        |
| 8      | FUN_PARA_FLAG_UART_FLOW_CONTROL | 0   | 串口流控使能位,仅CH395F支持              |
| 7      | FUN_PARA_FLAG_UART_FAST_DEAL    | 0   | 串口快速回复使能位,0x4A及以后版本支持          |
| [5:6]  | -                               | -   | 保留,必须为0                        |
| 4      | FUN_PARA_FLAG_DISABLE_SEND_OK   | 0   | 禁用Socket SEND_OK中断,0x46及以后版本支持 |
| 3      | FUN_PARA_FLAG_SOCKET_CLOSE      | 0   | Socket关闭模式,0x46及以后版本支持         |
| 2      | -                               | -   | 保留,必须为0                        |
| 1      | FUN_PARA_FLAG_TCP_SERVER        | 0   | TCP服务器多连接模式使能位,0x44及以后版本支持     |
| 0      | -                               | -   | 保留,必须为0                        |

① FUN_PARA_FLAG_TCP_SERVER：TCP 服务器多连接模式使能位，此位为 1，TCP 服务器可以连接多个客户端，使用方法请参考 9.2.6，全局配置，对所有的 Socket 有效。 ② FUN_PARA_FLAG_SOCKET_CLOSE ： 本 参 数 主 要 用 于 TCP ， 此 位 为 0 表 示 在 产 生SINT_STAT_DISCONNECT 或者 SINT_STAT_TIM_OUT 中断后，CH395 会主动关闭 Socket。此位为 1 表示在产生上述两个中断后由外部单片机来关闭 Socket。关闭 Socket 就意味着 CH395 会将此 Socket 内部缓冲区和一些相关变量清除，在某些应用中，如果 CH395 内部自行关闭 Socket 可能会导致残留的数据被强行清除。这种情况下可以将该位置 1，由单片机将数据读出来，然后再关闭 Socket。 ③ FUN_PARA_FLAG_DISABLE_SEND_OK：禁用 SINT_STAT_SEND_OK 中断。此位为 1，CH395 则不再产生 SINT_STAT_SEND_OK 中断。 ④ FUN_PARA_FLAG_UART_FAST_DEAL：对于有数据输出的串口命令，此位为 0 时，CH395 在接受完数据后会间隔4字节串口数据超时时间+TSC时间再输出数据；此位为1时，CH395在接受完数据后仅间隔 TSC 时间回复数据。 ⑤ FUN_PARA_FLAG_UART_FLOW_CONTROL：串口流控使能位，仅适用于 CH395F。当该位设置为 1时，CH395F 的 CTS 和 RTS 引脚将被用作硬件流控信号，实现串口通信的硬件流控机制。 ⑥ 注意，CMD_SET_FUN_PARA 命令必须在初始化之前设置，且一旦初始化完毕后，不可以再随意设置。另外需要注意参数适用的版本号。

## 5.53 CMD_SET_KEEPALIVE_IDLE

该命令用于设置Keepalive空闲时间，需要输入4字节的时间值，单位为ms。该命令仅用于TCP连接。Keepalive 空闲时间是指 TCP 连接无数据收发后至发送 Keepalive 数据包的时间。默认值为20000。

## 5.54 CMD_SET_KEEPALIVE_INTVL

该命令用于设置Keepalive超时时间，需要输入4字节的时间值，单位为ms。该命令仅用于TCP连接。Keepalive 超时时间是指 Keepalive 数据包发送后等待应答的时间。默认值为 15000。

## 5.55 CMD_SET_KEEPALIVE_CNT

该命令用于设置 Keepalive 超时次数，需要输入 1 字节的超时次数。该命令仅用于 TCP 连接。Keepalive 超时次数是指允许 Keepalive 数据包连续无应答的最大次数。默认值为 9。

假设 Keepalive 空闲时间为 IDLE，超时时间为 INTVL，超时次数为 CNT。

如果 Socket 连接启动了 Keepalive 功能，则当 TCP 连接空闲（无数据收发）IDLEms 时，Socket会启动发送 Keepalive 包，如果远端在 INTVLms 内应答 ACK，则认为该连接正常。否则 Socket 在INTVLms 后认为超时，再次启动发送 Keepalive 包，如果 CNT 次内都没有收到 ACK 包，则认为当前连接断开，会产生 SINT_STAT_TIM_OUT 或 SINT_STAT_DISCONNECT 中断。

如果需要配置 IDLE，INTVL，CNT 三个变量，需要注意 IDLE 必须大于 INTVL，且均为 500 的倍数。

## 5.56 CMD_SET_KEEPALIVE_SN

该命令用于开启或者关闭Socket的 Keepalive功能，需要输入1字节的 Socket索引和 1字节的配置值，配置值为 0 表示关闭 Socket 的 Keepalive 功能，1 为开启。默认为关闭。

当 Socket 为 TCP 客户端时，创建 Socket 后使用此命令打开 Keepalive 功能。

当 Socket 为 TCP 服务器时，在产生 SINT_STAT_CONNECT 后使用此命令打开 Keepalive 功能。

## 6、功能说明

## 6.1 单片机通讯接口

CH395 与单片机之间支持三种通讯接口：8 位并行接口、SPI 同步串行接口、异步串口。在芯片上电复位时，CH395 将采样 SEL 和 TXD 引脚的状态，根据这 2 个引脚状态的组合选择通讯接口，参考下表（表中 X 代表不关心此位，0 代表低电平，1 代表高电平或者悬空）。SEL 和 TXD 引脚内置上拉电阻，默认选择异步串口。可通过将 SEL 或 TXD 引脚直接接地以设置为低电平，从而选择所需的通信接口。

<p align="center">表 接口选择</p>

|   |   |   |
|---|---|---|
|SEL 引脚|TXD 引脚|选择通讯接口|
|1|1|异步串口|
|1|0|SPI 接口|
|0|1|8 位并口|
|0|0|错误接口|

CH395 芯片 INT#引脚输出的中断请求默认是低电平有效，可以连接到单片机的中断输入引脚或普通输入引脚，单片机可以使用中断方式或查询方式获知 CH395 的中断请求。

## 6.2 SPI 串行接口

SPI 同步串行接口信号线包括：SPI 片选输入引脚 SCS、串行时钟输入引脚 SCK、串行数据输入引脚 SDI、串行数据输出引脚 SDO。通过 SPI 接口，CH395 可以用较少的连线挂接到各种单片机、DSP、MCU 的 SPI 串行总线上。

CH395 的 SPI 接口支持 SPI 模式 0 和 SPI 模式 3，CH395 总是从 SPI 时钟 SCK 的上升沿输入数据，并在允许输出时从 SCK 的下降沿输出数据，数据位顺序是高位在前(MSB first)，计满 8 位为一个字节。

## 6.2.1 SPI 操作步骤

SPI 的操作步骤是：

① 单片机产生 CH395 芯片的 SPI 片选，低电平有效； ② 单片机按 SPI 输出方式发出一个字节的数据，CH395 总是将 SPI 片选 SCS 有效后收到的首个字节作为命令码，后续字节作为数据； ③ 单片机延时 TSC 时间（约 0.6us）等待 CH395 的 SPI 接口空闲； ④ 如果是写操作，单片机向 CH395 发出一个字节的待写数据，等待 SPI 接口空闲后，单片机继续发出若干个字节的待写数据，CH395 依次接收，直到单片机禁止 SPI 片选； ⑤ 如果是读操作，单片机从 CH395 接收一个字节的数据，等待 SPI 接口空闲后，单片机继续从CH395 接收若干个字节的数据，直到单片机禁止 SPI 片选； ⑥ 单片机禁止 CH395 芯片的 SPI 片选，以结束当前 SPI 操作。

下图是 SPI 接口的逻辑时序图，图 6-1 为发出命令 12H 并写入数据 34H，图 6-2 为发出命令 28H并读出数据 78H。

<p align="center">图 示例 1</p>
![](https://lsky.bitnasdaq.vip/9TnIMe.jpg)


<p align="center">图 示例 2</p>
![](https://lsky.bitnasdaq.vip/vsEYWk.jpg)

## 6.3 异步串口

异步串口信号线包括：串行数据输入引脚 RXD 和串行数据输出引脚 TXD。通过串行接口，CH395可以用最少的连线与单片机、DSP、MCU 进行点对点连接。

CH395F 支持串口硬件流控（清除发送输入引脚 CTS、发送请求输出引脚 RTS）和 RS485 收发自动切 换（ 发送 状态 输出脚 TNOW）。默 认情 况下 ，流 控功 能处 于禁用 状态 ，但 可 以 通 过CMD_SET_FUN_PARA 命令启用该功能，以实现硬件流控机制。

CH395 的串行数据格式是标准的字节传输模式，包括 1 个起始位、8 个数据位、1 个停止位。

CH395 既支持硬件设定默认的串行通讯波特率，也支持单片机随时通过 CMD_SET_BAUDRATE 命令选择合适的通讯波特率。每次上电复位后，CH395默认的串行通讯波特率由 SDO、SDI、SCK 三个引脚的电平组合设定，参考下表（表中 0 代表低电平，1 代表高电平或者悬空）。SDO、SDI、SCK 引脚悬空默认选择 9600bps。

CH395 串口发送信号的波特率误差小于 0.3％，串口接收信号的允许波特率误差不大于 2％。

<p align="center">表 波特率选择</p>

|   |   |   |   |
|---|---|---|---|
|SDO 引脚|SDI 引脚|SCK 引脚|上电复位后默认的串行通讯波特率|
|1|1|1|9600bps|
|1|1|0|57600bps|
|1|0|1|115200bps|
|1|0|0|460800bps|
|0|1|1|250000bps|
|0|1|0|1Mbps|
|0|0|1|2Mbps|
|0|0|0|921600bps|

为了区分命令码和数据，CH395 要求单片机先通过串口发送两个同步码字节（57H 和 ABH），然后再发送命令码，接着是发送数据或者接收数据。CH395会检查上述两个同步码字节之间、同步码与命令码之间的间隔时间，如果间隔时间大于串口输入超时时间 SER_CMD_TIMEOUT（约 40ms），那么CH395 将丢弃该同步码及命令包。

对于有返回数据的串口命令，CH395 在接收到命令后，会在约 TE7 时间后（见表 7-4）返回数据。

## 6.3.1 串口操作步骤

串口命令操作步骤如下：

① 单片机通过串口向 CH395 发出第一同步码 57H； ② 单片机向 CH395 发出第二同步码 ABH； ③ 单片机向 CH395 发出命令码； ④ 如果该命令具有输入数据，那么依次向 CH395 发出输入数据，每次一个字节； ⑤ 如果该命令具有输出数据，那么依次从 CH395 接收输出数据，每次一个字节。

下图为串口的逻辑时序图。

<p align="center">图 示例 3</p>
![](https://lsky.bitnasdaq.vip/ZzMQVu.jpg)

## 6.4 8 位并行接口

并口信号线包括：8 位双向数据总线 D7～D0、读选通输入引脚 RD#、写选通输入引脚 WR#、片选输入引脚 PCS#以及地址输入引脚 A0。CH395 芯片的 PCS#用于当单片机具有多个外围器件时进行设备选择。通过被动并行接口，CH395 芯片可以很方便地挂接到各种 8 位单片机、DSP、MCU 的系统总线上，并且可以与多个外围器件共存。

对于类似 Intel 并口时序的单片机，CH395 芯片的 RD#引脚和 WR#引脚可以分别连接到单片机的读选通输出引脚和写选通输出引脚。对于类似 Motorola 并口时序的单片机，CH395 芯片的 RD#引脚应该接低电平，并且 WR#引脚连接到单片机的读写方向输出引脚 R/-W。

下表为并口 I/O 操作的真值表（表中 X 代表不关心此位，Z 代表 CH395 三态禁止）。

<p align="center">表 并口操作真值表</p>

|   |   |   |   |   |   |
|---|---|---|---|---|---|
|PCS#|WR#|RD#|A0|D7-D0|对 CH395 芯片的实际操作|
|1|X|X|X|X/Z|未选中 CH395,不进行任何操作。|
|0|1|1|X|X/Z|虽然选中但无操作,不进行任何操作。|
|0|0|1/X|1|输入|向 CH395 的命令端口写入命令码。|
|0|0|1/X|0|输入|向 CH395 的数据端口写入数据。|
|0|1|0|0|输出|从 CH395 的数据端口读出数据。|
|0|1|0|1|输出|从 CH395 的命令端口读取接口状态:位 7 是中断标志,低有效,等效于 INT#引脚。|

## 6.4.1 并口操作步骤

CH395 A0 引脚为高电平时选择命令端口，可以写入新的命令，或者读出接口状态；当 A0 引脚为低电平时选择数据端口，可以读写数据。

单片机通过 8 位并口对 CH395 芯片进行读写，所有操作都是由一个命令码、若干个输入数据和若干个输出数据组成，部分命令不需要输入数据，部分命令没有输出数据。命令操作步骤如下：

① 单片机在 A0=1 时向命令端口写入命令代码； ② 单片机延时 TSC 时间（约 0.6us）等待 CH395 的并口空闲； ③ 如果该命令具有输入数据，那么在 A0=0 时依次写入输入数据，每次一个字节； ④ 如果该命令具有输出数据，那么在 A0=0 时依次读取输出数据，每次一个字节。

## 6.5 其他硬件

CH395 芯片内部集成了 10M/100M 以太网 PHY、MAC、串口、SPI-Slave 控制器、被动并行接口、SRAM、高速 MCU 和 PLL 倍频器、电源上电复位电路等。

CH395 芯片内置了电源上电复位电路，也可通过 RSTI 引脚拉低控制复位。RSTI 引脚用于从外部输入异步复位信号；当 RSTI 引脚为低电平时，CH395 芯片被复位；当 RSTI 引脚恢复为高电平后，CH395 将进入初始化阶段约 15ms，在这段时间内主机禁止操作 CH395。

## 7、参数

## 7.1 绝对最大值（临界或者超过绝对最大值将可能导致芯片工作不正常甚至损坏）

<p align="center">表 绝对最大值</p>

|   |   |   |   |   |
|---|---|---|---|---|
|名称|参数说明|最小值|最大值|单位|
|$T_A$|工作时的环境温度|-40|85|°C|
|$T_J$|结温度范围|-40|100|°C|
|$T_S$|存储时的环境温度|-55|150|°C|
|$V_{CC33}$|工作电源电压|-0.4|4.0|V|
|$V_{CC10}$|I/0 电源电压|-0.4|4.0|V|
|$V_{DDK}$|内核模拟电路的电源退耦端|-0.4|1.5|V|
|$V_{ETH}$|ETH 物理信号引脚上的电压|-0.4|$V_{CC33}+0.4$|V|
|$V_{IN}$|其它 I/0 引脚上的输入电压|-0.4|$V_{CC10}+0.4$|V|
|$V_{ESD(HBM)}$|普通 I/0 引脚的 ESD 静电放电电压(HBM)|6K|   |V|
|$I_{IO}$|I/0 引脚上的吸收电流||20|mA|
|I/0 引脚上的输出电流||20|

## 7.2 电气参数

<p align="center">表 电气参数 ( V _ { \tt c c 3 3 } = 3 . 3 V , V _ { \tt c c 1 0 } = 3 . 3 V , T _ { \tt A } = 2 5 ^ { \circ } C )</p>

|   |   |   |   |   |   |   |
|---|---|---|---|---|---|---|
|名称|参数说明|   |最小值|典型值|最大值|单位|
|$V_{CC33}$|工作电源电压|   |3.2|3.3|3.4|V|
|$V_{CC10}$|I/0 电源电压|   |1.7|3.3|3.6|V|
|$V_{IL}$|I/0 引脚,输入低电平电压|$V_{CC10} = 3.3V$|0||0.8|V|
|$V_{CC10} = 1.8V$|0||0.6|
|$V_{IH}$|I/0 引脚,输入高电平电压|$V_{CC10} = 3.3V$|2.0||$V_{CC10}$|V|
|$V_{CC10} = 1.8V$|1.2||$V_{CC10}$|
|$V_{OL}$|低电平输出电压,单个引脚吸收 5mA 电流|   ||0.4|0.6|V|
|$V_{OH}$|高电平输出电压,单个引脚输出 5mA 电流|   |$V_{CC10}-0.6$|$V_{CC10}-0.4$||V|
|$V_{hys}$|I/0 施密特触发器电压迟滞|   ||150||mV|
|$C_{10}$|I/0 引脚电容|   ||5||pF|
|$R_{PU}$|上拉等效电阻|   |30|40|55|kΩ|
|$R_{PD}$|下拉等效电阻|   |30|40|55|kΩ|

注：以上均为设计参数保证。

## 7.3 功耗

<p align="center">表 功耗 ( V _ { \mathbb { C } \mathbb { C } 3 3 } = 3 . 3 V , ~ V _ { \mathbb { C } \mathbb { C } 1 0 } = 3 . 3 V , ~ \mathsf { T } _ { \mathtt { A } } = 2 5 ^ { \circ } \mathsf { C } )</p>

|   |   |   |   |   |
|---|---|---|---|---|
|符号|参数|条件(所有电流,含网络变压器)|典型值|单位|
|$I_{DD0}$|传输状态下的供应电流|100BASE-TX 通路链接成功并且在收发通道上有数据包|74.9|mA|
|10BASE-TX 通路链接成功并且在收发通道上有数据包|46.8|
|$I_{DD1}$|空闲状态下的供应电流|100BASE-TX 通路链接成功并且在收发通道上无任何数据包|74.9|mA|
|10BASE-TX 通路链接成功并且在收发通道上无任何数据包|47.5|
|$I_{DD2}$|断开状态下的供应电流|100BASE-TX 和 10BASE-TX 通路均未链接成功且 PHY 处于自动协商状态。|54.4|mA|
|$I_{DD3}$|睡眠功耗||380|uA|

## 7.4 控制时序参数

<p align="center">表 控制时序参数</p>

|   |   |   |   |   |
|---|---|---|---|---|
|名称|参数说明|条件|典型值|单位|
|TWAK|从低功耗状态退出的唤醒时间||100|us|
|TE0|CMD_RESET_ALL 命令的执行时间||15|ms|
|TE1|CMD_INIT_CH395 命令的执行时间||5|ms|
|TE2|CMD00_EEPROM_ERASE 命令的执行时间||21.1|us|
|TE3|CMD30_EEPROM_WRITE 命令的执行时间||6.5|us|
|TE4|CMD30_EEPROM_READ 命令的执行时间||5.2|us|
|TE5|CMD_SET_MAC_ADDR 命令的执行时间||30|us|
|TE6|其余命令的执行时间||1.5|us|
|TE7|串口模式下命令数据返回时间||见注1|-|
|TE8|CMD_SET_BAUDRATE 命令的执行时间||见注2||
|TUC|串口模式下传输命令码与数据间所需间隔||0|us|
|TUD|串口模式下传输数据字节间所需间隔||0|us|
|TSC|SPI 或并口模式下传输命令码与数据间所需间隔|读写收发缓存区|见表7-5|us|
|其他命令|0.6|
|TSD|SPI 或并口模式下传输数据字节间所需间隔|读写收发缓存区|见表7-5|us|
|其他命令|0.3|

注：1、对于有数据输出的串口命令，CH395接收完数据后会间隔TE7时间再输出数据。TE7时间由CMD_SET_FUN_PARA命令的bit7决定。默认为0时TE7时间约为4字节串口数据的超时时间加上TSC时间，计算公式为：4*(10/BaudRate)+TSC（单位：秒)。例如，波特率为921600 时，超时时间约为4*(10/921600)+0.0000006≈0.000044秒（44us)；bit7为1时则返回时间仅为TSC 时间（0.6us）。 2、TE8时间为TE7+1ms。

SPI 或并口模式下 CH395 读写收发缓存区命令只需确保在长度和数据间间隔 TSL 时间即可，其他所有字节间均无需间隔。

<p align="center">表 读写收发缓存区时序参数</p>

|   |   |   |   |   |
|---|---|---|---|---|
|名称|参数说明|条件|典型值|单位|
|TSL|SPI 或并口模式下传输长度与数据间所需间隔|读接收缓存区|0.4|us|
|写发送缓存区|0.2|

<p align="center">图 SPI 模式写发送缓存区</p>
![](https://lsky.bitnasdaq.vip/7FQ5tH.jpg)

text_image

SCK SCS SDI 0x39 Socket号 长度[7:0] 长度[15:8] 数据0 数据n SDO </details>

<p align="center">图 SPI 模式读接收缓存区</p>
![](https://lsky.bitnasdaq.vip/255mRJ.jpg)

text_image

SCK SCS SDI SDO 0x3C Socket号 长度[7:0] 长度[15:8] 数据0 数据n TSL </details>

<p align="center">图 并口模式写发送缓存区</p>
![](https://lsky.bitnasdaq.vip/uMdQpC.jpg)

<p align="center">图 并口模式读接收缓存区</p>
![](https://lsky.bitnasdaq.vip/gjw5BJ.jpg)

## 7.5 交流电气特性和时序

## 7.5.1 SPI 时序

<p align="center">图 SPI 模式 0 时序图</p>
![](https://lsky.bitnasdaq.vip/ChpY9y.jpg)


<p align="center">图 SPI 模式 3 时序图</p>
![](https://lsky.bitnasdaq.vip/1SNqAJ.jpg)

<p align="center">表 SPI 参数表 ( \mathsf { V } _ { \mathbb { C } \mathbb { S } 3 } = 3 . 3 \mathsf { V } ， \mathsf { V } _ { \mathtt { C C I 0 } } = 3 . 3 \mathsf { V } ， { \bar { \mathsf { T } } } _ { \mathsf { A } } = 2 5 ^ { \circ } { \mathsf { C } } )</p>

|   |   |   |   |   |   |
|---|---|---|---|---|---|
|符号|参数|条件|最小值|最大值|单位|
|$f_{SCK}$|SPI 的 SCK 时钟频率|||40|MHz|
|$t_{SU(SCS)}$|SCS 建立时间||17||ns|
|$t_{h(SCS)}$|SCS 保持时间||17||ns|
|$t_{SU(SDI)}$|数据输入建立时间||4||ns|
|$t_{h(SDI)}$|数据输入保持时间||2||ns|
|$t_{a(SDO)}$|数据输出访问时间||0|8|ns|
|$t_{dis(SDO)}$|数据输出禁止时间||0|10|ns|

## 7.5.2 并口时序

<p align="center">图 并口模式时序图</p>
![](https://lsky.bitnasdaq.vip/76jumb.jpg)

<p align="center">表 并口参数表 ( \mathsf { V } _ { \mathsf { c c 3 3 } } = 3 . 3 \mathsf { V } ， \mathsf { V } _ { \mathtt { C C I 0 } } = 3 . 3 \mathsf { V } ， { \bar { \mathsf { T } } } _ { \mathsf { A } } = 2 5 ^ { \circ } { \mathsf { C } } ) ）</p>

|   |   |   |   |   |   |
|---|---|---|---|---|---|
|符号|参数|条件|最小值|最大值|单位|
|$t_{CR}$|PCS#建立时间||1||ns|
|$t_{RC}$|PCS#保持时间||0||ns|
|$t_{ADDRS}$|地址建立时间||1||ns|
|$t_{WDATAS}$|数据输入建立时间||1||ns|
|$t_{WDATAH}$|数据输入保持时间||10||ns|
|$T_{RDATAD}$|数据输出延时时间||15||ns|
|$t_{RDN}$|RD#高电平保持时间||25||ns|
|$t_{RD}$|RD#低电平保持时间||30||ns|
|$t_{WRN}$|WR#高电平保持时间||25||ns|
|$t_{WR}$|WR#低电平保持时间||30||ns|
|$t_{RWC}$|读写周期时间||70||ns|
|$t_{CSN}$|CS 高电平保持时间||35||ns|

## 7.5.3 振荡器及晶振时序

<p align="center">表 振荡器及晶振时序参数表</p>

|   |   |   |   |   |   |   |
|---|---|---|---|---|---|---|
|符号|参数|条件|最小值|典型值|最大值|单位|
|TCKF|晶体频率|建议 30ppm 内|24.999|25|25.001|MHz|
|TPWH|时钟脉冲宽度高||15|20|25|ns|
|TPWL|时钟脉冲宽度低||15|20|25|ns|

注：XI和X0引脚已分别内置负载电容12pF的外部晶体所需的两个振荡电容，外部只需要晶体；如果另选负载电容20pF的外部晶体，那么XI和X0需要分别对地额外加15pF的振荡电容。

## 7.5.4 复位时序

<p align="center">表 复位时序参数表</p>

|   |   |   |   |   |   |
|---|---|---|---|---|---|
|符号|参数|最小值|典型值|最大值|单位|
|$t_{RSTTEMP0}$|RSTI 低电平宽度|1|||us|
|$t_{RSTTEMP1}$|RSTI 高电平至主机可操作|12|15|19|ms|
|$t_{RSTTEMP2}$|复位命令生效至主机可操作|12|15|19|ms|
|$t_{RSTTEMP3}$|电源上电复位至主机可操作|27|30|35|ms|

## 8、封装信息

说明：尺寸标注的单位是 mm（毫米）。

引脚中心间距是标称值，没有误差，除此之外的尺寸误差不大于±0.2mm。

8.1 QFN32 ![](https://lsky.bitnasdaq.vip/uSCWXp.jpg)

8.2 LQFP64M ![](https://lsky.bitnasdaq.vip/kEydnV.jpg)

8.3 LQFP128 ![](https://lsky.bitnasdaq.vip/5WfaZx.jpg)

## 9、应用

## 9.1 应用基础

CH395 内部集成了 IPv4、ARP、ICMP、UDP、TCP 等协议。

TCP 和 UDP 是两种比较重要的传输层协议，两者都使用 IP 作为网络层协议。

TCP 是一种面向连接的传输，能够提供可靠的字节流传输服务。

UDP 是一种简单的面向数据报的运输层协议，与 TCP 不同的是 UDP 无法保证数据报文准确达到目的地。

TCP为网络设备提供高可靠性通信，负责将应用层数据分段传递至网络层、确认接收分组、设置超时等功能，从而实现端到端的可靠传输，使应用层无需关注底层细节。相比之下，UDP提供简单、快速的服务，仅负责将数据报从一个网络终端传输到另一个终端，不保证数据报送达，可靠性需由应用层自行实现。TCP 和 UDP 的数据均通过网络层的 IP 协议完成传输。

ICMP 是 IP 协议的附属协议，IP 层用它来与其他主机或者路由器交换错误报文或者其他重要信息，例如CH395产生不可达中断，就是通过ICMP来进行错误报文交换的。PING也使用了ICMP协议。

ARP 为地址解析协议，用来转换 IP 层和网络接口层使用的地址。

## 9.2 应用参考步骤

本章节介绍常用的操作步骤，具体可以参考例子程序。

## 9.2.1 初始化 CH395，必要操作

① 发送命令 CMD_SET_MAC_ADDR 设置 CH395 的 MAC 地址；

② 发送命令 CMD_SET_IP_ADDR 设置 CH395 的 IP 地址；

③ 发送命令 CMD_SET_GWIP_ADDR 设置 CH395 的网关 IP 地址；

④ 发送命令 CMD_SET_MASK_ADDR 设置 CH395 的子网掩码；

⑤ 发送命令 CMD_INIT_CH395 对 CH395 初始化；

⑥ 延时 2ms 以上发送命令 CMD_GET_CMD_STATUS 获取 CMD_INIT_CH395 执行状态，如果返回CH395_ERR_BUSY 表示 CH395 内部正在执行命令，需要再次执行⑥；如果返回 CH395_ERR_SUCCESS 表示命令执行成功。CMD_INIT_CH395 一般需要 5ms 才能执行完毕。

步骤①一般不需要，CH395 在出厂时，已经烧录了 IEEE 分配的 MAC 地址。

如果需要启动 DHCP，则步骤②-④不需要。

上述步骤④为可选操作，默认子网掩码为 255.255.255.0 一般不需要设置。

CH395 接收到 CMD_INIT_CH395 命令后，初始化内部 TCP/IP 协议栈，初始化 MAC 和 PHY，此时 MAC和 PHY 会被初始化为自动协商模式。如果需要 PHY 工作在其他模式，如 10M 全双工模式，则需要在CMD_INIT_CH395 成功执行之后，发送 CMD_SET_PHY 命令进行设置。

## 9.2.2 初始化 Socket 为 MACRAW 模式

初始化步骤如下：

① 发送命令 CMD_SET_PROTO_TYPE_SN 设置 Socket 工作在 MACRAW 模式；

② 发送命令 CMD_OPEN_SOCKET_SN 打开 Socket；

③ 延时 2ms 以上发送命令 CMD_GET_CMD_STATUS 获取 CMD_OPEN_SOCKET_SN 执行状态，如果返回CH395_ERR_BUSY 表示 CH395 内部正在执行命令，需要再次执行③；如果返回 CH395_ERR_SUCCESS 表示命令执行成功。其他值表示打开 Socket 失败。

IEEE802.3 以太网帧格式：

|   |   |   |   |   |
|---|---|---|---|---|
|目的 MAC|源 MAC|类型|数据|CRC32|
|6Byte|6Byte|2Byte|46-1500Byte|4Byte|

在 MACRAW 模式下，CH395 会透明传输以太网和单片机之间的数据，不会对数据进行 TCP/IP 封装，CH395 接收数据时会对以太网冗余校验 CRC32 进行校验，如果校验错误，数据包不会转发给单片机。CH395 发送数据时会在数据包尾部加入以太网冗余校验 CRC32。单片机每次向 CH395 写入的数据长度不得大于 1514，CH395 会将单片机每次写入的数据封装成一帧数据进行发送。当 CH395 从以太网收到数据后会通知单片机，此时单片机应立即将所有数据从 CH395 内部接收缓冲区读走。

仅 Socket0 可以设置此模式，且其他 Socket 将不可用。

## 9.2.3 初始化 Socket 为 IPRAW 模式

## 初始化步骤如下：

① 发送命令 CMD_SET_PROTO_TYPE_SN 设置 Socket 工作在 IPRAW 模式； ② 发送命令 CMD_SET_IP_ADDR_SN 设置目的 IP 地址； ③ 发送命令 CMD_SET_IPRAW_PRO_SN 设置协议字段； ④ 发送命令 CMD_OPEN_SOCKET_SN 打开 Socket； ⑤ 延时 2ms 以上发送命令 CMD_GET_CMD_STATUS 获取 CMD_OPEN_SOCKET_SN 执行状态，如果返回CH395_ERR_BUSY 表示 CH395 内部正在执行命令，需要再次执行⑤；如果返回 CH395_ERR_SUCCESS 表示命令执行成功，其他值表示打开 Socket 失败。

## IP 报文结构：

|   |   |   |   |   |   |
|---|---|---|---|---|---|
|目的 MAC|源 MAC|类型|IP 首部|IPRAW 数据|CRC32|
|6Byte|6Byte|2Byte|20Byte|最大 1480Byte|4Byte|

单片机向 CH395 写入若干字节数据流后，CH395 将此 Socket 的协议字段封装在 IP 首部，并将数据流封装在 IPRAW 数据部分进行发送。IPRAW 一包允许发送的最大长度为 1480 字节，如果单片机写入的数据流长度大于 1480 字节，CH395 会将数据流封装成若干个 IP 包进行发送且每包成功发送后都会产生 SINT_STAT_SEND_OK 中断。单片机每次写入的字节长度不得大于发送缓冲区长度，且收到SINT_STAT_SENBUF_FREE 中断后才可以进行下一次写数据。如果产生 SINT_STAT_TIM_OUT 中断表示数据发送失败，导致发送数据失败一般有以下两个原因：

① 如果目的 IP 地址和 CH395 在同一个子网，则可能目的 IP 地址的网络设备不在线。 ② 如果目的 IP 地址和 CH395 不在同一个子网，则可能 CH395 的网关不在线。

当CH395收到IP数据包后，首先检测协议字段和Socket设置的协议字段是否相同，如果相同则将 IPRAW 数据包复制到接收缓冲区中并产生 SINT_STAT_RECV 中断，单片机收到此中断后，可以发送命令 CMD_GET_RECV_LEN_SN 来获取接收缓冲区数据的长度，然后发送命令 CMD_READ_RECV_SN 来读取缓冲区的数据。单片机可以一次将所有数据读出也可以分多次读取，由于 IPRAW 模式下 CH395 无法进行流控，建议单片机查询到接收数据中断口后应立即将所有数据读出，以免被后续的数据覆盖。

## 关于协议字段设置的注意事项

CH395 处理 IPRAW 的优先级高于 UDP 和 TCP，如果 IP 协议字段设置为 17(UDP)或者 6(TCP)，则可能存在和其他 Socket 冲突的可能性，在使用时应当注意避免，下面列举两种情况进行说明：

① Socket0 设置为 IPRAW 模式，IP 协议字段为 17，Socket1 为 UDP 模式。在 UDP 模式下，IP 包的协议字段也是 17，这样就会导致 Socket1 通讯的数据会被 Socket0 拦截，无法接收到数据。 ② Socket0 设置为 IPRAW 模式，IP 协议字段为 6，Socket1 为 TCP 模式。在 TCP 模式下，IP 包的协议字段也是 6，这样就会导致 Socket1 通讯的数据会被 Socket0 拦截，无法接收到数据。

## 9.2.4 初始化 Socket 为 UDP 模式

## 初始化步骤如下：

① 发送命令 CMD_SET_PROTO_TYPE_SN 设置 Socket 工作在 UDP 模式； ② 发送命令 CMD_SET_IP_ADDR_SN 设置目的 IP 地址； ③ 发送命令 CMD_SET_DES_PORT_SN 设置目的端口； ④ 发送命令 CMD_SET_SOUR_PORT_SN 设置源端口； ⑤ 发送命令 CMD_OPEN_SOCKET_SN 打开 Socket； ⑥ 延时 2ms 以上发送命令 CMD_GET_CMD_STATUS 获取 CMD_OPEN_SOCKET_SN 执行状态，如果返回CH395_ERR_BUSY 表示 CH395 内部正在执行命令，需要再次执行⑥；如果返回 CH395_ERR_SUCCESS 表示命令执行成功，其他值表示打开 Socket 失败。

## UDP 报文结构：

|   |   |   |   |   |   |   |
|---|---|---|---|---|---|---|
|目的 MAC|源 MAC|类型|IP 首部|UDP 首部|UDP 数据|CRC32|
|6Byte|6Byte|2Byte|20Byte|8Byte|最大 1472Byte|4Byte|

UDP是一个简单的，不可靠的，面向数据报文的运输层协议，传输速度较快，不能保证数据能达到目的地，必须由应用层来保证传输的可靠稳定。

单片机向 CH395 写入若干字节数据流后，CH395 数据流封装在 UDP 数据部分进行发送。UDP 一包可以发送的最大长度为 1472 字节，如果单片机写入的数据流长度大于 1472 字节，CH395 会将数据流封装成若干个 UDP 包进行发送且每包成功发送后都会产生 SINT_STAT_SEND_OK 中断。单片机每次写入的字节长度不得大于发送缓冲区长度，且收到 SINT_STAT_SENBUF_FREE 中断后才可以进行下一次写数据。如果数据发送失败会产生 SINT_STAT_TIM_OUT 中断，导致发送数据失败一般是下面两个原因：

① 如果目的 IP 地址和 CH395 在同一个子网，则可能目的 IP 地址的网络设备不在线。 ② 如果目的 IP 地址和 CH395 不在同一个子网，则可能 CH395 的网关不在线。

当 CH395 接收到 UDP 报文后，将 UDP 数据复制到 Socket 接收缓冲区中并产生 SINT_STAT_RECV 中断，单片机收到此中断后，可以发送命令 CMD_GET_RECV_LEN_SN 来获取接收缓冲区数据的长度，然后发送命令 CMD_READ_RECV_SN 来读取缓冲区的数据。由于 UDP 模式下 CH395 无法提供流控，建议接收到的数据及时快速的读完，以免被后续的数据覆盖。

CH395支持两种 UDP模式：UDP 客户端和 UDP服务器。UDP客户端只能和指定的 IP和端口进行通讯，UDP 服务器可以和任何远端的 IP 和端口进行通讯。

两者在使用上有些区别：

① 初始化步骤②，如果目的IP地址为0XFFFFFFFF，则此Socket会进入UDP服务器模式，否则为 UDP 客户端模式。 ② 单片机从 CH395 读取数据，客户端模式下 CH395 直接将接收到的数据流发送给单片机，单片机可以一次将所有数据读出也可以只读出部分数据。服务器模式下 CH395 会在数据的头部添加 8 个字节的信息表，单片机可以根据信息表来获得数据包的来源信息，单片机必须一次性将数据全部读出。


| 数据包长度 | 端口    | IP 地址 | 数据    |
| ----- | ----- | ----- | ----- |
| 2Byte | 2Byte | 4Byte | NByte |

③ 单片机发送数据，客户端模式下 CH395 直接将数据发送给初始化时指定的目的 IP 和端口。服务器模式下 CH395 可以将数据发送到任何 IP 和端口，单片机在发送前设置目的 IP 和目的端口即可。

## 9.2.5 初始化 Socket 为 TCP 客户端模式

初始化步骤如下：

① 发送命令 CMD_SET_PROTO_TYPE_SN 设置 Socket 工作在 TCP 模式； ② 发送命令 CMD_SET_IP_ADDR_SN 设置目的 IP 地址； ③ 发送命令 CMD_SET_DES_PORT_SN 设置目的端口； ④ 发送命令 CMD_SET_SOUR_PORT_SN 设置源端口； ⑤ 发送命令 CMD_OPEN_SOCKET_SN 打开 Socket；

⑥ 延时 2ms 以上发送命令 CMD_GET_CMD_STATUS 获取 CMD_OPEN_SOCKET_SN 执行状态，如果返回CH395_ERR_BUSY 表示 CH395 内部正在执行命令，需要再次执行⑥；如果返回 CH395_ERR_SUCCESS 表示命令执行成功，其他值表示打开 Socket 失败；

⑦ 发送命令 CMD_TCP_CONNECT_SN 进行 TCP 连接； ⑧ 延时 2ms 以上发送命令 CMD_GET_CMD_STATUS 获取 CMD_TCP_CONNECT_SN 执行状态，如果返回CH395_ERR_BUSY 表示 CH395 内部正在执行命令，需要再次执行⑧；如果返回 CH395_ERR_SUCCESS 表示命令执行成功。其他值表示命令执行失败。返回 CH395_ERR_SUCCESS 仅表示命令执行成功，不代表 TCP 连接成功。如果 TCP 连接成功，CH395 将会产生 SINT_STAT_CONNECT 中断。如果连接失败 CH395将产生 SINT_STAT_TIM_OUT 中断，如果需要再次连接，再次从⑤开始执行。

TCP 报文结构：

|   |   |   |   |   |   |   |
|---|---|---|---|---|---|---|
|目的 MAC|源 MAC|类型|IP 首部|TCP 首部|TCP 数据|CRC32|
|6Byte|6Byte|2Byte|20Byte|20Byte|最大 1460Byte|4Byte|

TCP 提供面向连接的，可靠的字节流服务。

CH395 产生 SINT_STAT_CONNECT 表明 TCP 连接建立，可以进行数据收发。在连接未建立前不得进行数据发送操作。

单片机向 CH395 写入若干字节数据流后，CH395 数据流封装在 TCP 数据部分进行发送。TCP 一包可以发送的最大长度为 TCP MSS 个字节，如果单片机写入的数据流长度大于 TCP MSS 字节，CH395 会将数据流封装成若干个 TCP 包进行发送且每包成功发送后都会产生 SINT_STAT_SEND_OK 中断。单片机每次写入的字节长度不得大于发送缓冲区长度，且收到 SINT_STAT_SENBUF_FREE 中断后才可以进行下一次写数据操作。在 TCP 模式下，如果数据发送失败会产生 SINT_STAT_TIM_OUT 中断，CH395 会自动将此 Socket 关闭(在 FUN_PARA_FLAG_SOCKET_CLOSE 为 0 情况下，参考 5.51)。

当 CH395 接收到 TCP 报文后，将 TCP 数据复制到 Socket 接收缓冲区中并产生 SINT_STAT_RECV 中断，单片机收到此中断后，可以发送命令 CMD_GET_RECV_LEN_SN 来获取接收缓冲区数据的长度，然后发送命令 CMD_READ_RECV_SN 来读取缓冲区的数据。单片机可以一次将所有数据读出也可以只读出部分数据，接收缓冲区剩余空间即为 TCP 的窗口，单片机每次读数据后，CH395 会对接收缓冲区的剩余空间进行检查并向 TCP 服务器通告当前窗口的大小。

## 9.2.6 初始化 Socket 为 TCP 服务器模式

## 初始化步骤如下：

① 发送命令 CMD_SET_PROTO_TYPE_SN 设置 Socket 工作在 TCP 模式； ② 发送命令 CMD_SET_SOUR_PORT_SN 设置源端口 Sport； ③ 发送命令 CMD_OPEN_SOCKET_SN 打开 Socket；

④ 延时 2ms 以上发送命令 CMD_GET_CMD_STATUS 获取 CMD_OPEN_SOCKET_SN 执行状态，如果返回CH395_ERR_BUSY 表示 CH395 内部正在执行命令，需要再次执行④；如果返回 CH395_ERR_SUCCESS 表示命令执行成功，其他值表示打开 Socket 失败。

在 TCP 服务器模式下，如果客户端进行连接，在 Socket 一直处于监听状态，不会产生超时中断，如 果 TCP 连 接 成 功 ， CH395 会 产 生 SINT_STAT_CONNECT 中 断 ， 此 时 单 片 机 可 以 发 送 命 令CMD_GET_REMOT_IPP_SN 来获取客户端的 IP 地址和端口号。

默认的设置下，服务器多连接功能被关闭，TCP服务端模式下，每个Socket只可以建立一个TCP连接。

在多连接模式使能的情况下，TCP 服务器可以连接多个 TCP 连接，单片机需要设置 Socket 的源端口和服务器的源端口一致，如果 TCP 服务器监听到连接，CH395 会查找当前所有的 Socket 的源端口是否和当前服务器一致，协议类型为 TCP，且处于被关闭状态，如果找到则立即将此 Socket 打开，将连接分配给此 Socket，并通知单片机有连接事件，如果没找到，则将连接复位。此模式下服务器的Socket仅用来监听，单片机需要分配其它Socket用于该服务器的连接。例如Socket0设置为服务器模式，Socket1 和 Socket2 用于此服务器的连接，步骤如下：

Socket0 执行①-④；

⑤ 向 Socket1 发送命令 CMD_SET_SOUR_PORT_SN 设置源端口 Sport； ⑥ 向 Socket1 发送命令 CMD_SET_PROTO_TYPE_SN 设置 Socket 工作在 TCP 模式； ⑦ 向 Socket2 发送命令 CMD_SET_SOUR_PORT_SN 设置源端口 Sport； ⑧ 向 Socket2 发送命令 CMD_SET_PROTO_TYPE_SN 设置 Socket 工作在 TCP 模式；

关于数据结构，发送数据和接收数据流程可以参考 TCP 客户端模式。

## 9.2.7 DHCP

在开始下面的步骤前，首先要对 CH395 进行初始化。

DHCP 步骤如下：

① 发送命令 CMD_DHCP_ENABLE 参数为 1 启动 DHCP； ② 等待 CH395 产生 GINT_STAT_DHCP 中断； ③ 等到 GINT_STAT_DHCP 中断后，发送命令 CMD_GET_DHCP_STATUS 获取 DHCP 状态，如果状态码为0则表示成功，单片机可以发送命令CMD_GET_IP_INF来获取IP、MASK等信息。如果状态码为1表示失败，可能是 CH395 和 DHCP Server 之间的连接出现问题，例如 DHCP Server 不在线，虽然 CH395通过中断向单片机通告 DHCP 错误，但是内部仍然会一直重试来查找 DHCP Server，单片机可以发送

CMD_DHCP_ENABLE 命令，参数为 0 来停止 DHCP。

## 9.2.8 关于 TCP MSS 和缓冲区

CH395 支持修改 TCP MSS，默认的 TCP MSS 大小为 1460。一般而言 TCP MSS 越大通讯的速度和效率就越高。在对 TCP MSS 和接收缓冲区修改时应该遵循一些原则。

① （建议）接收缓冲区的长度不小于 2 倍的 TCP MSS； ② （必须）接收缓冲区的长度不得小于 TCP MSS； ③ （建议）接收缓冲区的长度不大于 6 倍的 TCP MSS； ④ （必须）发送缓冲区大小不超过 8KB。

在对 TCP MSS 修改时尽量能大则大，如果过小可能会导致以太网上的小包数据增多，影响通讯效率。

## 9.3 参考电路

## 9.3.1 CH395F 参考电路

<p align="center">图 CH395F 硬件参考电路</p>
![](https://lsky.bitnasdaq.vip/044Mjw.jpg)

CH395F 已内置了晶体 Y1 的部分振荡电容，C5 和 C6 可以根据晶体参数调节。对于负载电容为12pF 的 Y1，无需 C5 和 C6；对于负载电容为 20pF 的 Y1，C5 和 C6 建议各 15pF。

CH395F 已内置以太网 50Ω 阻抗匹配电阻，外部不要再接 49.9Ω 或 50Ω 电阻，等效于电压驱动。

T1 是 ethernet 网络变压器，其中心抽头分别通过电容 C8 和 C9 接地，不要接任何电源。

CH395F 可通过 J2、J3 跳线帽选择所需通信接口。关于接口配置详参 6.1 章节。

## 9.3.2 CH395A 参考电路

<p align="center">图 CH395A 硬件参考电路</p>
![](https://lsky.bitnasdaq.vip/65pOUB.jpg)

CH395A 已内置了晶体 Y1 的部分振荡电容，C5 和 C6 可以根据晶体参数调节。对于负载电容为12pF 的 Y1，无需 C5 和 C6；对于负载电容为 20pF 的 Y1，C5 和 C6 建议各 15pF。

CH395A 已内置以太网 50Ω 阻抗匹配电阻，外部不要再接 49.9Ω 或 50Ω 电阻，等效于电压驱动。

T1 是 ethernet 网络变压器，其中心抽头分别通过电容 C8 和 C9 接地，不要接任何电源。

C24、C25、C26、C27、C28 需各自贴近 VCCIO 引脚放置。

CH395A 可通过 J2、J3 跳线帽选择所需通信接口。关于接口配置详参 6.1 章节。

从 CH395Q升级到 CH395A，虽然两者引脚基本兼容，但网络变压器等外围电路连接可能需要调整，具体改动请参考 WCH 官方论坛相关文章或联系技术支持。

## 9.3.3 CH395P 参考电路

<p align="center">图 CH395P 硬件参考电路</p>
![](https://lsky.bitnasdaq.vip/AfQDsk.jpg)

CH395P 已内置了晶体 Y1 的部分振荡电容，C5 和 C6 可以根据晶体参数调节。对于负载电容为12pF 的 Y1，无需 C5 和 C6；对于负载电容为 20pF 的 Y1，C5 和 C6 建议各 15pF。

CH395P 已内置以太网 50Ω 阻抗匹配电阻，外部不要再接 49.9Ω 或 50Ω 电阻，等效于电压驱动。

T1 是 ethernet 网络变压器，其中心抽头分别通过电容 C8 和 C9 接地，不要接任何电源。

CH395P 可通过 J2、J3 跳线帽选择所需通信接口。关于接口配置详参 6.1 章节。

从 CH395L 升级到 CH395P，虽然两者引脚基本兼容，但网络变压器等外围电路连接可能需要调整，具体改动请参考 WCH 官方论坛相关文章或联系技术支持。