新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)以太網(wǎng)控制芯片W7100A數(shù)據(jù)手冊(cè)(四)

單片機(jī)以太網(wǎng)控制芯片W7100A數(shù)據(jù)手冊(cè)(四)

作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏

例1:SOCKET 0 : 8KB, SOCKET 1 : 2KB

0xFE401E0xFE411E
0x080x02

例2:SOCKET 2 : 1KB, SOCKET 3 : 1KB

0xFE421E0xFE431E
0x010x01

例3: SOCKET 4 : 1KB, SOCKET 5 : 1KB

0xFE441E0xFE451E
0x010x01

例4: SOCKET 6 : 1KB, SOCKET 7 : 1KB

0xFE461E0xFE471E
0x010x01

從上面的例1~例4可以看出,8個(gè)SOCKET的RX存儲(chǔ)器之和為16K字節(jié)。

Sn_TXMEM_SIZE (SOCKET n發(fā)送存儲(chǔ)器大小寄存器)[R/W][0xFE401F + 0x100n][0x02]

它配置SOCKET的內(nèi)部TX存儲(chǔ)器。每個(gè)SOCKET的TX存儲(chǔ)器可配置的大小為1、2、4、8、16K字節(jié)。復(fù)位后默認(rèn)為2K字節(jié)。8個(gè)SOCKET的TX存儲(chǔ)器之和為16K字節(jié)。

例5:SOCKET 0 : 4KB, SOCKET 1 : 1KB

0xFE401F0xFE411F
0x040x01

例6: SOCKET 2 : 2KB, SOCKET 3 : 1KB

0xFE421F0xFE431F
0x020x01

例7:SOCKET 4 : 2KB, SOCKET 5 : 2KB

0xFE441F0xFE451F
0x020x02

例8:SOCKET 6 : 2KB, SOCKET 7 : 2KB

0xFE461F0xFE471F
0x020x02

從上面例5~例8所示,8個(gè)SOCKET的TX存儲(chǔ)器之和為16K字節(jié)。

Sn_TX_FSR (SOCKET n發(fā)送存儲(chǔ)器剩余空間大小寄存器)[R][(0xFE4020 + 0x100n) – (0xFE4021 + 100n)][0x0000]

它指示SOCKET n的內(nèi)部TX存儲(chǔ)器可使用的空間大小(可寫入的傳輸數(shù)據(jù)的字節(jié)數(shù))。主機(jī)不能寫入比Sn_TX_FSR更多的數(shù)據(jù)到TX存儲(chǔ)器。因此 , 在向TX存儲(chǔ)器寫入發(fā)送數(shù)據(jù)前檢查Sn_TX_FSR,如果要寫入的數(shù)據(jù)字節(jié)數(shù)小于或等于Sn_TX_FSR,才可以寫入數(shù)據(jù)到TX存儲(chǔ)器然后用SEND或SEND_MAC命令發(fā)送。

在TCP模式,如果對(duì)端接收到所發(fā)送的數(shù)據(jù)包(如果收到從對(duì)端來的DATA/ACK數(shù)據(jù)包),Sn_TX_FSR將自動(dòng)增加,增加量就是已發(fā)送的字節(jié)數(shù)。在其它模式,只要Sn_IR(SENDOK)=1,Sn_TX_FSR就自動(dòng)增加,增加量就是傳輸?shù)臄?shù)據(jù)長度。

例:S0_TX_FSR0的值為2048(0x0800),

0xFE40200xFE4021
0x080x00

Sn_TX_RD (SOCKET n發(fā)送存儲(chǔ)器讀指針寄存器)[R][(0xFE4022 + 0x100n) – (0xFE4023 + 0x100n)][0x0000]

該寄存器顯示TX存儲(chǔ)器最后結(jié)束傳輸?shù)牡刂分?。?duì)SOCKET n的命令控制寄存器寫入SEND命令,它將從當(dāng)前的Sn_TX_RD地址開始傳輸數(shù)據(jù),直到Sn_WR_WR地址為止。在傳輸結(jié)束后該寄存器的值自動(dòng)改變。因此在傳輸結(jié)束后,Sn_TX_RD和Sn_TX_WR的值是相等的。讀該寄存器時(shí),先讀取它的高字節(jié)(0xFE4022,0xFE4122,0xFE4222,0xFE4322,0xFE4422, 0xFE4522,0xFE4622,0xFE4722),然后再讀它的低字節(jié)(0xFE4023,0xFE4123,0xFE4223, 0xFE4323,0xFE4423,0xFE4523,0xFE4623,0xFE4723),這樣讀取的數(shù)據(jù)才正確。

Sn_TX_WR (SOCKET n發(fā)送存儲(chǔ)器寫指針寄存器)[R/W][(0xFE4024 + 0x100n) – (0xFE4025 + 0x100n)][0x0000]

該寄存器提供定位信息,指示數(shù)據(jù)應(yīng)該寫入到什么位置。讀取該寄存器時(shí),先讀取高字節(jié)(0xFE4024,0xFE4124,0xFE4224,0xFE4324,0xFE4424,0xFE4524,0xFE4624,0xFE4724),然后再讀取低字節(jié)(0xFE4025,0xFE4125,0xFE4225,0xFE4325,0xFE4425,0xFE4525,0xFE4625, 0xFE4725),這樣讀取的數(shù)據(jù)才正確。

例:S0_TX_WR的值為2048(0x0800)。

0xFE40240xFE4025
0x080x00

但這個(gè)值本身不是可以直接訪問的物理地址。實(shí)際訪問的物理地址計(jì)算如下:(請(qǐng)參考W7100A驅(qū)動(dòng)程序)

1.從Sn_TXMEM_SIZE(n)計(jì)算出端口n TX存儲(chǔ)器的基地址(SBIUFBASEADDRES(n))和掩碼地址(SMASK(n)),詳細(xì)內(nèi)容參看所提供的源代碼。

2.將Sn_TX_WR0和SMASK(n)進(jìn)行’位與’運(yùn)算,其結(jié)果就是在端口n的TX存儲(chǔ)器范圍內(nèi)的偏移地址(dst_mask)。

3.將dst_mask和SUBFBASEADDRESS(n)相加得到實(shí)際訪問的物理地址(dst_ptr)。現(xiàn)在可以將需要傳輸?shù)臄?shù)據(jù)寫到dst_ptr。(*有一種情況需要注意,寫入數(shù)據(jù)時(shí)可能會(huì)超過端口n的TX存儲(chǔ)器的上界。這時(shí)將數(shù)據(jù)寫入上邊界地址后,再從SBUFBASEADDRESS(n)開始寫入剩余的數(shù)據(jù),如此循環(huán)寫入操作。)

操作完成后,Sn_TX_WR的值必須加上當(dāng)前寫入數(shù)據(jù)的字節(jié)數(shù)。最后向Sn_CR(端口n的命令寄存器)發(fā)出SEND命令。詳細(xì)信息參考TCP服務(wù)器模式下發(fā)送數(shù)據(jù)的源代碼。

圖8.3 計(jì)算物理地址

Sn_RX_RSR (SOCKET n RX接收數(shù)據(jù)長度寄存器)[R][(0xFE4026 + 0x100n) – (0xFE4027 + 0x100n)][0x0000]

它指示SOCKET n內(nèi)部RX存儲(chǔ)器中接收數(shù)據(jù)的字節(jié)數(shù)。由于該值是由Sn_Rx_RD和Sn_Rx_WR的在內(nèi)部計(jì)算得出的,對(duì)SOCKET n的命令寄存器(Sn_CR)寫入RECV命令且接收到遠(yuǎn)程的數(shù)據(jù)時(shí),它將自動(dòng)改變。當(dāng)讀取該寄存器時(shí),用戶應(yīng)該首先讀取高字節(jié)(0xFE4026,0xFE4126,0xFE4226,0xFE4326,0xFE4426,0xFE4526,0xFE4626,0xFE4726),然后再讀低字節(jié)(0xFE4027,0xFE4127,0xFE4227,0xFE4327,0xFE4427,0xFE4527,0xFE4627, 0xFE4727),這樣才能夠得到正確的值。

例:S0_RX_RSR0的值為2048(0x0800)

0xFE40260xFE4027
0x080x00

這個(gè)值的總長度是由RX存儲(chǔ)器大小寄存器決定的。

Sn_RX_RD (SOCKET n RX接收存儲(chǔ)器讀指針寄存器)[R/W][(0xFE4028 + 0x100n) – (0xFE4029 + 0x100n)][0x0000]

