本系列文章只讲如何使用W5500驱动库。
W5500驱动教程请参考:
本系列教程中对W5500模块和开发板之间的连接方式如图:
W5500引脚 | STM32引脚 |
---|---|
3V3 | 3V3 |
GND | GND |
CS | PA15(SPI3_NSS) |
MISO | PC11(SPI3_MISO) |
MOSI | PB5(SPI3_MISO) |
SCK | PC10(SPI3_SCK) |
nRST | PC0 |
nINT | PB14 |
本系列实验需要PC和开发板在同一个网段(在同一个路由器)上,目前我的配置环境为:
所以将开发板地址设置为192.168.10.xxx,这里我设置为192.168.10.6:
使用PC测试是否可以ping通开发板:
如果可以ping通,则网络环境正常,可以进行后续实验。
W5500 驱动库提供的 Socket API 称为 WIZnet socket API,实现在:socket.h
和socket.c
中。
WIZnet socket API 基于Berkeley socket API,所以它具有非常相似的名称和接口,但是也有一些差异。
WIZnet socket API 和 Berkeley socket API 的对比如下:
API | WIZnet | Berkeley |
socket() | O | O |
bind() | X | O |
listen() | O | O |
connect() | O | O |
accept() | X | O |
recv() | O | O |
send() | O | O |
recvfrom() | O | O |
sendto() | O | O |
closesocket() | O close() & disconnect() |
O |
从表里可以看到,WIZnet提供的Socket API没有bind和accept,所以使用 WIZnet API的流程如下:
功能:使用传递的socket number初始化socekt并且打开socket。
原型:
int8_t socket (uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag);
参数说明:
① WIZCHIP_SOCK_NUM_是W5500芯片所能建立的最大独立socket数量,在 wizchip_conf.h 中定义,目前为8。
#if _WIZCHIP_ >= W5200
#define _WIZCHIP_SOCK_NUM_ 8 ///< The count of independant socket of @b WIZCHIP
#else
#define _WIZCHIP_SOCK_NUM_ 4 ///< The count of independant socket of @b WIZCHIP
#endif
返回值:
② 协议类型用于配置socket n 模式寄存器(Sn_MR)的低 4 位:
W5500驱动库中提供了对应的宏定义:
/**
* @brief MAC LAYER RAW SOCK
* @details This configures the protocol mode of Socket n.
* @note MACRAW mode should be only used in Socket 0.
*/
#define Sn_MR_MACRAW 0x04
/**
* @brief UDP
* @details This configures the protocol mode of Socket n.
*/
#define Sn_MR_UDP 0x02
/**
* @brief TCP
* @details This configures the protocol mode of Socket n.
*/
#define Sn_MR_TCP 0x01
/**
* @brief Unused socket
* @details This configures the protocol mode of Socket n.
*/
#define Sn_MR_CLOSE 0x00
功能:监听来自客户端的连接请求。
原型:
int8_t listen (uint8_t sn);
参数说明:
返回值:
功能:连接服务端。
原型:
int8_t connect (uint8_t sn, uint8_t *addr, uint16_t port);
参数说明:
返回值:
功能:发送TCP数据。
原型:
int32_t send (uint8_t sn, uint8_t *buf, uint16_t len);
参数说明:
返回值:
功能:接收TCP数据。
原型:
int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len);
参数说明:
返回值:
功能:发送UDP数据。
原型:
int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port);
参数说明:
返回值:
功能:接收 UDP 数据。
原型:
int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port);
参数说明:
返回值:
功能:关闭socket。
原型:
int8_t close(uint8_t sn);
参数说明:
返回值: