STM32F103C8T6与W5500的运行示例
模块说明
W5500的厂商是韩国WIZnet, 特性如下
- 全硬件TCP/IP协议栈: TCP,UDP,ICMP,IPv4,ARP,IGMP,PPPoE -- 注意只有IPv4
- 支持SPI模式0,3, 最高80MHz SPI时钟
- 8个独立的硬件Socket, 各路通信互不影响
- 32K字节收发缓存, 可以灵活定义各个Socket的大小
- 集成802.3以太网MAC
- 集成10Base-T / 100Base-T以太网PHY
- 支持嵌入式操作系统:Linux & RTOS
- 支持掉电模式 & UDP网络唤醒
- 工作电压3.3V, I/O 5V耐压
- 支持自动协商(全/半双工, 10M/100M)
用起来比ENC28J60简单多了, 不用费劲巴拉的套uIP, LWIP了.
在stm32f103c8t6上运行W5500
需要的组件
- STM32F103C8T6开发板
- W5500模块
- USB2TTL: PL2303 or CH340 or FT232 or CP2102
- ST-Link or J-LInk
- 带网口的路由器或交换机, 方便联网测试
接线图
这个示例中只需要用到SPI接口, RST和INT都是置空. PA9和PA10用来观察log输出
| W5500 | STM32 | USB2TTL |
|---|---|---|
| GND | GND | GND |
| VCC | 3.3V | |
| RST | ||
| INT | ||
| SCS | PA0 | |
| CLK | PA5 | |
| MISO | PA6 | |
| MOSI | PA7 | |
| PA9 | RX | |
| PA10 | TX |
运行和代码说明
代码地址
https://github.com/IOsetting/stm32f103-w5500
代码说明
基于官方的代码库: https://github.com/Wiznet/ioLibrary_Driver
现在淘宝商家给的代码示例, 以及网络上搜到的W5500项目, 代码大都是非官方的实现(或者是从官方早期某个版本修改而来), 运行在F103Vxx或者F103Rxx的板子上是正常的, 但是换到F103C8xx板子上就会有问题, 而且不好修改.
建议基于官方Github上的库做开发.
- WIKI: https://wizwiki.net/wiki/doku.php/products:w5500:driver
- 关于读取是使用中断还是寄存器的讨论: https://forum.wiznet.io/t/topic/4407/4
接收数据
Use getSn_RX_RSR(sn): Sn_RX_RSR indicates the data size received and saved in Socket n RX Buffer.
Some interesting reading:
uint16_t getSn_RX_RSR(uint8_t sn)
{
uint16_t val=0,val1=0;
do {
val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
if (val1 != 0) {
val = WIZCHIP_READ(Sn_RX_RSR(sn));
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
}
} while (val != val1);
return val;
}
In this method, RX_RSR was read twice in each iteration till the values are the same. This is to avoid the problem described in UDP header seems to contain the expected size, but the RX_RSR value is much smaller
Read all data if the length exceeds your buffer size:
if((size = getSn_RX_RSR(sn)) > 0) { // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
ret = recv(sn, buf, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)
if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
size = (uint16_t) ret;
// Add code here to handle the data
}
发送数据
uint16_t sentsize = 0;
while(size != sentsize) {
ret = send(sn, buf+sentsize, size-sentsize); // Data send process (User's buffer -> Destination through H/W Tx socket buffer)
if(ret < 0) { // Send Error occurred (sent data length < 0)
close(sn); // socket close
return ret;
}
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
配置 MAC, IP, Mask, Gateway and Remote Server IP
编辑 main.c, 在下面的代码中进行修改
void Load_Net_Parameters(void)
{
gWIZNETINFO.gw[0] = 192; //Gateway
gWIZNETINFO.gw[1] = 168;
gWIZNETINFO.gw[2] = 1;
gWIZNETINFO.gw[3] = 1;
gWIZNETINFO.sn[0]=255; //Mask
gWIZNETINFO.sn[1]=255;
gWIZNETINFO.sn[2]=255;
gWIZNETINFO.sn[3]=0;
gWIZNETINFO.mac[0]=0x0c; //MAC
gWIZNETINFO.mac[1]=0x29;
gWIZNETINFO.mac[2]=0xab;
gWIZNETINFO.mac[3]=0x7c;
gWIZNETINFO.mac[4]=0x00;
gWIZNETINFO.mac[5]=0x01;
gWIZNETINFO.ip[0]=192; //IP
gWIZNETINFO.ip[1]=168;
gWIZNETINFO.ip[2]=1;
gWIZNETINFO.ip[3]=204;
gWIZNETINFO.dhcp = NETINFO_STATIC;
}
uint8_t destip[4] = {192, 168, 1, 210};
uint16_t destport = 3333;
输出日志
在编译参数中增加 _DHCP_DEBUG_ and _LOOPBACK_DEBUG_ 将在UART1中输出日志.
编译
包含路径
..\libraries\CMSIS\CM3\CoreSupport;..\libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x;..\libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm;..\libraries\STM32F10x_StdPeriph_Driver\inc;..\hardware;..\user
产生的编译控制字符串
--c99 --gnu -c --cpu Cortex-M3 -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ../libraries/CMSIS/CM3/CoreSupport -I ../libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x -I ../libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm -I ../libraries/STM32F10x_StdPeriph_Driver/inc -I ../hardware -I ../user
-I./RTE/_stm32f103c8w5500
-IC:/Keil_v5/ARM/PACK/Keil/STM32F1xx_DFP/2.3.0/Device/Include
-IC:/Keil_v5/ARM/CMSIS/Include
-D__UVISION_VERSION="525" -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -D_DHCP_DEBUG_ -D_LOOPBACK_DEBUG_
-o .\Objects\*.o --omf_browse .\Objects\*.crf --depend .\Objects\*.d
烧录
使用 ST-Link 将代码写入开发板
ST-Link 和 STM32F103C8T6 开发板的连接方式
G -- GND
CLK -- SWCLK
IO -- SWDIO
V3 -- 3.3V
测试
- Ping test: Ping the IP address you defined in main.c
- TCP client test: Run
nc -l 3333to listen port 3333 on server IP, and restart stm32 board
STM32F103C8T6与W5500的运行示例的更多相关文章
- Servlet与Tomcat运行示例
Servlet与Tomcat运行示例 本文将写一个servlet,然后将其部署到Tomcat的全过程.本文参考<深入拆解Tomcat_Jetty>内容. 一.基于web.xml开发步骤 下 ...
- Windows上配置Mask R-CNN及运行示例demo.ipynb
最近做项目需要用到Mask R-CNN,于是花了几天时间配置.简单跑通代码,踩了很多坑,写下来分享给大家. 首先贴上官方Mask R-CNN的Github地址:https://github.com/m ...
- Kurento安装与入门02——运行示例前的准备
官方一共提供了13个示例,这些示例运行的方式大同小异,一般会提供JAVA.Browser JavaScript.Node.js三种版本,这里仅演示java版本的示例.这些示例要求系统内已经正确安装了K ...
- Hadoop版Helloworld之wordcount运行示例
1.编写一个统计单词数量的java程序,并命名为wordcount.java,代码如下: import java.io.IOException; import java.util.StringToke ...
- Spark Streaming + Flume整合官网文档阅读及运行示例
1,基于Flume的Push模式(Flume-style Push-based Approach) Flume被用于在Flume agents之间推送数据.在这种方式下,Spark Stre ...
- 用Java为Hyperledger Fabric(超级账本)开发区块链智能合约链代码之部署与运行示例代码
部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...
- SkylineGlobe 支持火狐和谷歌浏览器的可运行示例代码
示例代码: <html> <head> <title>3dml的Feature对象选中和隐藏</title> <script type=" ...
- windows下在idea用maven导入spark2.3.1源码并编译并运行示例
一.前提 1.配置好maven:intellij idea maven配置及maven项目创建 2.下载好spark源码: 二.导入源码: 1.将下载的源码包spark-2.3.1.tgz解压(E:\ ...
- DX12龙书 00 - 环境配置:通过 Visual Studio 2019 运行示例项目
0x00 安装 Visual Studio 2019 安装 Visual Studio 2019 以及相关组件. 注:安装组件时带的 Windows 10 SDK 可以在 Individual com ...
- Neo4j Cypher运行示例
示例来源: Neo4j in Action. 0 准备数据 0.1 node (user1 { name: 'John Johnson', type: 'User', email: 'jsmith@e ...
随机推荐
- bootstrap : 解决使图片全屏显示有空白边距的问题
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8 ...
- [转帖]grafana 连接 influxdb 1.x 和 2.x
文章目录 一.安装 influxdb Ⅰ.docker 安装 二.常用操作 Ⅰ.influxdb 1.x版本添加用户认证 Ⅱ.influxdb 2.x 使用命令行 Ⅲ.CLI 配置token Ⅴ.CL ...
- [转帖]2.20 Native Operating System Tools
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr020.html#BABBHHIE 2.20 ...
- 使用linux上面powershell安装vm powercli 连接vcenter 通过计划任务自动创建部分虚拟机的快照以及自动清理过期快照的办法
经过一晚上的折腾, 终于验证出来一个非常简单的方法. 也比较好理解和使用. 这里简单记录一下: 使用linux上面powershell安装vm powercli 连接vcenter 通过计划任务自动创 ...
- Oracle12c 快速启动命令设置
Oracle12c 安装完成之后 一般不会自动启动需要进行一下简单的设置才可以. 方法也比较简单. 可以使用 oracle 自带的 dbstart的命令执行服务启动 需要注意的事项是: 第一修改一个参 ...
- Charles的基本使用
今天介绍Charles常用的几个功能 一.map local 1.map local是测试中mock数据常用的功能,首先我们选择需要mock数据的接口,这里以百度为例 抓包抓住该接口后鼠标右击选择ma ...
- 当你对 redis 说你中意的女孩是 Mia
作者:京东科技 周新智 一.Redis 众所周知,Redis = Remote Dictionary Server,即远程字典服务. 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久 ...
- vue中keep-alive详细讲解
场景 今天产品跑过来跟我说, 当我在A页面修改数据后,去B页面. 然后返回A页面.希望A页面保留我修改后的数据. 而不是数据又恢复最初的样子了.我心里想,尼玛,又要加班了? 看下面小粒子 数据被被重置 ...
- 开源项目03---YiShaAdmin
项目名称:YiShaAdmin 项目所用技术栈: web mvc bootstrap3 jquery aspnetcore等 项目简介: YiShaAdmin 基于.NET Core Web开发,借鉴 ...
- 从零开始配置 vim(11)——插件管理
之前我们介绍了基础配置部分和快捷键配置部分.如果你配置了这两个部分,vim已经算是比较好用了.但是作为代码编辑器来讲还是显的比较简陋,用这些配置来完成日常的编码任务会显得力不从心.vim比较强大的一点 ...