該寄存器確定接收數(shù)據(jù)的讀取地址信息。當(dāng)讀取該寄存器時(shí)先讀高字節(jié) (0xFE4028,0xFE4128,0xFE4228,0xFE4328,0xFE4428,0xFE4528,0xFE4628,0xFE4728),然后再讀低字節(jié)(0xFE4029,0xFE4129,0xFE4229,0xFE4329,0xFE4429,0xFE4529,0xFE4629, 0xFE4729),這樣讀取的信息才正確。

例:S0_RX_RD02048的值為(0x0800)

0x04280x0429
0x080x00

但這個(gè)值不是實(shí)際要讀取的物理地址。實(shí)際的物理地址需要由下面的關(guān)系計(jì)算獲得:

1.由Sn_RXMEM_SIZE(n)獲得SOCKET n的RX存儲(chǔ)器的基地址(RBUFBASEADDRESS(n))和SOCKET n的RX掩碼地址(RMASK(n))。

2.將Sn_RX_RD0和RMASK(n)進(jìn)行’位與’運(yùn)算,得到SOCKET的RX存儲(chǔ)器地址范圍內(nèi)的偏移地址(src_mask)。

3.將src_mask和RBUFBASEADDRESS(n)相加得到實(shí)際要訪問的物理地址。

現(xiàn)在可以從src_ptr地址讀取接收的數(shù)據(jù)(有一種特殊情況要注意,讀取的地址超過了SOCKET的RX存儲(chǔ)器的上邊界,這時(shí)讀完上邊界地址的數(shù)據(jù)后,返回到RBUFBASEADDRESS(n)地址讀取剩余的數(shù)據(jù),如此循環(huán)訪問)。

完成操作后,Sn_RX_RD的值必須加上當(dāng)前讀取的字節(jié)數(shù)(一定不能超過你讀取的字節(jié)數(shù))。最后對(duì)Sn_CR命令寄存器寫入RECV命令,即完成操作。

更多詳細(xì)信息請(qǐng)參考TCP服務(wù)器模式下接收數(shù)據(jù)的源代碼。

Sn_RX_WR (SOCKET n RX接收存儲(chǔ)器寫指針寄存器)[R/W][(0xFE402A + 0x100n) – (0xFE402B + 0x100n)][0x0000]

它指示端口n內(nèi)部RX存儲(chǔ)器中接收數(shù)據(jù)的字節(jié)數(shù)。由于該值是由Sn_Rx_RD和Sn_Rx_WR在內(nèi)部計(jì)算得出的,對(duì)SOCKET n的命令寄存器(Sn_CR)寫入RECV命令且接收到遠(yuǎn)程的數(shù)據(jù)時(shí),它將自動(dòng)改變。當(dāng)讀取該寄存器時(shí),用戶應(yīng)該首先讀取高字節(jié)(0xFE4026,0xFE4126,0xFE4226,0xFE4326,0xFE4426,0xFE4526,0xFE4626,0xFE4726),然后再讀低字節(jié)(0xFE4027,0xFE4127,0xFE4227,0xFE4327,0xFE4427,0xFE4527,0xFE4627, 0xFE4727),這樣才能夠得到正確的值。

例:S0_RX_WR0的值為2048(0x0800)

0xFE402A0xFE402B
0x080x00

Sn_FRAG(SOCKET n分段寄存器)[R/W][(0xFE402D + 0x100n) – (0xFE402E + 0x100n)][0x4000]

該它設(shè)置IP層的IP包頭中的分段字段。W7100不支持IP層的分段。即使配置了Sn_FRAG,IP數(shù)據(jù)包也不能夠分段。它需要在OPEN命令之前設(shè)置該寄存器。

例:Sn_FRAG0 = 0x4000(不分段)

0xFE402D0xFE402E
0x400x00

9.功能描述

因?yàn)閃7100A內(nèi)部嵌入一個(gè)8051兼容的CPU內(nèi)核和硬件的TCP/IP內(nèi)核,它可以不需要其它

器件而獨(dú)立工作。在這一節(jié),將通過一些軟件源代碼,講解7100A的初始化和每一種協(xié)議(TCP、UDP、IP raw、MACRAW)的通信方法。

9.1初始化

