W5300驱动说明

        W5300是一款带有硬件协议栈的网络芯片,内部拥有128K的缓存,最大支持8路socket通信,与MCU之间通过16位数据总线通信,通信速度远超W5500之类以SPI作为通信接口的网络芯片,特别适合对高速网络传输有需求的应用。

        本次使用STM32F205ZET6作为主控MCU,通过FSMC接口与W5300连接,主机在完成配置后,就可以像访问SRAM一样轻松操作W5300。以下为W5300引脚介绍及参考电路

        除FSMC接口外,还需要额外的芯片复位脚和中断脚。芯片上电复位不太可靠,因此一般需要通过操作复位引脚来进行可靠复位,这个特性在W5500上也有,需要注意。中断脚的话不是必须的,也可以通过查询方式来获取中断信息,但这里我们还是使用了。

        除此以外,硬件上还有一些配置,可以对照上面的电路图

        硬件连接没有问题后就开始软件编程了,首先是初始化。初始化这部分分两块,一个是对于FSMC的引脚初始化,另一部分是对于芯片的初始化。

        FSMC初始化(在这里不包括复位和中断脚的初始化,这两个脚可以使用普通IO,而FSMC的引脚是固定的),根据接线不同,FSMC_NORSRAMInitStructure.FSMC_Bank和FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth参数也不同,具体的可以查看STM32的手册。

