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