W7100A的初始化分三個(gè)步驟:設(shè)置8051單片機(jī),網(wǎng)絡(luò)信息和內(nèi)部TX/RX存儲(chǔ)器。

l步驟1:初始化MCU

1.中斷設(shè)置

允許或禁止8051的中斷。詳細(xì)信息參考第3節(jié)”中斷”。

2.存儲(chǔ)器訪問時(shí)序設(shè)置

通過CKCON(0x8E)和WTST(0x92)寄存器來設(shè)置存儲(chǔ)器的訪問時(shí)序。CKCON(0x8E)控制數(shù)據(jù)存儲(chǔ)器的訪問時(shí)序,而WTSR(0x92)控制程序存儲(chǔ)器的訪問時(shí)序,設(shè)置值為0~7之間。但W7100A的CKCON可以設(shè)置的值為1~7,而WTST(0x92)的值只能是4~7,其它值都無效。如果用戶設(shè)置的值是一個(gè)無效值,W7100將不能夠正常工作。詳細(xì)信息請(qǐng)參考2.4節(jié)“SFR的定義”。

例:禁止中斷,訪問數(shù)據(jù)存儲(chǔ)器2個(gè)時(shí)鐘周期,訪問程序存儲(chǔ)器7個(gè)時(shí)鐘周期,設(shè)置如下:

3.串口通信波特率,寄存器和中斷的設(shè)置

1)設(shè)置W7100A串口通信的相關(guān)寄存器。

與串口相關(guān)的寄存器有:TMOD、PCON和SCON。

TMOD(89H):確定串口通信的定時(shí)器/計(jì)數(shù)器模式。

SM2:在模式2和模式3時(shí)使用。假設(shè)這位為’1’,如果接收到的第9位為’1’,則接收該數(shù)據(jù),如果第9位為’0’,則忽略該數(shù)據(jù)。

REN:接收允許(‘1’允許接收)。

TB8: 在模式2和模式3,發(fā)送的第8位數(shù)據(jù)位。

RB8: 在模式2和模式3,接收的第8位數(shù)據(jù)位。

TI:發(fā)送完成中斷。

RI:接收完成中斷

2)初始化串口通信時(shí)必須設(shè)置中斷狀態(tài)。

因?yàn)榇谕ㄐ攀褂弥袛?因此在初始化串口通信時(shí)用戶必須禁止其它相關(guān)的中斷。

3)設(shè)置用戶使用的波特率。請(qǐng)參考6.6節(jié)’波特率設(shè)置的實(shí)例’了解W7100用于產(chǎn)生波特率的定時(shí)器。定時(shí)器的波特率計(jì)算如下:

timer1計(jì)算公式

TH1 = 256 – ((K * 88.4736MHz) / (384 * 波特率))

K = ‘1’ at SMOD = ‘0’, K = ‘2’ at SMOD = ‘1’

timer2計(jì)算公式

(RCAP2H, RCAP2L) = 65536 – (88.4736MHz / (32 * 波特率))

例:使用Timer1的模式2,SMOD = 1,時(shí)鐘頻率 = 88.4736MHz,波特率 = 115200

  • 步驟2:設(shè)置網(wǎng)絡(luò)信息

1.網(wǎng)絡(luò)通信的基本信息

必須設(shè)置的網(wǎng)絡(luò)基本信息有:

(1)SHAR(源硬件地址寄存器)

源硬件地址由SHAR設(shè)置,必須說明的是在以太網(wǎng)MAC層的物理地址(MAC地址)一定是唯一的。IEEE管理MAC地址的分配。網(wǎng)絡(luò)設(shè)備的制造商給產(chǎn)品分配MAC地址。物理地址分配到詳細(xì)信息請(qǐng)參考下面網(wǎng)址:

http://www.ieee.org/,http://standards.ieee.org/regauth/oui/index.shtml

(2)GAR(網(wǎng)關(guān)地址寄存器)

(3)SUBR(子網(wǎng)掩碼寄存器)

(4)SIPR(源IP地址寄存器)

2.數(shù)據(jù)包發(fā)送失敗時(shí),設(shè)置重發(fā)時(shí)間和次數(shù)

為了設(shè)置重發(fā)時(shí)間,寄存器需要設(shè)置如下:

(1)RTR(重發(fā)時(shí)間寄存器),RTR的’1’代表’100us’。

