w5100模塊,學(xué)習(xí)了一下。這個(gè)芯片真的不錯(cuò),集成了硬件tcp/ip協(xié)議棧。操作很簡(jiǎn)單,主要是通過(guò)spi接口(當(dāng)然也支持并口總線操作)配置網(wǎng)絡(luò)的相關(guān)ip 掩碼 物理地址 之類的值。 參數(shù)配置好后,就是讀寫(xiě)通訊的內(nèi)容,w5100有個(gè)中斷引腳來(lái)指示通訊的完成,我們通過(guò)在中斷到來(lái)之后讀取狀態(tài)值,就會(huì)知道是那個(gè)端口的中斷,以此來(lái)進(jìn)行相關(guān)數(shù)據(jù)解析。 w5100初始化程序: Write_W5100(W5100_MODE,MODE_RST); /*軟復(fù)位W5100*/ Delay(100); /*延時(shí)100ms,自己定義該函數(shù)*/ /*設(shè)置網(wǎng)關(guān)(Gateway)的IP地址,4字節(jié) */ /*使用網(wǎng)關(guān)可以使通信突破子網(wǎng)的局限,通過(guò)網(wǎng)關(guān)可以訪問(wèn)到其它子網(wǎng)或進(jìn)入Internet*/ for(i=0;i<4;i++) Write_W5100(W5100_GAR+i,Gateway_IP); /*Gateway_IP為4字節(jié)unsigned char數(shù)組,自己定義*/ /*設(shè)置子網(wǎng)掩碼(MASK)值,4字節(jié)。子網(wǎng)掩碼用于子網(wǎng)運(yùn)算*/ for(i=0;i<4;i++) Write_W5100(W5100_SUBR+i,Sub_Mask); /*SUB_MASK為4字節(jié)unsigned char數(shù)組,自己定義*/ /*設(shè)置物理地址,6字節(jié),用于唯一標(biāo)識(shí)網(wǎng)絡(luò)設(shè)備的物理地址值 該地址值需要到IEEE申請(qǐng),按照OUI的規(guī)定,前3個(gè)字節(jié)為廠商代碼,后三個(gè)字節(jié)為產(chǎn)品序號(hào) 如果自己定義物理地址,注意第一個(gè)字節(jié)必須為偶數(shù)*/ for(i=0;i<6;i++) Write_W5100(W5100_SHAR+i,Phy_Addr); /*PHY_ADDR6字節(jié)unsigned char數(shù)組,自己定義*/ /*設(shè)置本機(jī)的IP地址,4個(gè)字節(jié) 注意,網(wǎng)關(guān)IP必須與本機(jī)IP屬于同一個(gè)子網(wǎng),否則本機(jī)將無(wú)法找到網(wǎng)關(guān)*/ for(i=0;i<4;i++) Write_W5100(W5100_SIPR+i,IP_Addr); /*IP_ADDR為4字節(jié)unsigned char數(shù)組,自己定義*/ /*設(shè)置發(fā)送緩沖區(qū)和接收緩沖區(qū)的大小,參考W5100數(shù)據(jù)手冊(cè)*/ Write_W5100(W5100_RMSR,0x55); /*Socket Rx memory size=2k*/ Write_W5100(W5100_TMSR,0x55); /*Socket Tx mempry size=2k*/ /* 設(shè)置重試時(shí)間,默認(rèn)為2000(200ms) */ Write_W5100(W5100_RTR,0x07); Write_W5100(W5100_RTR+1,0xd0); /* 設(shè)置重試次數(shù),默認(rèn)為8次 */ Write_W5100(W5100_RCR,8); /* 啟動(dòng)中斷,參考W5100數(shù)據(jù)手冊(cè)確定自己需要的中斷類型 IMR_CONFLICT是IP地址沖突異常中斷 IMR_UNREACH是UDP通信時(shí),地址無(wú)法到達(dá)的異常中斷 其它是Socket事件中斷,根據(jù)需要添加 */ Write_W5100(W5100_IMR,(IMR_CONFLICT|IMR_UNREACH|IMR_S0_INT|IMR_S1_INT|IMR_S2_INT|IMR_S3_INT)); 主程序: do { /* 設(shè)置W5100端口 */ W5100_Socket_Set(); Socket_Listen(0); /* 處理W5100中斷 */ if(W5100_Interrupt) W5100_Interrupt_Process(); /* 如果Socket0接收到數(shù)據(jù) */ if((S0_Data & S_RECEIVE) == S_RECEIVE) { GPIO_SetBits(GPIOB, LED_DRIVE); S0_Data&=~S_RECEIVE; Process_Socket_Data(0); } /* 如果Socket1接收到數(shù)據(jù) */ if((S1_Data & S_RECEIVE) == S_RECEIVE) { GPIO_SetBits(GPIOB, LED_DRIVE); S1_Data&=~S_RECEIVE; Process_Socket_Data(1); } /* 如果Socket2接收到數(shù)據(jù) */ if((S2_Data & S_RECEIVE) == S_RECEIVE) { GPIO_SetBits(GPIOB, LED_DRIVE); S2_Data&=~S_RECEIVE; Process_Socket_Data(2); } /* 如果Socket3接收到數(shù)據(jù) */ if((S3_Data & S_RECEIVE) == S_RECEIVE) { GPIO_SetBits(GPIOB, LED_DRIVE); S3_Data&=~S_RECEIVE; Process_Socket_Data(3); W5100模塊圖片(旺旺:fan2012918) STM32103(旺旺:fan2012918) (旺旺:fan2012918) 資料下載: |