简介:一套基于STM32F105R的工业通信控制板完整设计资料,面向嵌入式硬件开发与单片机工程师,集成W5500以太网、CAN、RS232、RS485等多种通信接口,适用于物联网网关、工业数据采集和分布式控制等场景。压缩包内共226个文件,体积约3.44MB,主要包含Altium Designer设计的原理图与PCB工程(schdoc/pcbdoc)、STM32固件C源码及头文件(c/h/asm)、PDF文档和工程备份文件,目录结构清晰,便于检索阅读。硬件采用核心板+底板方式,核心板35x21mm、底板93x61mm,均为双层板双面布局;主控为STM32F105R,搭配W5500、HR911105A、ST3232ECTR、MAX3485ESA、SN65HVD230、LM284X等芯片,接口电路设计完整。这组设计已经实际制板并用于真实项目,可作为产品开发的直接参考。目前已有597人浏览学习,适合需要参考成熟工业通信控制板设计、进行二次开发或产品选型的工程师使用。
1. 一块板子集齐工业通信四件套,STM32F105是这么干的
一个典型的工业现场设备,常常同时要面对三种通信对象:上位机走以太网、设备间走 CAN 总线、本地调试走串口(232 或 485)。市面上单功能的通信板很多,但真正要把 W5500 以太网、双 CAN、RS232/RS485 全部集成到一块 10cm x 10cm 以内的控制板上,还能把原理图、PCB 和软件源码一次性给全,STM32F105-W5500-CAN-232-485 这套方案算是很典型的参考。STM32F105 属于互联型产品线,自带双 CAN 控制器和 USB OTG,配上 W5500 硬协议栈芯片做以太网,省掉主控跑 lwIP 的开销,剩下的 232/485 通道解决本地维护和远距离传感器接入。这篇就按硬件选型、原理图关键电路、PCB 布局布线、软件框架和调试验证的顺序,把这块板子的设计思路讲清楚。适合正在做工业控制器、DTU、边缘采集网关的工程师,也适合想从单片机往复杂外设集成交叉的嵌入式开发者参考。
2. STM32F105 为主控的硬件架构与外设选型
2.1 为什么选 STM32F105 而不是 F103 或 F407
很多人第一反应是 STM32F103 更便宜、资料更多,但再看一下需求就明白了:以太网、CAN、串口三个外设同时工作,F103 只有单 CAN,而且没有内置以太网 MAC,必须外接 MAC+PHY 芯片(比如 DM9000),BOM 成本并不低,驱动复杂度也高。F407 性能强,但 LQFP100 封装和 168MHz 主频对这块板来说性能过剩,而且 F4 的以太网 MAC 要配合外部 PHY(如 LAN8720A),还需要一颗 50MHz 振荡器给 PHY 提供参考时钟,PCB 上多一组差分走线,EMC 风险也多一处。
STM32F105 的定位正好卡在中间:72MHz Cortex-M3 内核,双 CAN 控制器,USB OTG FS,价格比 F103 略高但比 F4 低不少。关键是它的 CAN 控制器数量对上了——如果只做单 CAN,F103 就够;但标题里明确是 CAN(大概率双路),F105 的 TwinCAN 特性可以直接支持两路独立 CAN 总线,不需要外接 CAN 控制器芯片。W5500 通过 SPI 接口连接,占用主控资源极少,SPI 速率可以跑到 20MHz 以上,实际吞吐量足够覆盖大部分工业以太网场景。
2.2 W5500、CAN 收发器、232/485 电平转换芯片的搭配
以太网侧,W5500 是 WIZnet 的硬协议栈芯片,内部集成了 TCP/IP 协议栈(TCP、UDP、ICMP、ARP、IPv4),主控只需要通过 SPI 读写寄存器就能完成网络通信,不需要跑 lwIP 协议栈,这在资源受限的 MCU 上优势非常明显。外围只需一个 25MHz 晶振和网络变压器(RJ45 集成式或分离式均可),SPI 接口占 4 根线(SCS、SCLK、MOSI、MISO),外加一个中断引脚 INTn 用于通知主控有数据到达。注意 W5500 的 SPI 模式固定为模式 0 和模式 3(CPOL=0 CPHA=0 或 CPOL=1 CPHA=1),初始化时不能配错。
CAN 侧,STM32F105 内置两个 CAN 控制器,但控制器输出的是 TTL 电平的 CAN_TX/CAN_RX 信号,必须外接 CAN 收发器转成差分信号才能上总线。常见的收发器是 TJA1050(耐压一般)、TJA1040(低功耗待机)、SN65HVD230(3.3V 供电),这块板如果系统是 3.3V 主供电,SN65HVD230 可以直接用 3.3V 供电,少一路电源。如果 CAN 总线波特率要跑到 1Mbps,收发器的引脚间电容和传输延迟要留意,TJA1050 支持到 1Mbps,问题不大。
232 和 485 各占一个 USART。232 用 MAX3232(3.3V 供电版本),内部有电荷泵,不需要正负 12V 电源,只需要外接 4 个 0.1uF 电荷泵电容。485 用 SP3485(3.3V 供电)或 MAX3485,注意 485 是半双工,需要一个方向控制引脚(通常用 USART 的 RTS 或任意 GPIO)来切换发送/接收模式。
2.3 电源树设计:3.3V 单点供电还是多路隔离
这块板上的数字芯片都是 3.3V 供电(STM32F105、W5500、MAX3232、SP3485、SN65HVD230),所以主电源轨就是 3.3V,外部输入通常给 5V 或 12V,经过 DCDC 或 LDO 降到 3.3V。如果外部输入是 12V,建议用 MP1584 或 TPS5430 这类 DCDC 先降到 5V,再经过 AMS1117-3.3 线性稳压到 3.3V。DCDC 输出纹波控制在 50mV 以内,LDO 纹波可以做到 10mV 以内,对 W5500 的模拟 PHY 部分比较友好。
CAN 和 485 是否需要隔离,取决于应用场景。如果设备内部和外部总线之间没有共地条件,建议在 CAN/485 收发器与 MCU 之间加数字隔离器(如 ADUM1201),并且隔离侧单独供电(隔离 DCDC 模块如 B0505S)。但这会显著增加 PCB 面积和成本,标题里没有特别强调隔离,所以先按非隔离方案设计,PCB 上预留隔离器件焊盘,后续可以升级。
表:核心芯片选型参考
| 功能 | 芯片型号 | 接口 | 关键参数 | 备注 |
|---|---|---|---|---|
| 主控 | STM32F105RBT6 | SPI/USART/CAN/USB | 72MHz,256KB Flash,64KB RAM | 双 CAN,互联型 |
| 以太网 | W5500 | SPI(模式 0/3) | 硬 TCP/IP,8 个 Socket,32KB TX/RX Buffer | 需 25MHz 晶振 |
| CAN 收发器 | TJA1050 / SN65HVD230 | CANH/CANL | 1Mbps,3.3V 或 5V 供电 | 注意共模电压范围 |
| RS232 | MAX3232 | UART | 3.3V 供电,电荷泵 | 4 个 0.1uF 外部电容 |
| RS485 | SP3485 / MAX3485 | UART + DIR | 3.3V 供电,半双工 | 需 A/B 上拉下拉 |
3. 原理图关键电路:W5500 以太网、CAN 收发器与串口电平转换
3.1 W5500 以太网电路:变压器选型与阻抗匹配
W5500 的以太网接口电路是这块板原理图里最需要注意的部分,因为它涉及到模拟信号走线、共模电感和变压器选型。W5500 的 TXOP/TXON 和 RXIP/RXIN 是差分信号对,必须通过网络变压器连接到 RJ45 座。变压器的作用是电气隔离、共模抑制和阻抗匹配(100Ω 差分阻抗)。
常见的做法是选用带集成变压器的 RJ45 座,比如 HR911105A 或者 LJ4812V10NL 这类带网络变压器的连接器,PCB 上少一组分立元件,占用面积也小。如果选分离式变压器(如 20F001N 或 HX1188NL),还需要在 PHY 侧加 49.9Ω 或 50Ω 的串阻(有的参考设计用 1:1 变压器且 PHY 内部已有匹配电阻,外部可以不加,需要看芯片手册具体要求)。
W5500 的典型接法参考以下代码片段的引脚连接描述,原理图里这些信号名要对应清楚:
W5500 引脚 -> STM32F105 引脚 SCS -> PA4 (SPI1_NSS,软件控制片选) SCLK -> PA5 (SPI1_SCK) MOSI -> PA7 (SPI1_MOSI) MISO -> PA6 (SPI1_MISO) INTn -> PB0 (外部中断输入,下降沿触发) RSTn -> PB1 (复位信号,低电平复位)注意:W5500 的 RSTn 引脚需要 10kΩ 上拉到 3.3V,且复位脉冲宽度至少 500us。INTn 要加上拉电阻,防止悬空误触发中断。
3.2 CAN 收发器电路:终端电阻与共模电感
CAN 总线物理层是差分对 CANH 和 CANL,收发器 TJA1050 的数据如下:
- CAN_TX(来自 MCU) -> TJA1050 的 TXD 引脚
- CAN_RX(来自 MCU) -> TJA1050 的 RXD 引脚
- CANH / CANL 输出到总线,CANH 和 CANL 之间接 120Ω 终端电阻
终端电阻是否焊接,取决于节点是否在总线两端。如果这块板是总线中间的节点,PCB 上预留 120Ω 电阻焊盘但不焊接;如果是终端节点,就焊上。错误做法是每个节点都焊 120Ω,会导致总线阻抗变 60Ω,信号反射严重,通信误码率上升。
CAN 收发器输出侧最好加共模电感(如 ACM7060-701-2P)和 TVS 管(如 PESD1CAN)做 ESD 保护。TVS 管选 24V 工作电压的型号,防止总线过压损坏收发器。CAN 总线的隐性电平是 2.5V(CANH 和 CANL 之间电压差为 0V),显性电平是 CANH 3.5V / CANL 1.5V(压差 2V),调试时用示波器量这两根线的波形就能判断收发器是否正常工作。
3.3 RS232 与 RS485 电路:注意电荷泵电容和方向控制
RS232 接口 MAX3232 的外围极其简单,除了电源去耦电容,就是 4 个电荷泵电容。具体接法:
- C1 接在 V+ 和 V- 之间(1uF 或 0.1uF,看芯片手册)
- C2、C3、C4 分别接在 V+ 到地、V- 到地、VCC 到地
有些国产兼容芯片对电容值不那么敏感,0.1uF 到 1uF 都能工作,但建议按数据手册推荐值来。MAX3232 的 T1IN/R1OUT 接 STM32F105 的 USART2_TX/USART2_RX,T1OUT/R1IN 接 DB9 座,注意 DB9 的 2 脚是 RX、3 脚是 TX,交叉连接不要搞反。
RS485 电路 SP3485 需要一个方向控制引脚。常见做法是用 STM32F105 的 USART3 的 RTS 引脚(PA15)或任意空闲 GPIO 控制 DE/RE。DE 和 RE 在 SP3485 里是两个引脚,但通常短接在一起,高电平发送、低电平接收。切换时序要注意:从发送切到接收时,要等发送移位寄存器完全发送完(可以用 USART 的 TC 中断或等待 TXE 和 TC 标志位),然后再拉低方向引脚,否则最后一个字节的末尾会被截断。
SP3485 的 A、B 引脚需要加偏置电阻:A 上拉 10kΩ 到 3.3V,B 下拉 10kΩ 到 GND。这是为了保证总线空闲时 A 比 B 高,避免误接收。总线上终端电阻(120Ω)只加在两端节点上,中间节点不要加。
3.4 晶振电路与复位电路
STM32F105 需要两颗晶振:HSE 用 8MHz(或者 25MHz 直接作为主时钟,但多数用 8MHz 再 PLL 倍频到 72MHz),LSE 用 32.768kHz 给 RTC。如果不用 RTC,LSE 可以不焊,PCB 上预留位置。
HSE 晶振的两个负载电容(典型 20pF)要尽量靠近 OSC_IN/OSC_OUT 引脚,并且晶振下方不要走其他信号线。复位电路用 RC 复位:10kΩ 上拉 + 0.1uF 到地,再接 STM32 的 NRST 引脚。如果要做远程升级,可以加一个外部看门狗或复位芯片(如 MAX809),但基础版本 RC 复位就够用。
4. PCB 布局布线:以太网差分对处理与 CAN/485 走线规则
4.1 板层设置与叠层方案
这块板涉及以太网差分信号、CAN 差分信号和 SPI 高速信号,PCB 层数至少 4 层才能保证信号完整性和 EMC。常见的叠层结构:
- TOP:元件面,走信号线(SPI、UART、CAN、以太网差分对)
- INNER1:GND 平面(完整地平面,不分割)
- INNER2:Power 平面(3.3V,必要时分割出模拟 3.3V)
- BOTTOM:元件面,走信号线(低速信号、电源走线)
如果预算允许,6 层板可以多一个完整地平面和信号层,但对这个板子来说 4 层已经足够。关键点在于 GND 平面必须完整,禁止在 GND 平面上走信号线或切槽。W5500 下方的 GND 平面不要有空洞,因为 W5500 内部有模拟 PHY,对地回流噪声敏感。
4.2 W5500 以太网差分对的布线规则
以太网差分对(TXOP/TXON 和 RXIP/RXIN)是 PCB 上最需要注意的信号。以下规则必须遵守:
差分对等长,长度差控制在 5mil 以内。差分阻抗 100Ω。差分对之间间距至少 3 倍线宽。差分对下方必须有连续地平面,不能跨分割。
具体来说,这 4 根线走 TOP 层,线宽按叠层厚度计算(比如 4 层板 TOP 到 INNER1 间距 4mil 时,线宽 6mil 左右能达到 100Ω 差分阻抗)。不要走 Via 换层,如果必须换层,要在 Via 旁边加回流地孔,并且保证换层前后的两侧都走在同一参考平面上。
W5500 的 25MHz 晶振要靠近 XI/XO 引脚放置,走线短而粗,晶振下方和周围禁止走其他信号线,晶振外壳接地。网络变压器下方的 GND 平面要挖空(Clearance),防止变压器耦合噪声耦合到地平面。RJ45 座的外壳(屏蔽壳)通过一个 1nF 电容接到 GND,或者直接接机壳地(如果机壳地和 GND 是分开的),注意不要用一个大电阻接到 GND 导致噪声泄放不畅。
4.3 CAN 和 485 总线走线的布线要求
CAN 总线差分对和 485 差分对走线要求类似,但可以不那么严格,因为 CAN 波特率最高 1Mbps、485 波特率最高 10Mbps 左右,电气长度远小于波长,主要关注的是共模干扰和串扰。
CAN 差分对 CANH/CANL 走线要求:
- 等长:长度差控制在 20mil 以内(1Mbps 以下 50mil 也可以)
- 线宽:10mil 以上,差分阻抗 120Ω 左右(60Ω 单端阻抗)
- 与其它信号线的间距至少 3 倍线宽
- CAN 收发器放在 MCU 和连接器之间,连线最短
485 差分对 A/B 走线要求和 CAN 类似,但注意 485 是半双工,A/B 线要成对走线,不要分开走。SP3485 的方向控制引脚(DE/RE)走线不需要特殊处理,但 DE 信号切换时如果和 A/B 线靠太近,可能造成串扰,建议 DE 走线远离差分对。
4.4 PCB 布局顺序与分割策略
布局顺序一般按信号流向走:电源输入端(连接器/DCDC/LDO)放在板边一角,STM32F105 居中,W5500 靠近 RJ45 座放在板边(RJ45 座务必放在板边,方便插网线),CAN 收发器靠近 CAN 连接器,485 收发器靠近 485 端子,232 芯片靠近 DB9 座。元件面不要摆得太满,留出走线通道和散热空间。
电源走线宽度要求:3.3V 主电源走线至少 30mil(1A 电流),GND 走线至少 30mil。如果 DCDC 输出 5V 的电流更大(比如给 W5500 和 CAN 收发器供电),走线加宽到 50mil。DCDC 的电感下方要留地平面填充,减少 EMI 辐射。
模拟地和数字地是否分割,取决于 W5500 的模拟部分。W5500 数据手册建议用单一地平面,不要分割模拟地和数字地,因为分割会造成回流路径不连续,反而增加噪音。正确的做法是整个板使用统一 GND 平面,W5500 供电用磁珠(如 600Ω/100MHz)从 3.3V 再单独滤波一次,得到 AVCC 给 W5500 的 AVDD 引脚。
5. 软件源码框架:SPI 驱动 W5500、CAN 初始化与串口应用层
5.1 W5500 软件初始化的寄存器操作流程
W5500 的软件驱动核心是 SPI 读写寄存器。W5500 的 SPI 帧格式是三段式:地址段(16bit)+ 控制段(8bit)+ 数据段(8bit x N)。控制段最高位是块选择(BM,0 表示通用寄存器、1 表示 Socket 寄存器),然后是读写位(RWB,1 读 0 写),最后是 OM 操作模式(SPI 数据长度)。
以一个典型的 W5500 初始化为例,以下代码是把 W5500 配置为 TCP Server 的最简流程:
// W5500 寄存器地址定义 #define W5500_COMMON_MR 0x0000 #define W5500_COMMON_GAR0 0x0001 #define W5500_COMMON_SUBR0 0x0005 #define W5500_COMMON_SHAR0 0x0009 #define W5500_COMMON_SIPR0 0x000F #define W5500_SOCK_MR 0x0001 #define W5500_SOCK_CR 0x0004 #define W5500_SOCK_SR 0x0005 #define W5500_SOCK_TX_FSR 0x0024 #define W5500_SOCK_RX_RSR 0x0026 // SPI 读写函数 uint8_t w5500_read_reg(uint16_t addr, uint8_t block, uint8_t rwb) { uint8_t buf[3], data = 0; // 三段式SPI帧:地址(16bit)+控制(8bit) buf[0] = (uint8_t)(addr >> 8); buf[1] = (uint8_t)(addr & 0xFF); buf[2] = (block << 4) | (rwb << 2) | 0x01; // OM=001 表示读写单字节 SPI_CS_LOW(); HAL_SPI_Transmit(&hspi1, buf, 3, 100); HAL_SPI_Receive(&hspi1, &data, 1, 100); SPI_CS_HIGH(); return data; } // W5500 初始化:设置 IP、子网掩码、网关、MAC void w5500_init_config(void) { uint8_t mac[6] = {0x00, 0x08, 0xDC, 0x12, 0x34, 0x56}; uint8_t ip[4] = {192, 168, 1, 100}; uint8_t subnet[4] = {255, 255, 255, 0}; uint8_t gw[4] = {192, 168, 1, 1}; w5500_write_reg(W5500_COMMON_MR, 0x08, 0x00); // 软件复位 HAL_Delay(100); // 配置 MAC、IP、网关 for(int i = 0; i < 4; i++) { w5500_write_reg(W5500_COMMON_GAR0 + i, gw[i], 0x00); w5500_write_reg(W5500_COMMON_SUBR0 + i, subnet[i], 0x00); w5500_write_reg(W5500_COMMON_SIPR0 + i, ip[i], 0x00); } for(int i = 0; i < 6; i++) { w5500_write_reg(W5500_COMMON_SHAR0 + i, mac[i], 0x00); } }逻辑说明:w5500_read_reg函数的第三个参数就是 SPI 帧的控制段,block 位选择访问通用寄存器还是 Socket 寄存器,rwb 位决定读还是写。写函数(w5500_write_reg)的 SPI 发送流程是先发地址段和控制段,再发数据段。
参数要点:OM 段(低 3 位)很重要,不同的值决定一次能读写多少字节的数据。如果只想读 1 字节,OM=001 即可;如果想读 2 字节(比如读接收缓冲区大小会用 2 字节),OM=010。很多现成 W5500 驱动库默认用 0x04 表示读 2 字节、0x03 表示写 2 字节,混用会导致数据错位,这点在移植驱动时要确认。
5.2 CAN 初始化与波特率计算方法
STM32F105 的双 CAN 控制器共用一套初始化流程。波特率计算很关键:CAN 波特率由 APB1 时钟(36MHz)、预分频器(BRP)和时间段(BS1 + BS2 + 1)决定。公式如下:
波特率 = APB1_CLK / (BRP + 1) / (1 + BS1 + BS2)例如:APB1 = 36MHz,BRP = 3,BS1 = 6,BS2 = 5,则波特率 = 36000000 / 4 / (1 + 6 + 5) = 750000 = 500kbps。经典案例:
CAN_HandleTypeDef hcan1; hcan1.Instance = CAN1; hcan1.Init.Prescaler = 3; // BRP + 1 = 4,即 BRP = 3 hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ; // 同步跳跃宽度 hcan1.Init.TimeSeg1 = CAN_BS1_6TQ; // BS1 = 6 个时间量子 hcan1.Init.TimeSeg2 = CAN_BS2_5TQ; // BS2 = 5 个时间量子 hcan1.Init.TimeTriggeredMode = DISABLE; hcan1.Init.AutoBusOff = ENABLE; // 总线关闭自动恢复 hcan1.Init.AutoWakeUp = DISABLE; hcan1.Init.AutoRetransmission = ENABLE; // 自动重发 hcan1.Init.ReceiveFifoLocked = DISABLE; hcan1.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan1) != HAL_OK) { Error_Handler(); }逻辑说明:Prescaler=3 意味着实际分频因子是 4(因为公式里是 BRP+1)。BS1 和 BS2 的单位是时间量子(TQ),一个位时间由同步段(固定 1 TQ)+ BS1 + BS2 组成。上例中一个位时间 = 1 + 6 + 5 = 12 TQ,采样点位置在 (1 + 6) / 12 = 58.3% 处,这是推荐在 500kbps 下常用的采样点(一般推荐 75%~80% 附近,根据总线长度调整)。
SJW(同步跳跃宽度)设置为 1TQ 是保守值,适用于晶振精度不太好的场景。如果你的系统晶振精度很高(比如 50ppm 以内),SJW 可以设置成 2TQ,容错能力更强。CAN 总线上波特率不一样的两个节点会直接导致错误帧,调试时用示波器抓 CANH/CANL 波形,测量一个位时间的宽度,用 1 / 位宽算实际波特率。
5.3 串口 232/485 的驱动设计与缓冲区管理
232 和 485 在软件层面都是标准 UART,区别只在物理层。STM32F105 的 USART2 做 232、USART3 做 485,波特率常用 9600、19200、115200。485 的发送方向控制用 GPIO 翻转实现,关键是在 HAL_UART_Transmit 之后等待发送完成再拉低方向引脚。
// USART3 发送一帧数据后拉低 485 方向控制 void uart3_send_485(uint8_t *data, uint16_t len) { HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_SET); // 发送模式 HAL_UART_Transmit(&huart3, data, len, 100); // 阻塞发送 while (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_TC) == RESET); // 等待发送完成 HAL_GPIO_WritePin(RS485_DIR_GPIO_Port, RS485_DIR_Pin, GPIO_PIN_RESET); // 切回接收 }逻辑说明:HAL_UART_Transmit返回时只代表数据已经进了发送移位寄存器,并不代表物理发送完成。如果此时立刻把 485 方向切回接收,最后一个字节的停止位会被截断,对端会收到校验错误或帧错误。所以必须要等UART_FLAG_TC(发送完成标志)置位后再切方向。
参数说明:超时时间 100ms 是在波特率 9600 下发送一帧(最多 256 字节)的充足余量,如果波特率更低或数据更长,调大超时。485 总线在发送和接收切换之间需要等待总线空闲(一般 1 个字节时间以上),如果两个节点之间没有这个等待间隔,会出现总线冲突。
接收侧,232 和 485 都建议用 DMA + 空闲中断的方式接收不定长帧。USART 的中断里判断帧结束比较简单,但高波特率下容易丢字节,DMA 接收配合HAL_UART_Receive_DMA和空闲回调可以做到不丢字节。这块板的内存只有 64KB,DMA 环形缓冲大小建议分配 512 字节/通道,四个串口同时工作也不会超出内存预算。
6. 板级调试与验证方法:从 CAN 波形到 TCP 回环测试
拿到板子后的验证顺序很重要,不要一上来就全部外设一起开工。每做一步就验证一步,出了问题能缩小排查范围。
先测电源:上电后用万用表量 3.3V 是否在 3.2V~3.4V 范围内,用示波器看纹波,如果纹波超过 50mV,检查 DCDC 的电感和输出电容是否焊接正确。然后测晶振:用示波器探头(x10 挡)量 STM32F105 的 OSC_OUT 引脚,能看到 8MHz 正弦波或方波(幅度大约 1V 左右);量 W5500 的 XI 引脚,25MHz 波形正常则说明 W5500 晶振起振了。注意 W5500 如果没拉高 RSTn,晶振可能不起振,量波形之前先确认复位引脚电平。
接着烧录最小程序:GPIO 翻转测试 + UART1 打印。如果串口打印正常,基本确认 MCU 的时钟、复位、启动配置没问题。串口打印乱码时,优先怀疑时钟配置(PLL 倍频算错)而不是波特率设置。
然后逐项验证通信接口:
CAN 验证方法:逻辑分析仪或示波器接在 CANH 和 CANL 之间,发送一帧数据,波形应该是差分信号。如果波形电压在 2.5V 上下对称,隐性电平正确;如果波形幅度只有 1V 左右,检查收发器的供电和总线终端电阻。再确认波特率,计算方法:示波器量一个显性位的时间宽度,1 除以位宽得到实测波特率,和配置值对比。如果两个板子通信不了,用cansend或逻辑分析仪的 CAN 解码功能看错误帧类型(位错误、格式错误、填充错误)。
W5500 以太网验证:先设置静态 IP(比如 192.168.1.100),从 PC ping 通。ping 不通时用 Wireshark 抓包,看有没有 ARP 请求发出、有没有回应。如果 PC 发 ARP 但板子没回,检查 W5500 的中断引脚、复位引脚、SPI 配置(特别注意 SPI 模式是 0 还是 3);如果回 ARP 但 ping 不通,检查 IP 配置的字节序(W5500 寄存器是大端序,MAC/IP 地址按顺序写入即可,不需要反转)。打通 TCP 后,用现成的 TCP 调试助手发一段 1000 字节的测试数据,板子回显,对比收发数据一致性。
CAN 和以太网的联合验证是个方便的手段:W5500 支持多个 Socket 同时工作,可以开一个 Socket 做 TCP Server,另一个 Socket 做 UDP 发送。在这个板子的常见应用里,TCP 通道做数据下发,CAN 做数据上报,UDP 做设备发现(广播/组播),这样设计时注意 W5500 的 TX/RX Buffer 分配。W5500 的 32KB Buffer 分为 16KB TX、16KB RX 两块,8 个 Socket 默认是平均分配(每个 2KB TX + 2KB RX),如果某个 Socket 流量特别大,需要重新设置Sn_RXBUF_SIZE和Sn_TXBUF_SIZE寄存器的值。Buffer 大小是 2 的幂次方(1/2/4/8/16KB),8 个 Socket 的 Buffer 总和不能超过 16KB TX + 16KB RX。
RS232/485 验证时,准备一个 USB 转 232 或 USB 转 485 的调试线,接上后发送数据看是否回显。485 调试最容易踩的坑:只有发送没有接收,检查方向控制引脚是否切换正常;两个 485 设备对接时 A 接 A、B 接 B,反接是不会有数据的;终端电阻如果两端都焊了,看示波器波形幅度,应该略低于 2V 差分幅度。
最后做一次整机压力测试:三个通信口同时满负荷收发(TCP 连续收发 + CAN 定时发送 + 串口循环打印),跑 24 小时,观察是否有死机、数据丢帧或 W5500 异常断连。跑测期间用示波器记录 3.3V 电源纹波和 W5500 INTn 引脚的脉冲变化,如果 W5500 偶尔不发中断,考虑把 INTn 从下降沿触发改成低电平触发模式并且配置为电平中断,连续读 Socket 中断状态寄存器等做双重确认。这一步做完,板子的通信可靠性基本就有了数据支撑。
本文还有配套的精品资源,点击获取