(2)RCR(重發(fā)次數(shù)寄存器)

  • 步驟3:分配SOCKET n的內(nèi)部TX/RX存儲(chǔ)器

每一個(gè)可配置的TX/RX存儲(chǔ)器的最大長度為16K字節(jié)。在16K字節(jié)的范圍內(nèi),用戶可以將存儲(chǔ)器給8個(gè)SOCKET任意分配為1K、2K、4K、8K、16K字節(jié)。但是TX和RX存儲(chǔ)器的設(shè)置的總和不能超過16K字節(jié)。(TXMAX=16KB,RXMAX=16KB)

圖9.1 SOCKET n內(nèi)部TX/RX存儲(chǔ)器的分配

完成W7100A的這三步初始化,W7100A就可以通過以太網(wǎng)進(jìn)行數(shù)據(jù)傳輸。此時(shí),W7100A可以響應(yīng)來自于網(wǎng)絡(luò)的Ping請(qǐng)求。

9.2數(shù)據(jù)通信

初始化過程完成以后,W7100A就可以以TCP、UDP、IPRAW或MACRAW的模式打開SOCKET,并發(fā)送和接收數(shù)據(jù)。W7100A支持8個(gè)端口以不同的方式同時(shí)進(jìn)行工作。在這一節(jié)將介紹每一種方式的通信方法。

9.2.1TCP

TCP是一種面向連接的協(xié)議。TCP使用本機(jī)IP地址/端口號(hào)和目的IP地址/端口號(hào)產(chǎn)生連接。發(fā)送和接收數(shù)據(jù)都是通過這個(gè)連接的端SOCKET。

建立到SOCKET連接的方法是TCP服務(wù)器和TCP客戶端。它們的區(qū)別是誰主動(dòng)發(fā)出連接請(qǐng)求(SYN數(shù)據(jù)包)。

TCP服務(wù)器監(jiān)聽來自TCP客戶端的連接請(qǐng)求,接收發(fā)送的連接請(qǐng)求(被動(dòng)打開),并產(chǎn)生連接。

TCP客戶端發(fā)出連接請(qǐng)求到TCP服務(wù)器(主動(dòng)打開),并產(chǎn)生連接。

圖9.2 TCP服務(wù)器和TCP客戶端

9.2.1.1服務(wù)器

圖9.3 “TCP服務(wù)器”操作流程

  • SOCKET初始化

TCP數(shù)據(jù)通信需要對(duì)SOCKET進(jìn)行初始化設(shè)置。初始化過程首先選擇W7100A的一個(gè)SOCKET(從W7100A的8個(gè)SOCKET中),設(shè)置協(xié)議模式(Sn_MR(P3:P0))和設(shè)置源端口號(hào)Sn_PORT0(TCP服務(wù)器的監(jiān)聽端口號(hào))。然后運(yùn)行OPEN指令。執(zhí)行OPEN命令后如果端口的狀態(tài)Sn_SR改變?yōu)镾OCK_INIT,那么端口的初始化就完成了。

TCP服務(wù)器和TCP客戶端的端口初始化是完全相同的端口初始化為TCP模式的操作如下:

  • 建立連接

當(dāng)SOCKET的狀態(tài)Sn_SR為SOCK_LISTEN時(shí),如果它收到SYN數(shù)據(jù)包,Sn_SR的狀態(tài)將改變?yōu)镾OCK_SYNRECV,并發(fā)送一個(gè)SYN/ACK數(shù)據(jù)包,然后SOCKET n建立連接。SOCKET n建立連接以后才允許進(jìn)行數(shù)據(jù)通信。有兩種方法可以驗(yàn)證SOCKET n是否建立連接。

第一種方法:當(dāng)收到數(shù)據(jù)包時(shí),Sn_IR(RECV)置為1,如果主機(jī)在接收下一個(gè)數(shù)據(jù)包之前沒有置上一個(gè)Sn_IR(RECV)為’1’,那么W7100將不能夠識(shí)別下一個(gè)數(shù)據(jù)包的Sn_I(RECV),這是由于上一個(gè)Sn_IR(RECV)和后面的Sn_IR(RECV)重疊所致。因此,如果主機(jī)不能完全處理每一個(gè)Sn_IR(RECV)的數(shù)據(jù)包,則不推薦使用這種方法。



評(píng)論


技術(shù)專區(qū)

關(guān)閉