|
因起:rp2040早两年就面世了,并且在不同的开发平台都有对其的支持,本身也是一款性能比较强劲的芯片,这次W5500-EVB-Pico在官方pico基础上增加了W5500这颗 集成全硬件TCPIP协议栈网络芯片,是一个学习通过嵌入式平台接入以太网的,以及各种网络协议栈学习的绝好机会。
**在每个帖子中,均有安装过程,代码和最后运行的结果(静态图片和动画的形式展现),硬件相对简单,没有录制视频,后边有时间再补充。
发帖地址汇总:
入门任务: 第一帖:【得捷Follow me第4期】W5500-EVB-Pico arduino离线HFS方式搭建第三方库开发环境 帖子中有完整的离线安装过程、库文件链接和github加速下载...
第二帖:【得捷Follow me第4期】W5500-EVB-Pico platform io方式开发环境踩坑记录
基础任务一:第三帖: 【得捷Follow me第4期】W5500-EVB-Pico platform IO下使用Ethernet3库设置静态IP
基础任务二:第四帖: 【得捷Follow me第4期】W5500-EVB-Pico PIO UDP收发测试
第五帖: 【得捷Follow me第4期】W5500-EVB-Pico PIO下TCP协议实现Webclient和WebServer
进阶任务: 第六帖: 【得捷Follow me第4期】W5500-EVB-Pico PIO通过NTP服务器获取网络时间
终极任务二:第七帖:【得捷Follow me第4期】W5500-EVB-Pico PIO 挂载SD卡并实现文件读写访问
第八帖: 未完待续......
入门任务:开发环境搭建,BLINK,驱动液晶显示器进行显示(没有则串口HelloWorld)
① arduino
第一个任务主要是开发环境搭建,这里没有使用其他小伙伴使用的***Python环境,而是使用了Arduino环境和vscode + platformIO环境,原因,第一平时用python不多,第二主要是借助本次测试正好进一步了解一下vscode + platformIO环境下的开发板添加、各种库的使用方法、以及开发环境中的各种配置。
任务一分两步进行,首先在Arduino环境中进行了rp2040 pico开发环境的安装,因为中rp2040仅支持arduino环境。 所以想着先通过Arduino中搭建开发环境并测试开发板,以验证rp2040底层,跑通“helloworld”第一步,这样,方便在vscode + platformIO中万一遇到各种问题,好排查问题所在。
过程比较曲折,开始尝试通过在线安装,两次没成功。
后来网上搜索,使用离线方式安装,同时发现了一个非官方的库,大佬就是大佬(感谢开源路上各个无私奉献的大佬们!!!),arduino官方中的库应该也是来自于这位大佬,不过更新/同步不及时。于是乎使用HFS离线方式在arduino搭建了rp2040 pico 的库以及工具链等,中vscode + platformIO间过程也还好,不算太绕。
arduino库提供了丰富的示例库,无论是通用的arduino开发板,还是rp2040 pico 。但是弊端是没有编程过程中的代码提示功能和调试功能。(后来发现在visualStudio中已经有支持arduino工程的插件),于是,打算通过测评,测试另一目标比较流行的开发方式:vscode + platformIO。
结论:通过例程BLINK,arduino的库,是最快入门嵌入式学习的途径,不要太好用。
② vscode + platformIO
首先是vscode + platformIO的安装。
安装完成后,便可以通过添加新工程的方式,让platformIO自动将rp2040 pico的库和工具链添加到系统环境。
这一步在线安装比在arduino中快很多,一次成功。
如果某硬件arduino和platformIO中是同步的,那么arduino中的例程是可以直接拷贝过来使用的,仅需要在mian.cpp中增加“#include <arduino.h>”,添加对arduino.h的应用即可。也就是platformIO可以借鉴arduino丰富的生态,并且绝大多数arduino的库都有使用例程。
platformIO也提供了在线搜索library的功能,并且查询到的库,可以通过链接打开库的网址。并且,如果直接使用这些库,不需要修改的话,仅需在PIO HOME中查询库,打开库之后单击 即可。
下图演示过程:
下载的库文件也会添加到lib文件夹下:
另一种添加第三方库的方式是,手动查找对应的库,下载后,将库手动拷贝至工程目录下对应的lib文件夹内即可。platformIO中提供ldf功能,会自动搜索lib文件下下的源文件,在编译时进行编译。
这里遇到的一个坑是,rp2040 pico通过usb下载一键下载程序使用驱动问题,在帖子中也有详细说明。这一步,在arduino中工具菜单下通过一些选项配置即可完成,没有遇到问题。
结论:过程有一些曲折,但是代码编辑自动提示、可以直接借鉴arduino生态,还是有新引力的(另外,platformIO对esp32、esp8266、stm32多个系列均有支持)。
基础任务一:完成主控板W5500初始化(静态IP配置),并能使用局域网电脑ping通,同时W5500可以ping通互联网站点;通过抓包软件(Wireshark、Sniffer等)抓取本地PC的ping报文,展示并分析。
因为此前对platformIO的不熟悉,因此,在本任务中,主要首先网络搜索,发现有Ethernet3库,这个库比较新,并且提供了对W5500的支持。
后来发现,pico库中自带Ethernet库,不过不支持CS引脚和RST引脚,需要在此基础上进行二次修改,同时Ethernet是否原生支持W5500,也是个问题。
因为,在后边的UDP和TCP/IP中都需要以本任务做基础,另,当时写本任务和后面基础任务二、进阶任务时,当时pico不在身边,没法测试。所以,本任务无最终测试,但是通过基础任务二、进阶任务,可知,使用Ethernet3可以完成本任务基本要求。
同时,在计算机端ping PICO的ip地址,可以返回数据(在其他任务中测试)。
结论:Ethernet3“是”pico原生Ethernet库的扩展,提供了CS引脚和RST引脚以及对应的io操作函数,以进行片选和硬件复位,同时通了udp、tcp/ip等协议栈的接口操作。
基础任务二:主控板建立TCPIP或UDP服务器,局域网PC使用TCPIP或UDP客户端进行连接并发送数据,主控板接收到数据后,送液晶屏显示(没有则通过串口打印显示);通过抓包软件抓取交互报文,展示并分析。(TCP和UDP二选一,或者全都操作)
① Udp协议收发测试
这里使用了ETHERNET3库中的示例代码,pico建立udp服务端,pc端使用net assist软件模拟udp客户端,进行数据收发。
PC端:
pico端(下图开始时有一段时间静止(在操作pc端)):
② TCP/IP协议 Webclient的实现
依然使用Ethernet3库,使用其web client例程
首先创建web client客户端,然后向服务端发起连接请求,当接收到数据后,打印接收数据。
结论:成功建立web client ,访问baidu.com,并成功返回连接请求数据。
③ TCP/IP协议 Web server 的实现
这里继续使用Ethernet3库,使用pico创建web 服务器,在pc端,使用net assist软件,建立web 客户端。客户端发送数据给pico,pico进行应答。
pico 服务端:
pc 客户端:
结论:作为web server可以成功接收客户端发送的请求数据,(写总结时)发现,pico作为服务端没有成功返回给客户端数据,这个后边查卡壳原因。
进阶任务:从NTP服务器(注意数据交互格式的解析)同步时间,获取时间送显示屏(串口)显示。
从NTP服务器获取网络时间,还是在UDP协议上的一个延伸,只要udp协议可以正常收发数据。
接下来就是按照NTP要求向NTP服务器发送请求数据报文即可获取时间数据,接下来就是对返回时间戳进行计算,根据需要计算得到不同格式的时间数据。
在例子中分别得到了1900年起到现在的秒数、1970年起到现在的秒数、和当前的日期和时间。
结论:在rp2040 pico中通过w5500可以方便实现有线连接获取网络时间,从而实现本地校时功能。
终极任务二:使用外部存储器,组建简易FTP文件服务器,并能正常上传下载文件。
这一步需要将之前的Ethernet功能基础上增加ftp服务,同时需要在原来硬件基础上,扩展SD卡。需要使用多个库才能实现最终功能。
① 首先实现pico 硬件SPI1 挂载SD卡
这里使用了RP2040_SD 库,同时在RP2040_SD 库的基础上进行了部分修改(RP2040_SD 库,以及 pico的库文件),使得支持硬件SPI1访问SD卡(原生仅支持SPI0)。原贴中有详细的修改步骤。
运行结果:
硬件连接:
未实现部分:
最后一个任务需要使用Ethernet库、FTP server库和SD库,因为原生pico库中没有很好的提供硬件支持(或者没找到),在实现以上任务中使用到的库文件在最后一个任务中,出现了不兼容的情况,因此FTP server和SD库,总有部分编译时出现各种重定义、错误等警告。
业余时间又断断续续折腾了一周,还是不见效果,但是折腾的过程也逐渐学习了各种库的实现、platformio库文件管理、不通库如何相互协作(引用)、C++语法等相关知识内容。
同时在折腾中,也发现了一些非常好的库文件,后边有时间再继续折腾。