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.pswp.cn/news/719613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719613.shtml
英文地址,請注明出處:http://en.pswp.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;局部變…

藍橋杯——外賣店優先級

外賣店優先級 題目分析 這一題一看N&#xff0c;M&#xff0c;T的范圍就知道不能暴力&#xff0c;要討巧&#xff0c;怎么討巧是重點。正常的思路是第一層for循環遍歷訂單&#xff08;或者外賣店&#xff09;&#xff0c;第二層for循環遍歷外賣店&#xff08;或者訂單&#x…

Vue中 computed 和 watch

在Vue框架中&#xff0c;computed和watch都用于響應數據的變化&#xff0c;但它們在使用上有著不同的側重點和機制。具體分析如下&#xff1a; 1. 功能差異 computed是計算屬性&#xff0c;它是基于它們的響應式依賴進行緩存的。只有當依賴的數據發生變化時&#xff0c;compu…

2827. 范圍中美麗整數的數目

文章目錄 題意思路代碼 題意 題目鏈接 思路 按位dp暴力 代碼 // 暴力 class Solution { public:int numberOfBeautifulIntegers(int low, int high, int k) {int l low / k;int r high / k;if (low % k)l;int ans 0;while (l < r){int tmp l * k;if (10 < tmp &…

華為數通方向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 是基于源 …

OCP Secure boot必要特性

三點必需要求&#xff1a; The platform components must: 1. Provide a mechanism for securely anchoring a root of trust public key. // 提供一種用于安全地錨定信任根公鑰的機制。 2. Verify the device firmware digital signature using the anchored public key /…

北京大學發布,將試錯引入大模型代理學習!

引言&#xff1a;探索語言智能的新邊界 在人工智能的發展歷程中&#xff0c;語言智能始終是一個核心的研究領域。隨著大語言模型&#xff08;LLM&#xff09;的興起&#xff0c;我們對語言智能的理解和應用已經邁入了一個新的階段。這些模型不僅能夠理解和生成自然語言&#x…

動態規劃(四)背包dp

01背包 完全背包 多重背包 二維費用背包 分組背包 混合背包

【算法分析與設計】組合

&#x1f4dd;個人主頁&#xff1a;五敷有你 &#x1f525;系列專欄&#xff1a;算法分析與設計 ??穩中求進&#xff0c;曬太陽 題目 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 示例 示例 1&…

25考研習題記錄

3月 湯家鳳《1800》 基礎篇 日期高等數學線性代數概率論3.1 P92-93 P212-214 3.4 P10-15 P10-19 極限題62題 P73-74 P170-172 行列式17題 考研競賽凱哥每日一題 張宇高數30講頁數3.4P74

【計算機學習】-- 電腦的組裝和外設

系列文章目錄 文章目錄 系列文章目錄前言一、電腦的組裝1.CPU2.主板3.顯卡4.硬盤5.內存6.散熱器7.電源8.機箱 二、電腦外設選用1.顯示器2.鼠標3.鍵盤4.音響 總結 前言 一、電腦的組裝 1.CPU 返回目錄 認識CPU CPU&#xff0c;即中央處理器&#xff0c;負責電腦資源的調度安…