void Config_FSMC(void)
{GPIO_InitTypeDef GPIO_InitStructure;FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef  p;FSMC_NORSRAMDeInit(FSMC_Bank1_NORSRAM1);/* AHB3 Peripheral Clock configuration -------------------------------------*//* FSMC clock enable */RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC , ENABLE); /* Enable GPIOs clock */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF |RCC_AHB1Periph_GPIOG, ENABLE);/*-- GPIOs Configuration -----------------------------------------------------*//*+-------------------+--------------------+------------------+------------------+| PD0  <-> FSMC_D2  | PE0  <-> FSMC_NBL0 | PF0 <-> FSMC_A0  | PG0 <-> FSMC_A10 || PD1  <-> FSMC_D3  | PE1  <-> FSMC_NBL1 | PF1 <-> FSMC_A1  | PG1 <-> FSMC_A11 || PD4  <-> FSMC_NOE | PE2  <-> FSMC_A23  | PF2 <-> FSMC_A2  | PG2 <-> FSMC_A12 || PD5  <-> FSMC_NWE | PE3  <-> FSMC_A19  | PF3 <-> FSMC_A3  | PG3 <-> FSMC_A13 || PD8  <-> FSMC_D13 | PE4  <-> FSMC_A20  | PF4 <-> FSMC_A4  | PG4 <-> FSMC_A14 || PD9  <-> FSMC_D14 | PE5  <-> FSMC_A21  | PF5 <-> FSMC_A5  | PG5 <-> FSMC_A15 || PD10 <-> FSMC_D15 | PE6  <-> FSMC_A22  | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2 || PD11 <-> FSMC_A16 | PE7  <-> FSMC_D4   | PF13 <-> FSMC_A7 |------------------+| PD12 <-> FSMC_A17 | PE8  <-> FSMC_D5   | PF14 <-> FSMC_A8 || PD13 <-> FSMC_A18 | PE9  <-> FSMC_D6   | PF15 <-> FSMC_A9 || PD14 <-> FSMC_D0  | PE10 <-> FSMC_D7   |------------------+| PD15 <-> FSMC_D1  | PE11 <-> FSMC_D8   |+-------------------| PE12 <-> FSMC_D9   || PE13 <-> FSMC_D10  || PE14 <-> FSMC_D11  || PE15 <-> FSMC_D12  |+--------------------+*//* GPIOD configuration */GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);//GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC); //GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC);//GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;GPIO_Init(GPIOD, &GPIO_InitStructure);/* GPIOE configuration *///GPIO_PinAFConfig(GPIOE, GPIO_PinSource0 , GPIO_AF_FSMC);//GPIO_PinAFConfig(GPIOE, GPIO_PinSource1 , GPIO_AF_FSMC);//GPIO_PinAFConfig(GPIOE, GPIO_PinSource2 , GPIO_AF_FSMC);//GPIO_PinAFConfig(GPIOE, GPIO_PinSource3 , GPIO_AF_FSMC);//GPIO_PinAFConfig(GPIOE, GPIO_PinSource4 , GPIO_AF_FSMC);//GPIO_PinAFConfig(GPIOE, GPIO_PinSource5 , GPIO_AF_FSMC);//GPIO_PinAFConfig(GPIOE, GPIO_PinSource6 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7  | GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_Init(GPIOE, &GPIO_InitStructure);/* GPIOF configuration */GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOF, GPIO_PinSource1 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOF, GPIO_PinSource2 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOF, GPIO_PinSource3 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOF, GPIO_PinSource4 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOF, GPIO_PinSource5 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOF, GPIO_PinSource12 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOF, GPIO_PinSource13 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOF, GPIO_PinSource14 , GPIO_AF_FSMC);//GPIO_PinAFConfig(GPIOF, GPIO_PinSource15 , GPIO_AF_FSMC);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_2  | GPIO_Pin_3  | GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14 ;      GPIO_Init(GPIOF, &GPIO_InitStructure);//-- FSMC Configuration ------------------------------------------------------p.FSMC_AddressSetupTime      = 0;p.FSMC_AddressHoldTime       = 0;p.FSMC_DataSetupTime         = 5; //2p.FSMC_BusTurnAroundDuration = 1; //0p.FSMC_CLKDivision           = 0;p.FSMC_DataLatency           = 0;p.FSMC_AccessMode            = FSMC_AccessMode_A;FSMC_NORSRAMInitStructure.FSMC_Bank 		       = FSMC_Bank1_NORSRAM1;FSMC_NORSRAMInitStructure.FSMC_DataAddressMux        = FSMC_DataAddressMux_Disable;FSMC_NORSRAMInitStructure.FSMC_MemoryType            = FSMC_MemoryType_SRAM;FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = FSMC_MemoryDataWidth_16b;FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;FSMC_NORSRAMInitStructure.FSMC_WrapMode              = FSMC_WrapMode_Disable;FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive      = FSMC_WaitSignalActive_BeforeWaitState;FSMC_NORSRAMInitStructure.FSMC_WriteOperation        = FSMC_WriteOperation_Enable;FSMC_NORSRAMInitStructure.FSMC_WaitSignal 	       = FSMC_WaitSignal_Disable;FSMC_NORSRAMInitStructure.FSMC_ExtendedMode 	       = FSMC_ExtendedMode_Disable;//FSMC_NORSRAMInitStructure.FSMC_AsyncWait 		= FSMC_AsyncWait_Disable; //FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait      = FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst 	       = FSMC_WriteBurst_Disable;FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     = &p;FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); /* Enable FSMC Bank1_SRAM Bank */FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  }

        接下来就是对于芯片的初始化,前面说过对于芯片的访问如同SRAM一样,具体到W5300上,就是寄存器地址好比SRAM存储地址,操作寄存器就是往不同的地址写数据。W5300的寄存器地址都是厂商给定的相对地址,而基地址则跟FSMC接线有关。

        W5300的寄存器分为模式寄存器,间接模式寄存器,通用寄存器和SOCKET寄存器。不同的寄存器分管不同的功能,具体的可以查阅官方手册,这里不作列举了。

        W5300的初始化分为3个步骤

  1. 设置主机接口(数据总线宽度,接口模式,时序)
  2. 设置网络信息(MAC,本地IP,网关,子网掩码,重发间隔次数等)
  3. 分配SOCKET内部TX/RX存储空间

        示例代码如下

u8 W5300_Init(void)
{u16 i;u16 Tsum=0,Rsum=0;u16 val;u8  rMac[6];vdTimeDelay(0x00800000);// 设置主机接口:8位/直接访问_SetMR(MR_RST);vdTimeDelay(0x02000000);//setMR(getMR()|MR_FS);// 设置主机中断:IP冲突 | 目标端口无法到达 // | Socket0~3 _SetIMR(IR_IPCF | IR_DPUR  | 0x03);// // 设置网络参数_SetSHAR((u8 *)&(SysInfo.bMAC[0]));_SetGAR((u8 *)&(SysInfo.bGW[0]));_SetSUBR((u8 *)&(SysInfo.bSUB[0]));_SetSIPR((u8 *)&(SysInfo.bIP[0]));_GetSHAR((u8 *)rMac);for(i = 0;i<6;i++){if(SysInfo.bMAC[i] != rMac[i]) break;}if(i < 6) return 0;// 配置重复发送超时周期的值,RTR的标准单位是 100us_SetRTR(2000);// 配置重复发送的次数。当重复发送的次数达到 RCR+1时,将产生超时中断(Sn_IR 的TIMEOUT?位置1)_SetRCR(7);// 分配Socket内存for(i=0; i < MAX_SOCKET_NUM; i++){if(TxMemSize[i] > 64)	return 0;if(RxMemSize[i] > 64)	return 0;Tsum += (u16)TxMemSize[i];Rsum += (u16)RxMemSize[i];dwTMSsum[i] = ((u32)TxMemSize[i]) << 10;dwRMSsum[i] = ((u32)RxMemSize[i]) << 10;}if( (Tsum % 8) || ((Tsum + Rsum) != 128)) return 0;for(i = 0;i<8;i++){_SetTMSR(i,TxMemSize[i]);_SetRMSR(i,RxMemSize[i]);}val = 0;for(i=0; i < Tsum/8; i++){val <<= 1;val  |= 1;}_SetMTYPER(val);return 1;
}

        之后就可以根据实际应用进行socket编程了,根据配置选择TCP或UDP通信等,每个socket可以独立配置互不影响。

        当网络接收到数据时,触发中断,通过读取IR寄存器获知中断类型,然后进相应的处理函数去处理。

