547|0

1249

帖子

69

TA的资源

纯净的硅(中级)

楼主
 

【得捷Follow me第4期】汇总贴 [复制链接]

  本帖最后由 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

添加测试代码:

  • # 入门任务:开发环境搭建,BLINK,驱动液晶显示器进行显示(没有则串口HelloWorld)
  • import time
  • import board
  • import busio
  • import digitalio
  • import adafruit_sharpmemorydisplay
  • import os
  • -------------------------------------------------------------------------
  • led = digitalio.DigitalInOut(board.GP25)
  • led.direction = digitalio.Direction.OUTPUT
  • #GP15-DI GP14-CLK GP13-CS
  • 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) # fill entire screen with colour=1
  • display.text("2024 " + str(cnt),0,10,0) #draw some text at x=0, y=10, colour=0
  • cnt=cnt+1
  • display.text("hello eeworld",10,20,0) #draw some text at x=10, y=20, colour=0
  • display.show() # write the contents of the FrameBuffer to display memory
  • 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配置):

测试代码:

  • # 基础任务一:完成主控板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
  • # Setup your network configuration below
  • IP_ADDRESS = (192, 168, 1, 189)
  • SUBNET_MASK = (255, 255, 255, 0)
  • GATEWAY_ADDRESS = (192, 168, 1, 1)
  • DNS_SERVER = (8, 8, 8, 8)
  • # Initialize ethernet interface without DHCP
  • eth = WIZNET5K(spi_bus, cs, is_dhcp=False)
  • # Set network configuration
  • 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()
  • # Initialize a socket for our server
  • socket.set_interface(eth)
  • server = socket.socket() # Allocate socket for the server
  • server_ip = None # IP address of server
  • server_port = 50007 # Port to listen on
  • server.bind((server_ip, server_port)) # Bind to IP and Port
  • server.listen() # Begin listening for incoming clients
  • conn = None
  • line=40
  • while True:
  • if conn is None:
  • conn, addr = server.accept() # Wait for a connection from a client.
  • 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) # Echo message back to client

效果:

液晶显示:

报文:

进阶任务:从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)
  • # Reset W5500 first
  • 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()
  • # Initialize a socket for our server
  • 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
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条
报名最后3天:ADI 超低功耗 MCU MAX326xx 系列介绍
直播时间:3月20日(本周四) 上午10:00
活动奖励:双肩包、充电宝、小夜灯

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 9

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表