介紹
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 */
}