网站开发例子永嘉规划建设局网站

web/2025/9/26 2:59:14/文章来源:
网站开发例子,永嘉规划建设局网站,建模素材免费网站,装修平面设计软件以太网通讯是一种被广泛使用的数据通讯方式。在嵌入式应用中也经常使用#xff0c;但协议栈的实现并不是一件容易的事。不过有些以太网控制器就带有协议栈#xff0c;如W5500。在本篇中我们将讨论如何设计并实现W5500以太网控制器的驱动。 1、功能概述 W5500是WIZnet开发的…以太网通讯是一种被广泛使用的数据通讯方式。在嵌入式应用中也经常使用但协议栈的实现并不是一件容易的事。不过有些以太网控制器就带有协议栈如W5500。在本篇中我们将讨论如何设计并实现W5500以太网控制器的驱动。 1、功能概述 W5500是WIZnet开发的单芯片全硬件TCP/IP协议栈能够方便的实现网络连接应用。 1.1、硬件描述 W5500作为一款全硬件TCP/IP嵌入式以太网控制器为嵌入式系统提供了更加简易的互联网连接方案。W5500 集成了 TCP/IP 协议栈10/100M 以太网数据链路层MAC及物理层PHY使得用户使用单芯片就能够在他们的应用中拓展网络连接。 其引脚排布及分装如下 W5500全硬件 TCP/IP 协议栈支持 TCPUDPIPv4ICMPARPIGMP 以及 PPPoE 协议。W5500 内嵌 32K 字节片上缓存以供以太网包处理。使用W5500只需要一些简单的Socket 编程就能实现以太网应用。用户可以同时使用8个硬件Socket 独立通讯。 W5500提供了SPI外设串行接口从而能够更加容易与外设MCU整合。而且W5500的使用了新的高效SPI协议支持80MHz速率从而能够更好的实现高速网络通讯。为了减少系统能耗W5500提供了网络唤醒模式WOL及掉电模式供客户选择使用。 1.2、通讯接口 W5500提供了SPI串行外部接口作为外设主机接口有SCSnSCLKMOSI MISO共4路信号且作为SPI从机工作。W5500与MCU的连接方式如下图所示。根据SCSn是否受主机控制将其工作模式分为可变数据长度模式和固定数据长度模式。在可变数据长度模式中W5500可以与其他SPI设备共用SPI接口。在固定数据长度模式SPI将指定给W5500不能与其他SPI设备共享。 SPI协议定义了四种工作模式模式 0123。每种模式的区别是根据SCLK的极性及相位不同定义的。SPI 的模式 0 和模式 3 唯一不同的就是在非活动状态下SCLK 信号的极性。SPI的模式0和3数据都是在SCLK的上升沿锁存在下降沿输出。W5500支持SPI模式0及模式3。MOSI和MISO信号无论是接收或发送均遵从从最高标志位MSB到最低标志位LSB的传输序列。 1.3、内部寄存器 W5500的SPI数据帧包括了16位地址段的偏移地址8位控制段和N字节数据段。如图下图所示 地址段为W5500的寄存器或TX/RX缓存区指定了16位的偏移地址。 这16 位偏移地址的值来自从最高标志位到最低标志位的顺序传输。 控制段指定了地址段设定的偏移区域归属读/写访问模式及SPI工作模式。8位控制段可以通过修改区域选择位BSB[4:0]读/写访问模式位RWB以及SPI工作模式位OM[1:0]来重新定义。区域选择位选择了归属于偏移地址的区域。 SPI数据帧的数据段通过偏移地址自增每传输1字节偏移地址加1支持连续数据读/写。 W5500有1个通用寄存器8个Socket寄存器区以及对应每个Socket的收发缓存区。每个区域均通过SPI数据帧的区域选择位BSB[4:0]来选取。每一个Socket的发送缓存区都在一个16KB的物理发送内存中初始化分配为2KB。每一个Socket的接收缓存区都在一个16KB 的物理接收内存中初始化分配为 2KB。无论给每个Socket 分配多大的收/发缓存都必须在 16 位的偏移地址范围内从 0x0000 到 0xFFFF。 通用寄存器区配置了W5500的IP地址、MAC地址等基本信息。该区域可以通过SPI数据帧的区域选择位(BSB[4:0])选定。 W5500支持8个Socket作为通讯信道。每一个Socket通过Socket n寄存器区控制0≤n≤7。Socket n寄存器可以通过SPI数据帧中的区域选择寄存器(BSB[4:0])来选定对应的寄存器n。 2、驱动设计与实现 我们已经对W5500以太网控制器的引脚封装、接口方式、协议栈的操作流程以及基本操作库有了比较详细的了解。接下来我们将设计并实现W5500以太网控制器的驱动程序。 2.1、对象定义 在使用一个对象之前我们需要获得一个对象。同样的我们想要W5500以太网控制器就需要先定义W5500以太网控制器的对象。 2.1.1、对象的抽象 我们要得到W5500以太网控制器对象需要先分析其基本特性。一般来说一个对象至少包含两方面的特性属性与操作。接下来我们就来从这两个方面思考一下W5500以太网控制器的对象。 先来考虑属性作为属性肯定是用于标识或记录对象特征的东西。我们来考虑W5500以太网控制器对象属性。作为以太网控制器W5500对象显然需要有网络配置参数作为它的属性包括IP地址和MAC地址等。所以我们将网络参数定义为对象的属性。在这里我们以结构体的方式来定义网络参数。 接着我们还需要考虑W5500以太网控制器对象的操作问题。其实我们对W5500的操作就是对SPI接口的操作这里我们因为使用了厂家的基础库所以以函数注册回调函数的方式传递了操作函数。我们不需要再将对SPI端口作为对象的操作而是将他们以函数指针的方式在初始化函数中传入。那么我们对对象的操作就是读取和写入信息的操作而具体的数据处理总是依赖于具体应用所以我们将其作为对象的操作。 根据上述我们对W5500以太网控制器的分析我们可以定义W5500以太网控制器的对象类型如下 /* 定义W5500对象类型 */ typedef struct W5500Object {wiz_NetInfo gWIZNETINFO;uint16_t (*DataParsing)(uint8_t *rxBuffer,uint16_t rxSize,uint8_t *txBuffer);//接收消息解析及返回消息生成返回值为返回消息的字节长度uint16_t (*RequestData)(uint8_t *rqBuffer);   //得到请求命令一般用于客户端发起访问 }W5500ObjectType; 2.1.2、对象初始化 我们知道一个对象仅作声明是不能使用的我们需要先对其进行初始化所以这里我们来考虑W5500以太网控制器对象的初始化函数。一般来说初始化函数需要处理几个方面的问题。一是检查输入参数是否合理二是为对象的属性赋初值三是对对象作必要的初始化配置。据此我们设计W5500以太网控制器对象的初始化函数如下 /*W5500对象初始化*/ void W5500Initialization(W5500ObjectType *w5500,uint8_t mac[6],        //本地Mac地址uint8_t ip[4],         //本地IP地址uint8_t sn[4],         //子网掩码uint8_t gw[4],         //网关地址uint8_t dns[4],        //DNS服务器地址dhcp_mode dhcp,        //DHCP类型W5500CSCrisType cris_en,W5500CSCrisType cris_ex,W5500CSCrisType cs_sel,W5500CSCrisType cs_desel,W5500SPIReadByteTYpe spi_rb,W5500SPIWriteByteTYpe spi_wb,W5500DataParsingType dataParse,W5500RequestDataType requst) {if((w5500NULL)||(cris_enNULL)||(cris_exNULL)||(cs_selNULL)||(cs_deselNULL)||(spi_rbNULL)||(spi_wbNULL)){return;}for(int i0;i6;i){w5500-gWIZNETINFO.mac[i]mac[i];}for(int i0;i4;i){w5500-gWIZNETINFO.ip[i]ip[i];w5500-gWIZNETINFO.sn[i]sn[i];w5500-gWIZNETINFO.gw[i]gw[i];w5500-gWIZNETINFO.dns[i]dns[i];}w5500-gWIZNETINFO.dhcpdhcp;/*注册TCP通讯相关的回调函数*/RegisterFunction(cris_en,cris_ex,cs_sel,cs_desel,spi_rb,spi_wb);/*初始化芯片参数*/ChipParametersConfiguration();/*初始化网络通讯参数*/NetworkParameterConfiguration(w5500-gWIZNETINFO);if(dataParse!NULL){w5500-DataParsingdataParse;}else{w5500-DataParsingLoopBackDataHandle;}if(requst!NULL){w5500-RequestDatarequst;}else{w5500-RequestDataDefaultRequest;} } 2.2、对象操作 我们已经完成了W5500以太网控制器对象类型的定义和对象初始化函数的设计。但我们的主要目标是获取对象的信息接下来我们还要实现面向W5500以太网控制器的各类操作。 W5500以太网控制器有哪些操作呢作为通讯接口最主要的就是数据的发送于接收。这些函数我们当然可以实现它不过在厂商提供的基础库中已经提供了这些函数我们直接实用就好了这里就不再列出了。 3、驱动的使用 我们已经设计了W5500以太网控制器的驱动接下来我们设计一个简单的应用验证这一驱动。 3.1、声明并初始化对象 使用基于对象的操作我们需要先得到这个对象所以我们先要使用前面定义的W5500以太网控制器对象类型声明一个W5500以太网控制器对象变量具体操作格式如下 W5500ObjectType w5500; 声明了这个对象变量并不能立即使用我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下 W5500ObjectType *w5500, uint8_t mac[6],        //本地Mac地址 uint8_t ip[4],         //本地IP地址 uint8_t sn[4],         //子网掩码 uint8_t gw[4],         //网关地址 uint8_t dns[4],        //DNS服务器地址 dhcp_mode dhcp,        //DHCP类型 W5500CSCrisType cris_en, W5500CSCrisType cris_ex, W5500CSCrisType cs_sel, W5500CSCrisType cs_desel, W5500SPIReadByteTYpe spi_rb, W5500SPIWriteByteTYpe spi_wb, W5500DataParsingType dataParse, W5500RequestDataType requst 对于这些参数对象变量我们已经定义了。而IP地址这些参数我们只需要睡着时输入就可以了。主要的是我们需要定义几个函数并将函数指针作为参数。这几个函数的类型如下 /*解析接收到的数据*/ typedef uint16_t (*W5500DataParsingType)(uint8_t *rxBuffer,uint16_t rxSize,uint8_t *txBuffer);/*得到请求命令一般用于客户端发起访问*/ typedef uint16_t (*W5500RequestDataType)(uint8_t *rqBuffer);  /*定义片选及临界区操作函数类型*/ typedef void (*W5500CSCrisType)(void);/*定义SPI读一个字节函数类型*/ typedef uint8_t (*W5500SPIReadByteTYpe)(void);/*定义SPI写一个字节函数类型*/ typedef void (*W5500SPIWriteByteTYpe)(uint8_t wb); 对于这几个函数我们根据样式定义就可以了具体的操作可能与使用的硬件平台有关系。片选操作函数用于多设备需要软件操作时如采用硬件片选可以传入NULL即可。具体函数定义如下 /*写1字节数据到SPI总线*/ static void SPI_WriteByte(uint8_t TxData) {HAL_SPI_Transmit(w5500hspi,TxData,1,1000); }/*从SPI总线读取1字节数据*/ static uint8_t SPI_ReadByte(void) {uint8_t rxData;HAL_SPI_Receive(w5500hspi,rxData,1,1000);return rxData;//返回接收的数据 }/*进入临界区*/ static void SPI_CrisEnter(void) {__set_PRIMASK(1); }/*退出临界区*/ static void SPI_CrisExit(void) {__set_PRIMASK(0); }/*片选信号输出低电平*/ static void SPI_CS_Select(void) {HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); }/*片选信号输出高电平*/ static void SPI_CS_Deselect(void) {HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); }/*数据回环处理*/ static uint16_t LoopBackDataHandle(uint8_t *rxBuffer,uint16_t rxSize,uint8_t *txBuffer) {uint16_t txSize 0;txSize(uint16_t)rxSize;for(int i0;itxSize;i){txBuffer[i]rxBuffer[i];}return txSize; }/*默认测试请求*/ static uint16_t DefaultRequest(uint8_t *rqBuffer) {uint16_t rSize0;char requstString[]This is a new client connection.\r\n;rSizestrlen(requstString);for(int i0;irSize;i){rqBuffer[i]requstString[i];}return rSize; } 对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下 /* W5500初始化配置 */ void W5500Configuration(void) {uint8_t mac[6] {0x01, 0x08, 0xdc,0x00, 0xab, 0xcd};        //本地Mac地址uint8_t ip[4] {192, 168, 1, 190};         //本地IP地址uint8_t sn[4] {255,255,255,0};         //子网掩码uint8_t gw[4] {192, 168, 1, 1};         //网关地址uint8_t dns[4] {0,0,0,0};        //DNS服务器地址W5500_SPI_Configuration();W5500Initialization(w5500,mac,ip,sn,gw,dns,NETINFO_STATIC,SPI_CrisEnter,SPI_CrisExit,SPI_CS_Select,SPI_CS_Deselect,SPI_ReadByte,SPI_WriteByte,NULL,NULL); } 3.2、基于对象进行操作 我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值接下来我们使用这一驱动开发我们的应用实例。我们实现以个TCP回环服务器。具体调用如下 W5500TCPServer(w5500,Socket0,502); TCP服务器设计如下 /*TCP服务器数据通讯*/ int32_t W5500TCPServer(W5500ObjectType *w5500,W5500SocketType sn,uint16_t lPort) {int32_t ret;switch(getSn_SR(sn)){case SOCK_ESTABLISHED:{if(getSn_IR(sn) Sn_IR_CON){setSn_IR(sn,Sn_IR_CON);}uint16_t size0;if((size getSn_RX_RSR(sn)) 0){if(size DATA_BUFFER_SIZE){size DATA_BUFFER_SIZE;}uint8_t rxBuffer[DATA_BUFFER_SIZE];ret recv(sn,rxBuffer,size);if(ret 0){return ret;}//添加数据解析及响应的函数uint8_t txBuffer[DATA_BUFFER_SIZE];uint16_t lengthw5500-DataParsing(rxBuffer,ret,txBuffer);uint16_t sentsize0;while(length ! sentsize){ret send(sn,txBuffersentsize,length-sentsize);if(ret 0){close(sn);return ret;}sentsize ret; // 不用管SOCKERR_BUSY, 因为它是零.}}break;}case SOCK_CLOSE_WAIT:{if((retdisconnect(sn)) ! SOCK_OK){return ret;}break;}case SOCK_INIT:{if( (ret listen(sn)) ! SOCK_OK){return ret;}break;}case SOCK_CLOSED:{if((retsocket(sn,Sn_MR_TCP,lPort,0x00)) ! sn){return ret;}break;}default:{break;}}return 1; } 4、应用总结 这一篇中我们设计并实现了W5500以太网控制器的驱动程序而且也设计了一个简单的应用来验证它。我们也在多个实际项目中使用W5500及驱动程序并在此基础上实现过如Modbus TCP等数据传输协议在实际使用中效果良好。 需要说明的是我们并没有从最底层开始实现驱动程序。当然我们完全可以同过操作寄存器实现最基础的驱动开发但在本篇中没有这么做是因为已有的驱动底层已经很完备了不需要重复劳动。另一方面我们希望再次基础上做更高层次的封装以便与使用驱动的人能够专注于具体的应用逻辑所以我们封装了如TCP服务器及TCP客户端等使用者则可以专注于应用协议本身。 本篇中只是验证了TCP服务器但在使用驱动时如果向实现如HTTP服务器只需要修改对象的DataParsing操作就可以了。 源码下载https://github.com/foxclever/ExPeriphDriver ​欢迎关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

襄阳住房和城乡建设网站亚马逊品牌网站要怎么做

MySQL 部分 1. 查看是否开启 binlog MySQL 8 默认开启 binlog。可以通过以下命令查看是否开启: SHOW VARIABLES LIKE log_bin;如果返回结果为 ON,则表示 binlog 已开启。 Variable_nameValuelog_binON 2. 若未开启 binlog,则需手动配置 …

网页建设网站代码网站备案ip查询网站查询

flask篇之URL重定向(二十三) 通过url_for()函数构造动态的URL: 我们在flask之中不仅仅是可以匹配静态的URL,还可以通过url_for()这个函数构造动态的URL from flask import Flask from flask import url_forapp Flask(__name__)app.route(/) def inde…

最好网站建设公司运营团队旺道网站排名优化

下班路上,一个武汉的朋友发我一份简历,问这个简历值多少。打开简历,九年工作经验,但只有两个项目经验,看着没啥亮点,建议他根据面试情况综合考虑。正好趁机分享一点自己的面试心得。1、编码能力这是做技术最…

discuz视频网站模板中企动力和东莞朝阳做的网站对比

这章讲到了可见性在逐像素渲染光照场景中的作用,也考虑如何使用可见性减少必须渲染的批次数量,从而改善性能。 假设一个非常简单的场景,一个房间,因为房间的不同部位是不同的材质,所以将其分为8个batch,另…

drupal网站建设数据库小米云网站开发

文章目录 一、设计模式概述1. 软件设计模式的产生背景2. 软件设计模式的概念3. 学习设计模式的必要性4. 设计模式分类(1)创建型模式(2)结构型模式(3)行为型模式 二、UML图1. 类图概述2. 类图作用3. 类图表示…

可以建设网站非常成功的网站

模拟场景: 当用户登录后,后台会返回一个token给前端,前端下次进入首页后,会先判断token是否过期,如果过期自动进入登录页面。配置路由: 1.安装 npm install vue-router42.安装后在src目录下创建router文…

优化网站费用ftp怎么做网站的备份

c 前缀 变量命名如果您是第一次查看Takes或Cactoos的源代码,很可能会像其他命名约定一样被命名约定触发,这意味着大多数类名都有两个字母的前缀: BkSafe , RqFake , RsWithStatus , TkGzip等。 老实说&…

网站建设资讯站做网站打电话话术

9 map Go 语言中提供的映射关系容器为 map ,其内部使用 散列表(hash) 实现。它是一种无序的基于 key-value 的数据结构。 Go 语言中的 map 是引用类型,必须初始化之后才能使用。 9.1 map 定义 Go 语言中 map 的定义语法为&…

龙岩做网站多少钱成都最好的设计公司

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 // 在看 Unsafe 类源码时看到一个注解:Deprecated,似曾相识... Deprecated 用在类或者方法上,表示…

车公庙网站建设wordpress主题 demo

一、引言 乳腺癌是女性中最常见的恶性肿瘤之一,也影响着全球范围内许多人们的健康。据世界卫生组织(WHO)的数据,乳腺癌是全球癌症发病率和死亡率最高的肿瘤之一,其对个体和社会的危害不可忽视。因此,早期乳…

企业网站建设应用研究论文在线制图

课程大纲被分成6个部分,每个部分又被分解为多个阶段, 而每个阶段包含了多个Try, Workshop, FactToFace, Apply. 这里只列出部分,和阶段:CHAPTER 0 : 预科[可选]Linux使用,常用CMD,服务配置,IDE&…

咸阳网站开发wordpress 文章页面怎样全屏显示

我是个幸运的人。虽然幸运不能被复制,但是眼光和努力可以。 关涛/关老板,80后的阿里P10,阿里巴巴通用计算平台负责人,阿里巴巴计算平台研究员。12年职场人生,微软和阿里的选择。 关涛的花名取自谐音:观涛。…

阳光梦网站建设好看的主页背景图片

nmap 扫描内网IP, 系统, 端口 扫描内网ip 对内网进行ARP扫描 .\nmap.exe -sn 192.168.110.0/24 # 全网段 .\nmap.exe -sn 192.168.110.100-200 # 100-200范围 扫描端口 .\nmap.exe -sT 192.168.110.130 # 三次握手连接 较慢, 但更有效 .\nmap.exe -sS 192.168.110.130 # 发…

