w5300

w5300

W5300的目標是在高性能的嵌入式領域,如多媒體數據流服務。與WIZnet現有的晶片方案相比較,W5300在記憶體空間和數據處理能力等方面都有很大的提高。

介紹

W5300在記憶體空間和數據處理能力等方面都有很大的提高。W5300特別適用於IPTV,IP機頂盒和數位電視等大流量多媒體數據的傳輸。通過一個集成有TCP/IP協定和10/100M的乙太網MAC和PHY的單晶片可以非常簡單和快捷地實現Internet連線。

W5300與主機(MCU)採用匯流排接口。通過直接訪問方式或間接訪問方式,W5300可以很容易與主機接口,就像訪問SRAM存儲器。W5300的通信數據可以通過每個連線埠的TX/RX FIFO暫存器訪問。由於這些特性,即使一個初學者也很容易使用W5300實現Internet連線。

特性

l 支持軟、硬體混合TCP/IP協定: TCP, UDP, ICMP, IGMP, IPv4, ARP, PPPoE, Ethernet;

l 支持8個獨立的連線埠(sockets)同時連線;

l 網路數據傳輸,速率可達到80Mbps;

l 支持ADSL連線 (支持PPPOE協定,帶PAP/CHAP驗證);

l 內部128K位元組存儲器作TX/RX快取;

l 根據連線埠通信數據吞吐量動態調整內部TX/RX存儲器分配;

l 內嵌10BaseT/100BaseTX乙太網物理層,支持自動應答(全雙工/半雙工模式);

I 可選TX1:1 RX1:1 網路變壓器接口YL18-2050S,YT37-1107S及YL2J011D,YL2J201A

l 支持自動極性變換(MDI/MDIX);

l 支持8/16位數據匯流排;

l 0.18μm CMOS工藝;

l 3.3V工作電壓,I/O口可承受5V電壓,內部帶1.8V電壓調整器;

l LQFP-100,14x14mm無鉛封裝。

模組

PLL 鎖相環

將25MHz的時鐘源經過6倍頻,建立150MHz的時鐘信號。150MHz的時鐘用於內部單元的運行,如

TCP/IP核心、主機接口管理和暫存器管理。鎖相環在復位後鎖定並提供穩定的時鐘信號。

電源調節系統

電源調節系統通過3.3v的輸入建立1.8v/150mA的輸出電壓。電源調節系統為W5300的核心提供電源。

因此不需要其它電源調節器。為了使1.8v的電源更穩定,建議增加電容濾波。

主機接口管理

它根據數據匯流排的寬度或主機接口模式,檢測主機匯流排信號,管理讀寫操作。

暫存器管理

它管理模式暫存器、通用(COMMON)暫存器和SOCKET(連線埠)暫存器。

存儲器管理

它管理內部128K位元組的數據存儲器。由主機分配每個連線埠的TX/RX存儲器。主機可以通過每個

SOCKET的FIFO暫存器訪問TX/RX存儲器。

128K位元組TX/RX DPRAM

這是128K位元組通信數據存儲器,組成16個8K位元組的DPRAM (雙連線埠RAM)。可以由主機靈活分配給

每個SOCKET。

MII接口管理

它管理MII接口,根據TEST_MODE[3:0]的配置,MII接口可以在內部PHY和外部PHY(第三方PHY)

之間切換。

內部乙太網PHY

W5300內部集成了10BaseT/100BaseTX的乙太網PHY。PHY支持半雙工/全雙工自動握手和

MDI/MDIX自動檢查。它還支持6種網路指示的LED輸出,如LINK狀態、速度和雙工狀態。

TCP/IP核心

TCP/IP核心是完全基於WIZnet網路協定處理技術進行硬體邏輯化。

- 802.3乙太網MAC(介質訪問控制)

它控制乙太網的CSMA/CD(載波監聽多路訪問/衝突檢測)訪問。他是基於48位源/目的MAC地址的

