本帖最后由 dql2016 于 2024-2-25 19:51 编辑
本期指定任务说明:活动参与者需要搭配必购板子W5500-EVB-Pico,完成下方任务(全部为必做任务)。
入门任务:开发环境搭建,BLINK,驱动液晶显示器进行显示(没有则串口HelloWorld)
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
前几期使用过CircuitPython,感觉非常不错,CircuitPython也支持板卡W5500-EVB-Pico,因此首先安装CircuitPython环境,下载地址https://circuitpython.org/board/wiznet_w5500_evb_pico/
最后按住BOOTSEL键然后按下RUN键,板子就进入烧写模式了,将下载的uf2文件拖到磁盘就行了。
然后是CircuitPython常用驱动库的下载:
将lib目录全部复制到CIRCUITPY磁盘就行了。
夏普显示屏和板子接线如下:
GP15---DI
GP14---CLK
GP13---CS
添加测试代码:
-
- import time
- import board
- import busio
- import digitalio
- import adafruit_sharpmemorydisplay
- import os
- -------------------------------------------------------------------------
- led = digitalio.DigitalInOut(board.GP25)
- led.direction = digitalio.Direction.OUTPUT
-
-
- spi = busio.SPI(board.GP14, MOSI=board.GP15)
- scs = digitalio.DigitalInOut(board.GP13)
- display = adafruit_sharpmemorydisplay.SharpMemoryDisplay(spi, scs, 144, 168)
-
- cnt=0
- while True:
- display.fill(1)
- display.text("2024 " + str(cnt),0,10,0)
- cnt=cnt+1
- display.text("hello eeworld",10,20,0)
- display.show()
- led.value = not led.value
- time.sleep(0.5)
-
-
-
效果:
基础任务一:完成主控板W5500初始化(静态IP配置),并能使用局域网电脑ping通,同时W5500可以ping通互联网站点;通过抓包软件(Wireshark、Sniffer等)抓取本地PC的ping报文,展示并分析。
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
使用库很容易完成主控板W5500初始化(静态IP配置):
测试代码:
-
-
- import time
- import board
- import busio
- import digitalio
- import os
- import adafruit_sharpmemorydisplay
- from adafruit_wiznet5k.adafruit_wiznet5k import WIZNET5K
- import adafruit_wiznet5k.adafruit_wiznet5k_socket as socket
-
- W5x00_RSTn = board.GP20
- ethernetRst = digitalio.DigitalInOut(W5x00_RSTn)
- ethernetRst.direction = digitalio.Direction.OUTPUT
-
- cs = digitalio.DigitalInOut(board.GP17)
- spi_bus = busio.SPI(board.GP18, MOSI=board.GP19, MISO=board.GP16)
-
- ethernetRst.value = False
- time.sleep(1)
- ethernetRst.value = True
-
-
- IP_ADDRESS = (192, 168, 1, 189)
- SUBNET_MASK = (255, 255, 255, 0)
- GATEWAY_ADDRESS = (192, 168, 1, 1)
- DNS_SERVER = (8, 8, 8, 8)
-
-
- eth = WIZNET5K(spi_bus, cs, is_dhcp=False)
-
-
- eth.ifconfig = (IP_ADDRESS, SUBNET_MASK, GATEWAY_ADDRESS, DNS_SERVER)
-
- print("Chip Version:", eth.chip)
- print("MAC Address:", [hex(i) for i in eth.mac_address])
- print("My IP address is:", eth.pretty_ip(eth.ip_address))
- print("link_status is:", eth.link_status)
- print("pretty_mac is:", eth.pretty_mac(eth.mac_address))
-
- led = digitalio.DigitalInOut(board.GP25)
- led.direction = digitalio.Direction.OUTPUT
-
- spi = busio.SPI(board.GP14, MOSI=board.GP15)
- scs = digitalio.DigitalInOut(board.GP13)
- display = adafruit_sharpmemorydisplay.SharpMemoryDisplay(spi, scs, 144, 168)
-
- display.fill(1)
- display.text(str(eth.chip), 0, 0, 0)
- display.text(str(eth.pretty_mac(eth.mac_address)), 0, 10, 0)
- display.text(str(eth.link_status), 0, 20, 0)
- display.show()
-
- while True:
- led.value = not led.value
- time.sleep(0.5)
-
-
-
效果:
使用局域网电脑ping通:
同时W5500可以ping通互联网站点;通过抓包软件(Wireshark、Sniffer等)抓取本地PC的ping报文,展示并分析。
用管理员权限打开WireShark,然后在终端ping板子,就可以抓取到报文。
ping 数据包分为request数据包和reply数据包,ICMP应用层是直接使用的icmp封包格式,如下图所示。可以看到整个数据包为40个字节。
icmp数据包的结构如下
类型 代码 校验和
类型占据一个字节,标识ICMP报文的类型。ICMP报文类型可以分为两大类,分别是取值在1~127之间的差错报文,另一类是取值大于128的信息报文
代码占据一个字节,与类型字段一起共同标识ICMP报文的详细类型
校验和是将整个ICMP数据包(包括数据部分)以16位为一个单位采用CRC校验,然后按位取反后的值
可以看到圈中的数据分别是:目的地址的mac地址,源地址的mac地址
基础任务二:主控板建立TCPIP或UDP服务器,局域网PC使用TCPIP或UDP客户端进行连接并发送数据,主控板接收到数据后,送液晶屏显示(没有则通过串口打印显示);通过抓包软件抓取交互报文,展示并分析。(TCP和UDP二选一,或者全都操作)
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
参考官方例子建立TCP服务器
测试代码:
- import board
- import busio
- import digitalio
- import time
- import displayio
- from adafruit_wiznet5k.adafruit_wiznet5k import *
- import adafruit_wiznet5k.adafruit_wiznet5k_socket as socket
- import adafruit_sharpmemorydisplay
-
-
- spi = busio.SPI(board.GP14, MOSI=board.GP15)
- scs = digitalio.DigitalInOut(board.GP13)
- display = adafruit_sharpmemorydisplay.SharpMemoryDisplay(spi, scs, 144, 168)
-
- W5x00_RSTn = board.GP20
-
- print("W5500-EVB-Pico TCP Server Test")
-
- led = digitalio.DigitalInOut(board.GP25)
- led.direction = digitalio.Direction.OUTPUT
-
- ethernetRst = digitalio.DigitalInOut(W5x00_RSTn)
- ethernetRst.direction = digitalio.Direction.OUTPUT
-
- cs = digitalio.DigitalInOut(board.GP17)
- spi_bus = busio.SPI(board.GP18, MOSI=board.GP19, MISO=board.GP16)
-
- ethernetRst.value = False
- time.sleep(1)
- ethernetRst.value = True
-
- eth = WIZNET5K(spi_bus, cs, is_dhcp=True)
-
- print("Chip Version:", eth.chip)
- print("MAC Address:", [hex(i) for i in eth.mac_address])
- print("My IP address is:", eth.pretty_ip(eth.ip_address))
-
- display.fill(1)
- display.text(str(eth.chip), 0, 0, 0)
- display.text(str(eth.pretty_mac(eth.mac_address)), 0, 10, 0)
- display.text(str(eth.pretty_ip(eth.ip_address)), 0, 20, 0)
- display.show()
-
-
- socket.set_interface(eth)
- server = socket.socket()
- server_ip = None
- server_port = 50007
- server.bind((server_ip, server_port))
- server.listen()
-
- conn = None
- line=40
- while True:
- if conn is None:
- conn, addr = server.accept()
- print("socket connected")
- print(conn, addr)
- else :
- if conn._status in (
- SNSR_SOCK_FIN_WAIT,
- ):
- print("socket SNSR_SOCK_FIN_WAIT")
- conn.close()
- conn = None
- elif conn._status in (
- SNSR_SOCK_CLOSE_WAIT,
- ):
- print("socket SNSR_SOCK_CLOSE_WAIT")
- conn._disconnect()
- conn.close()
- conn = None
- else :
- avail = conn._available()
- if avail:
- data = conn._embed_recv(1024)
- if data:
- print("rx len:", len(data))
- print(data)
- display.text(str(data), 0, line, 0)
- line+=10
- if line>=150:
- line=40
- display.show()
- conn.send(data)
效果:
液晶显示:
报文:
进阶任务:从NTP服务器(注意数据交互格式的解析)同步时间,获取时间送显示屏(串口)显示。
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
下载ntp库 ,将adafruit_ntp.py文件放到CIRCUITPY磁盘lib目录中。
测试代码:
- import board
- import busio
- import digitalio
- import time
- import array
- import struct
- import adafruit_requests as requests
- from adafruit_wiznet5k.adafruit_wiznet5k import *
- import adafruit_wiznet5k.adafruit_wiznet5k_socket as socket
- import adafruit_wiznet5k.adafruit_wiznet5k_dns as dns
- import adafruit_ntp
- import adafruit_sharpmemorydisplay
- import displayio
-
- spi = busio.SPI(board.GP14, MOSI=board.GP15)
- scs = digitalio.DigitalInOut(board.GP13)
- display = adafruit_sharpmemorydisplay.SharpMemoryDisplay(spi, scs, 144, 168)
-
- W5x00_RSTn = board.GP20
-
- print("W5500-EVB-Pico NTP Client Test")
-
- port = 5000
- ntp_server_port= 123
-
- led = digitalio.DigitalInOut(board.GP25)
- led.direction = digitalio.Direction.OUTPUT
-
- ethernetRst = digitalio.DigitalInOut(W5x00_RSTn)
- ethernetRst.direction = digitalio.Direction.OUTPUT
-
- cs = digitalio.DigitalInOut(board.GP17)
- spi_bus = busio.SPI(board.GP18, MOSI=board.GP19, MISO=board.GP16)
-
-
- ethernetRst.value = False
- time.sleep(1)
- ethernetRst.value = True
-
- eth = WIZNET5K(spi_bus, cs, is_dhcp=True)
- print("Chip Version:", eth.chip)
- print("MAC Address:", [hex(i) for i in eth.mac_address])
- print("My IP address is:", eth.pretty_ip(eth.ip_address))
-
- display.fill(1)
- display.text(str(eth.chip), 0, 0, 0)
- display.text(str(eth.pretty_mac(eth.mac_address)), 0, 10, 0)
- display.text(str(eth.pretty_ip(eth.ip_address)), 0, 20, 0)
- display.show()
-
-
- socket.set_interface(eth)
- while True:
- ntp = adafruit_ntp.NTP(socket)
- t=ntp.datetime
- year=t[0]
- mon=t[1]
- day=t[2]
- hour=t[3]
- minute=t[4]
- sec=t[5]
- print(t)
- display.fill(1)
- display.text(str(year)+'-'+str(mon)+'-'+str(day)+' '+str(hour+8)+':'+str(minute)+':'+str(sec), 0, 40, 0)
- display.show()
- time.sleep(1)
-
-
-
效果:
屏幕显示
终极任务(二选一)
■ 终极任务一:访问 https://www.digikey.cn/zh/resources/api-solutions,以了解得捷(DigiKey)数字化解决方案及其API操作,设计一款DigiKey电子元器件价格及库存监视器,能实时同步并显示指定,电子元器件的价格、库存等信息。
■ 终极任务二:使用外部存储器,组建简易FTP文件服务器,并能正常上传下载文件。
搭配器件: W5500-EVB-Pico、 Adafruit Sharp Memory Display Breakout
通过查阅资料发现用CircuitPython实现ftp服务比较复杂,好在wiznet官方提供了C SDK版本的ftp服务示例,参考
示例程序使用起来需要先进行配置芯片型号,如下:
这里是ftp用户账号和密码:
开启usb虚拟串口:
生成uf2文件:
正常上传、下载文件:
补充内容 (2024-3-3 20:31):
//内容三:可编译下载的代码//
将源代码上传到EEWORLD论坛下载中心
https://download.eeworld.com.cn/detail/dql2016/631388
补充内容 (2024-3-3 22:15):
//内容一:3-5分钟短视频(视频需要有声音介绍或讲解)//
请将视频上传到EE大学堂https://training.eeworld.com.cn/course/68453
|