void ISR_W5300(void)
{u16 wPendInt;
// Close Global InterruptwPendInt = _GetIR();
// IP地址冲突if(wPendInt & IR_IPCF)    // check the IP conflict interrupt{_SetIR(IR_IPCF);}
// 目标IP无法到达if(wPendInt & IR_DPUR)    // check the unreachable destination interrupt{_SetIR(IR_DPUR);}if (wPendInt & 0x0001) ISR_Socket0();if (wPendInt & 0x0002) ISR_Socket1();if (wPendInt & 0x0004) ISR_Socket2();
// Open Global Interrupt
}

        如果要进行发送,则操作相应的SOCKET寄存器即可

void _WrSxBuffer(u8 Sx,u8* buf,u32 len)
{u32 z,tLen;pSOCKET Sn;Sn = (pSOCKET)(SOCKET0_BASE + SOCKET_REG_SIZE * Sx);tLen = len + (len & 0x01);for(z = 0; z < tLen; z += 2){Sn->TX_FIFOR = (u16)(*(buf + z)<< 8) | (u16)(*(buf+z+1));}
}

        代码太多不便展示,具体可参考

        https://download.csdn.net/download/u011436603/88902967?spm=1001.2014.3001.5503

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

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

相关文章

使用 helm repo add istio添加了一个helm chart repo,如何查看istio的版本呢

1. 添加chart repo helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update2. 查看版本 helm search repo istio 3. 查看版本详细信息 helm show chart istio/cni 4. 查看某个chart的历史版本 helm search repo <chart-name> --…

【Linux】信号的保存

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 信号在Linux中的保存主要涉及方面 信号的类型&#xff1a; 信号处理程序&#xff1a; 信号的传递和处理&#xff1a; 信号的阻…

面试官:你用过Collections工具类吗?

Collections工具类 1. 常用的 Collections 方法2. 代码示例 Java中的 Collections 工具类提供了一系列静态方法&#xff0c;用于对集合进行各种操作&#xff0c;如排序、查找、替换等。下面我们来看一些 Collections 工具类中常用的API和使用示例。 1. 常用的 Collections 方…

回溯算法套路③排列型回溯+N皇后【基础算法精讲 16】

46 . 全排列 链接 : . - 力扣&#xff08;LeetCode&#xff09; 思路 : 那么怎么确定选了那个数呢? 这里设置一个used表示i选没选过 ; class Solution { public:vector<vector<int>> ans;vector<int> path;void backtrack(vector<int>nums,vect…

2024年【天津市安全员B证】考试内容及天津市安全员B证实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员B证考试内容根据新天津市安全员B证考试大纲要求&#xff0c;安全生产模拟考试一点通将天津市安全员B证模拟考试试题进行汇编&#xff0c;组成一套天津市安全员B证全真模拟考试试题&#xff0c;学员可通过…

《Improving Calibration for Long-Tailed Recognition》阅读笔记

论文标题 《Improving Calibration for Long-Tailed Recognition》 改进长尾识别的校准工作 作者 Zhisheng Zhong、 Jiequan Cui、Shu Liu 和 Jiaya Jia 香港中文大学和 SmartMore 初读 摘要 深度神经网络在训练数据集类别极度不平衡时可能会表现不佳。最近&#xff0c…

pydub、playsound播放声音;gradio、streamlit页面播放声音;gradio 页面图像、视频及调用摄像头