協定技術。它也允許主機通過SOCKET0控制MAC層。因此可以實現軟體TCP/IP協定和硬體TCP/IP協定。

- PPPOE(通過乙太網的點對點協定

這是在乙太網上實現PPP服務的協定。它將乙太網數據幀的有效載荷數據封裝為PPP數據幀而進行傳

輸。當接收數據時,它拆封PPP數據幀。PPPoE支持與PPPoE伺服器的PPP通信,支持PAP/CHAP驗證

方法。

- ARP(地址解析協定)

ARP是通過IP位址解析MAC地址的協定。它傳送ARP回響給來自對端的ARP請求。它也傳送ARP請求

查找對端的MAC地址,同時處理對該請求的ARP回響。

- IP(網路協定)

IP協定支持IP層的數據通信。不支持IP分片。不能接收分片的數據包。除了TCP和UDP,所有的協定

號都支持。在TCP和UDP情況下,使用硬體的協定棧。

- ICMP(Internet控制信息協定)

它接收ICMP數據包,如分片的MTU、無法訪問的目標及標識主機等。當收到Ping請求的ICMP數據包

時,它將回響Ping應答的ICMP數據包。它支持最大119個位元組的Ping請求。如果超過119個位元組時,它將

不再支持。

- IGMPv1/v2(Internet組管理協定版本1/2)

它處理IGMP協定,如加入/脫離組、在UDP多播模式下報告等等。只支持IGMP的版本1和版本2。如

果使用更高版本的IGMP, 則需要在IP層手動實現。

- UDP(數據報文協定)

這是在UDP層實現數據傳輸的協定。它支持用戶報文,如單播、多播和廣播。

- TCP(傳輸控制協定)

這是在TCP層實現數據傳輸的協定。它支持“TCP客戶端”和“TCP伺服器”。W5300不需要主機的干預,內部處理所有的通信協定。W5300基於TOE(TCP/IP Offload引擎),通

過減少主機處理TCP/IP協定時的負荷,可以極大地提升主機的性能。

功能描述

W5300可以通過暫存器的設定使Internet的連線變得非常簡單。在本章將學習怎樣初始化W5300,通

過學習一些代碼,怎樣根據協定類型(TCP、UDP、IPRAW和MACRAW)實現網路通信。

初始化

W5300的初始化分三個步驟:主機接口設定,網路信息設定和內部TX/RX存儲器的分配。

第1步:設定主機接口

1. 設定數據匯流排寬度,主機接口模式和時序(參考MR暫存器)

2. 設定主機中斷(參考IMR)

第2步:設定網路信息

1. 設定數據通信的基本網路信息(參考:SHAR、GAS、SBUR和SIPR)

2. 設定重複傳送的時間間隔和重複傳送的次數,用於數據包傳送失敗時的重複傳送(參考RTR和

RCR)

本機硬體地址通過SHAR設定,這是一個乙太網設備的唯一的硬體地址(乙太網的MAC地址),套用

於乙太網的MAC層

由IEEE分配和管理MAC地址。生產廠商需要從IEEE申請網路設備的MAC地址。

第3步:分配SOCKETn的內部TX/RX存儲器空間

1. 定義內部TX/RX存儲器大小(參考MYTPER)

2. 定義SOCKETn的TX/RX存儲器大小(參考TMR和RMSR)

W5300內部包含16個8K位元組的存儲單元。這些存儲單元依次映射在128K位元組的存儲器空間。128K存

儲器分為傳送存儲器(TX)和接收存儲器(RX)。內部TX和RX存儲器以8K位元組為單元分布在128K位元組

空間。內部TX/RX存儲器可以在0~64K位元組空間以1K位元組為單元從新分配給每個SOCKET。

當第3步初始化設定完成後,就可以使用W5300通過乙太網傳輸數據了。這時,W5300可以回響Ping

請求(自動Ping回響)。

數據通信

完成初始化設定以後,W5300可以以TCP、UDP、IPRAW或MACRAW的方式打開SOCKET傳送或接

收數據。W5300支持8個SOCKET同時且獨立地工作。在本章將描述每種通信方式的工作方法。

TCP

TCP是一種連線通信的協定,在TCP模式,首先要根據IP位址和連線埠號與對端建立SOCKET連線。通

過連線的SOCKET傳送和接收數據。

建立SOCKET的連線有“TCP伺服器”和“TCP客戶端”之分。區分它們的方法是誰首先傳送連線請

求(SYS數據包)。“TCP伺服器”等待對端的連線請求,當收到連線請求時建立SOCKET連線(被動打

開)。“TCP客戶端”主動發出連線請求,與對端建立連線(主動打開)。

SOCKET初始化

為了實現TCP通信,需要對SOCKET進行初始化設定並打開SOCKET。為了打開SOCKET,選擇其中

的一個SOCKET(被選擇的SOCKET稱之為SOCKETn),通過Sn_MR(P3:P0)和Sn_PORTR分別設定通

信協定和本機連線埠號(在TCP伺服器模式,稱之為偵聽連線埠號),然後執行OPEN命令。執行完OPEN命

令後,如果Sn_SSR改變為SOCK_INIT,則SOCKET的初始化設定完成。

在TCP伺服器和TCP客戶端模式,SOCKET初始化的過程都是相同的。下面的方法是將SOCKET初始

化為TCP模式。

{

START:

Sn_MR = 0x0001; /* sets TCP mode */

Sn_PORTR = source_port; /* sets source port number */

Sn_CR = OPEN; /* sets OPEN command */

/* wait until Sn_SSR is changed to SOCK_INIT */

if (Sn_SSR != SOCK_INIT) Sn_CR = CLOSE; goto START;

}

如果接收到對端的數據位元組數為偶數,Sn_MR(ALIGN)置‘1’。當Sn_MR(ALIGN)=1時,W5300不

需要增加TCP模式的PACKET-INFO,而只將數據保存在SOCKETn的內部RX存儲器。這樣將減少主機對

SOCKET_INFO的額外處理,提高系統性能。(在前面的代碼中,Sn_MR=0x0101可能會被Sn_MR=0x0001

取代)

偵聽

運行LISTEN命令將W5300設定為TCP伺服器模式

{

/* listen SOCKET */

Sn_CR = LISTEN;

/* wait until Sn_SSR is changed to SOCK_LISTEN */

If (Sn_SSR != SOCK_LISTEN) Sn_CR = CLOSE; goto START;

}

建立連線?

當Sn_SSR改變為SOCK_LISTEN狀態時,如果收到SYN數據包,那么Sn_SSR將改變為

SOCK_SYNRECV。傳送了SYN/ACK數據包後,SOCKETn就建立了連線。SOCKETn建立連線以後就可

以進行數據通信。有兩種方法可以檢驗是否建立SOCKETn的連線。

第1種方法

{

if (Sn_IR(CON) == ‘1’) Sn_IR(CON) = ‘1’; goto ESTABLISHED stage;

/* In this case, if the interrupt of SOCKETn is activated, interrupt occurs. Refer to IR, IMR

Sn_IMR and Sn_IR. */

}

第二種方法

{

if (Sn_SSR == SOCK_ESTABLISHED) goto ESTABLISHED stage;

}

建立連線:接收到數據?

檢查是否接收到對端傳送來的數據。

第1種方法

{

if (Sn_IR(RECV) == ‘1’) Sn_IR(RECV) = ‘1’; goto Receiving Process stage;

/* In this case, if the interrupt of SOCKETn is activated, interrupt occurs. Refer to IR, IMR

Sn_IMR and Sn_IR. */

}

第2種方法

{

if (Sn_RX_RSR != 0x00000000) goto Receiving Process stage;

}

第1種方法,當SOCKETn接收到數據包時,Sn_IR(RECV)將置‘1’。這時如果主機還沒有處理上次

接收數據包的Sn_IR(RECV),而W5300又收到下一次的數據包,主機保持前一次的Sn_IR(RECV),不能

識別下一次數據包的Sn_IR(RECV),因此,如果主機沒有能力處理所有數據包的Sn_IR(RECV),建議不

採用這種方法。

建立連線:接收數據處理

當Sn_MR(ALIGN)=0時,數據包中包含PACKET-INFO和數據的數據。在Sn_ME(ALIGN)=1時,TCP

數據只有數據包而沒有PACKET-INFO。

在TCP模式,如果對端傳送的數據的大小超過SOCKETn的RX存儲器的剩餘空間,那么W5300將不能

接收數據,這時的W5300將繼續保持連線,並等待RX存儲器的剩餘空間大於數據長度。

{

/* first, check Sn_MR(ALIGN) */

if (Sn_MR(ALIGN) == ‘0’)

{

pack_size = Sn_RX_FIFOR; /* extract size of DATA packet from internal RX memory */

}

else

{

pack_size = Sn_RX_RSR; /* check the total received data size */

}

/* calculate the read count of Sn_RX_FIFOR */

if (pack_size is odd ?) read_cnt = (pack_size + 1) / 2;

read_cnt = pack_size / 2;

/* extract DATA packet from internal RX memory */

for( i = 0; i < read_cnt; i++)

{

data_buf[i] = Sn_RX_FIFOR; /* data_buf is array of 16bit */

}

/* set RECV command */

Sn_CR = RECV;

}

注意:當SOCKETn只用於接收數據而不傳送數據時,主機不能快速接收處理數據將導致使內部RX存

儲器溢出。

在這種情況下,即使W5300的視窗尺寸(接收數據的最大尺寸)不為0,對端誤以為視窗尺寸為0而不再傳送數據,等待視窗尺寸增加。這樣就會降低W5300接收數據的性能。為了解決這個問題,主機首先處理內部RX存儲器接收的數據,同時通知對端,W5300的視窗尺寸增加了已經接收數據的大小。針對上面代碼,在RECV命令之後增加以下的代碼。

/* set RECV command */

Sn_CR = RECV;

/* Add the code that notifies the update of window size to the peer */

/* check the received data process to finish or not */

if(Sn_RX_RSR == 0) /* send the window-update packet when the window size is full */

{ /* Sn_RX_RSR can be compared with another value instead of „0‟, according to the host

performance of receiving data */

Sn_TX_WRSR = 0x00000001; /* set Dummy Data size to Sn_TX_WRSR */

Sn_CR = SEND; /* set SEND command */

while(Sn_CR != 0x00); /* check SEND command completion */

while(Sn_IR(SENDOK) == 0); /* wait for SEND OK */

Sn_IR(SENDOK) =1; /* Clear SENDOK bit */

}

建立連線:傳送數據?/傳送處理

將數據通過Sn_TX_FIFOR寫入到內部TX存儲器後,W5300將試著把數據傳送到對端。傳送數據的大

小不能比分配給該SOCKETn的內部TX存儲器空間大。如果傳送數據的尺寸比MSS大,W5300將自動根據

MSS分片,然後再傳送。

為了下一次數據的傳送,主機必須檢查上次SEND命令是否執行完畢。如果上一次的SEND命令還沒

有執行完而又開始下一次的SEND命令,將可能產生各種各樣的錯誤。數據越大,執行SEND命令所需要

的時間就會越長。所以要想提高傳送效率,適當將數據分為合適的大小傳送。

{

/* first, get the free TX memory size */

FREESIZE:

get_free_size = Sn_TX_FSR;

if (Sn_SSR != SOCK_ESTABLISHED && Sn_SSR != SOCK_CLOSE_WAIT) goto CLOSED

state;

if (get_free_size < send_size) goto FREESIZE;

/* calculate the write count of Sn_TX_FIFOR */

if (send_size is odd ?) write_cnt = (send_size + 1) / 2;

else write_cnt = send_size / 2;

/* copy data to internal TX memory */

for (i = 0; i < write_cnt; i++)

{

Sn_TX_FIFOR = data_buf[i]; /* data_buf is array of 16bit */

}

/* check previous SEND command completion */

if (is first send ?) ; /* skip check Sn_IR(SENDOK) */

else

{

while(Sn_IR(SENDOK)==‘0’)

{

if(Sn_SSR == SOCK_CLOSED) goto CLOSED state; /* check connection establishment */

}

Sn_IR(SENDOK) = ‘1’; /* clear previous interrupt of SEND completion */

}

/* sets transmission data size to Sn_TX_WRSR */

Sn_TX_WRSR = send_size;

/* set SEND command */

Sn_CR = SEND;

}

建立連線:接收到FIN

它檢查是否接收到下線的請求(FIN數據包)。檢查如下:

第1種方法

{

if (Sn_IR(DISCON) == ‘1’) Sn_IR(DISCON)=‘1’; goto CLOSED stage;

/* In this case, if the interrupt of SOCKETn is activated, interrupt occurs. Refer to IR, IMR

Sn_IMR and Sn_IR. */

}

第2種方法

{

if (Sn_SSR == SOCK_CLOSE_WAIT) goto CLOSED stage;

}

建立連線:下線?/下線處理

如果不再需要進行數據通信,或收到FIN數據包,那么SOCKET的連線應該斷開。

{

/* set DISCON command */

Sn_CR = DISCON;

}

建立連線:關閉連線埠?

它檢查SOCKETn是否通過DISCON或CLOSE命令下線或關閉連線埠。

第1種方法

{

if (Sn_IR(DISCON) == ‘1’) goto CLOSED stage;

/* In this case, if the interrupt of SOCKETn is activated, interrupt occurs. Refer to IR, IMR

Sn_IMR and Sn_IR. */

}

第2種方法

{

if (Sn_SSR == SOCK_CLOSED) goto CLOSED stage;

}

建立連線:逾時

逾時可能發生在TCP數據包傳輸過程中,如連線請求(SYN數據包)或其回響數據包(SYN/ACK數

據包)、數據(DATA數據包)或其回響數據包(DATA/ACK數據包)、下線請求(FIN數據包)或其

回響數據包(FIN/ACK數據包)等等。如果以上的數據包在RTR和RCR設定的時間內沒有傳送出去,那么

將產生TCP逾時,且Sn_SSR將改變為SOCK_CLOSED狀態。

TCP逾時檢查如下:

第1種方法:

{

if (Sn_IR(TIMEOUT bit) == ‘1’) Sn_IR(TIMEOUT)=‘1’; goto CLOSED stage;

/* In this case, if the interrupt of SOCKETn is activated, interrupt occurs. Refer to IR, IMR

Sn_IMR and Sn_IR. */

}

第2種方法:

{

if (Sn_SSR == SOCK_CLOSED) goto CLOSED stage;

}

SOCKET關閉

SOCKETn經過下線處理或由於逾時而下線,它用於關閉下線的SOCKETn。主機也可以不進

行下線處理而直接關閉SOCKETn。

{

/* clear remained interrupts */

Sn_IR = 0x00FF;

IR(n) = ‘1’;

/* set CLOSE command */

Sn_CR = CLOSE;

}

TCP客戶端

它傳送連線請求(SYN數據包)到對端。在與對端SOCKET建立連線的過程中可能會出現ARP逾時,

或TCP連線逾時。

{

Sn_DIPR = server_ip; /* set TCP SERVER IP address*/

Sn_DPORTR = server_port; /* set TCP SERVER listen port number*/

Sn_CR = CONNECT; /* set CONNECT command */

}

相關詞條

熱門詞條

聯絡我們