吉林沈阳网站建设滨江道做网站公司

提供资料: php 基础 : https://www.runoob.com/php/php-tutorial.html php是什么? PHP 是服务器端脚本语言。 首先在学习PHP前需要对HTML 和CSS有一定的认识 PHP 能做什么? PHP 可以生成动态页面内容PHP 可以创建、打开、读取、写入、关…

建设部网站政策法规网站建设yuue

序列化与反序列化 序列化就是说内存中的某一个对象保存到硬盘当中,以二进制序列的形式存储下来,这就是一个序列化的过程。 而反序列化,就是将硬盘中存储的二进制的数,反序列化到内存当中,得到一个相应的对象&#xff…

门户网站是专一化好还是多元化好长春哪里做网站好

来源:今日头条11月27日,今日头条CEO朱文佳在36kr wise大会上谈及头条搜索。在他看来,要做好搜索,有三件事最重要。首先是技术,技术决定搜索的体验;其次是内容,内容是搜索的根本;最后…

如何用wordpress做网站建站模板行情

Atitit. 木马病毒的外部class自动加载机制------加载class的方法总结 Atitit.java load class methods 1. 动态加载jar文件和class文件。 1 2. 使用Class静态方法 Class.forName 1 2.1. 使用ClassLoader 1 2.2. 3. 直接new 2 3. Ref 2 1. 动态加载jar文件和class文件。 完成…

江南大学做网站做汽车价格的网站

支付宝简介 使用流程 支付宝开放平台 (alipay.com) 1、登录支付宝开放平台-创建应用 得到app_id 2、绑定应用:在产品绑定中,绑定支付宝的相关功能3、配置应用: 配置各种加密方式 4、提交审核:5、把支付宝整个功能整合项目 沙箱…

做电影网站会有什么惩罚网站建设会计分录怎么做

文章目录 前言键盘呼起问题靠近底部的输入项被键盘遮挡底部按钮被顶上去 全面屏适配图片大小显示问题解决300ms延迟首屏优化 前言 这篇文章总结了我在工作中做H5遇到的一些问题,包括我是怎么解决的。可能不是当下的最优解,但是能保证解决问题。 单位适…

金融贷款和网站建设哪个赚钱个人网站能 做淘客吗

Windows 系统 Solr 8.11.3 安装详细教程 说明什么是Solr下载与解压如何启动启动命令:浏览器中打开dashboard其他命令查看关闭命令 说明 本次只是简单安装,为了在项目中使用,如果在公开服务器中安装需要更改开放端口,配置权限等。 …