1、pydub from pydub import AudioSegment from pydub.playback import playsong AudioSegment.from_wav(r"C:\Users\loong\Downloads\zh.wav") play(song)2、playsound from playsound import playsoundplaysound(r"voice.wav")3、streamlit import s…

Linux学习:初识Linux

目录 1. 引子&#xff1a;1.1 简述&#xff1a;操作系统1.2 学习工具 2. Linux操作系统中的一些基础概念与指令2.1 简单指令2.2 ls指令与文件2.3 cd指令与目录2.4 文件目录的新建与删除指令2.5 补充指令1&#xff1a;2.6 文件编辑与拷贝剪切2.7 文件的查看2.8 时间相关指令2.9 …

22.基于springboot + vue实现的前后端分离-汽车票网上预定系统(项目 + 论文PPT)

项目介绍 系统是一个B/S模式系统&#xff0c;采用Spring Boot框架&#xff0c;MySQL 数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得汽车票网上预订系统管理工作系统化、规范化。本系统的使用使管理人…

JavaScript作用域及预解析

文章目录 1. 作用域介绍2. 变量的作用域*3. JS中没有块级作用域4. 作用域链5. 预解析预解析案例 1. 作用域介绍 全局作用域局部作用域相同的变量名称在不同的作用域中是不会相互影响的&#xff01; 2. 变量的作用域 全局变量&#xff1a;在全局下都可以使用&#xff1b;局部变…

华为数通方向HCIP-DataCom H12-821题库(多选题:61-80)

第61题 ACL 可分为如下哪些类别? A.用户自定义 ACL B.基本 ACL C.二层ACL D.高级ACL 【参考答案】ABCD 【答案解析】 A. 用户自定义 ACL (User-defined ACL): 这是用户根据自身需求自定义的 ACL,用于实现特定的访问控制策略。B.基本 ACL (Standard ACL): 基本 ACL 是基于源 …

北京大学发布,将试错引入大模型代理学习!

引言&#xff1a;探索语言智能的新边界 在人工智能的发展历程中&#xff0c;语言智能始终是一个核心的研究领域。随着大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;我们对语言智能的理解和应用已经迈入了一个新的阶段。这些模型不仅能够理解和生成自然语言&#x…

【算法分析与设计】组合

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 示例 1&…

【计算机学习】-- 电脑的组装和外设

系列文章目录 文章目录 系列文章目录前言一、电脑的组装1.CPU2.主板3.显卡4.硬盘5.内存6.散热器7.电源8.机箱 二、电脑外设选用1.显示器2.鼠标3.键盘4.音响 总结 前言 一、电脑的组装 1.CPU 返回目录 认识CPU CPU&#xff0c;即中央处理器&#xff0c;负责电脑资源的调度安…

计算机网络-网络安全(一)

1.网络安全威胁和漏洞类型&#xff1a; 窃听 假冒 重放 流量分析 破环完整 病毒 木马 诽谤 非授权访问 拒绝服务 漏洞&#xff1a;物理、软件、不兼容、其他等。 2.网络安全信息数据五大特征&#xff1a; 完整性&…

【.NET Core】深入理解IO - 读取器和编写器

【.NET Core】深入理解IO - 读取器和编写器 文章目录 【.NET Core】深入理解IO - 读取器和编写器一、概述二、BinaryReader和BinaryWriter2.1 BinartReader类2.2 BinaryWriter类 三、StreamReader和StreamWriter3.1 StreamReader类3.1 StreamWriter类StreamWriter类构造函数Str…

【Vue】探究 Vue 2 与 Vue 3 生命周期:变化与延续

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

paper-ai :搜索真实文献并生成引用真实文献的AI论文

paper-ai &#xff1a;搜索真实文献并生成引用真实文献的AI论文。 项目简介 使用真实文献最快速完成论文的方法 利用人工智能撰写论文 人工智能书写功能&#xff1a;点击 "AI 写作 "进行正常对话互动。人工智能将根据您的输入提供写作建议或回答问题。 寻找文献功能…

C/C++工程师面试题(STL篇)

STL 中有哪些常见的容器 STL 中容器分为顺序容器、关联式容器、容器适配器三种类型&#xff0c;三种类型容器特性分别如下&#xff1a; 1. 顺序容器 容器并非排序的&#xff0c;元素的插入位置同元素的值无关&#xff0c;包含 vector、deque、list vector&#xff1a;动态数组…

DocxToDoc.java

DocxToDoc.java word高版本docx转化word2003版本 package word;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagrap…