WIZnet W5500 快速上手:SPI 接線與 Socket 初始化
從硬體 TCP/IP 的概念、SPI 接線、ioLibrary 初始化到開啟第一個 socket,逐步帶你讓 W5500 與 Arduino / STM32 連上網。
為什麼用硬體 TCP/IP?
W5500 把整個 TCP/IP 協定堆疊做在晶片內部,MCU 不需要跑軟體協定堆疊,也不需要 RTOS,省下大量 Flash/RAM 與 CPU 週期。
它內建 32KB 收發緩衝區、支援最多 8 個獨立 socket,並整合 PHY,因此外部電路只需要 RJ45 與變壓器,非常適合資源有限的 MCU 與要求連線穩定的工業場景。
SPI 接線
W5500 透過 SPI 與主控 MCU 溝通,需要連接 SCSn(晶片選擇)、SCLK、MOSI、MISO 四條基本訊號,外加 RSTn(重置)與選用的 INTn(中斷)。
注意三點:W5500 的 SPI 支援 Mode 0 與 Mode 3;IO 為 3.3V(5V MCU 需準位轉換或確認耐受);MCU 與 W5500 必須共地。初期除錯可先把 SCLK 降到 1~8 MHz 確保穩定,之後再提速。
用 ioLibrary 初始化
WIZnet 官方提供開源的 ioLibrary 驅動。流程是:先註冊 SPI 的讀寫位元組與晶片選擇 callback,呼叫 wizchip_init() 並指定每個 socket 的收發緩衝區大小(總和 ≤ 16KB),再用 wizchip_setnetinfo() 設定 MAC / IP / Gateway / Subnet。
初始化後務必檢查 PHY 連線狀態(link up)與讀回的版本暫存器,確認 SPI 通訊正常,這是最常見的除錯切入點。
開啟第一個 Socket
以 TCP 客戶端為例:用 socket() 開啟某個 socket 為 Sn_MR_TCP,呼叫 connect() 連到目標 IP 與 port,成功後即可用 send() 與 recv() 收發資料,結束時 close()。TCP 伺服端則改用 listen() 等待連線。
Modbus/TCP、MQTT 等協定本質上都是在 TCP socket 上跑封包,因此 W5500 只負責傳輸,封包格式由 MCU 端處理,移植非常單純。
文中提及的產品
W5500 硬體 TCP/IP Ethernet 控制器
W5500 是 WIZnet 的旗艦以太網控制器,採用獨特的硬體 TCP/IP stack,無需軟體實作 TCP/IP 協定即可直接建立網路連線。透過 SPI 介面與主控 MCU 連接,內建 32KB 收發 Buffer,支援最多 8 個 socket,是 Arduino/Raspberry Pi 生態系最廣泛採用的以太網晶片。
W5100S 硬體 TCP/IP Ethernet 控制器(多介面)
W5100S 是 W5100 的升級版,支援 SPI 及並列介面,提供 16KB 收發 Buffer 及 4 個 socket,相較 W5100 增加 SOCKET-less 命令、自動工作喚醒(WOL)及 PHY 掉電模式,適合需要並列介面的嵌入式系統。