<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時(shí)間:2016-11-26 來(lái)源:網(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ǔ)器可使用的空間大小(可寫(xiě)入的傳輸數(shù)據(jù)的字節(jié)數(shù))。主機(jī)不能寫(xiě)入比Sn_TX_FSR更多的數(shù)據(jù)到TX存儲(chǔ)器。因此 , 在向TX存儲(chǔ)器寫(xiě)入發(fā)送數(shù)據(jù)前檢查Sn_TX_FSR,如果要寫(xiě)入的數(shù)據(jù)字節(jié)數(shù)小于或等于Sn_TX_FSR,才可以寫(xiě)入數(shù)據(jù)到TX存儲(chǔ)器然后用SEND或SEND_MAC命令發(fā)送。

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

          例: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的命令控制寄存器寫(xiě)入SEND命令,它將從當(dāng)前的Sn_TX_RD地址開(kāi)始傳輸數(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ǔ)器寫(xiě)指針寄存器)[R/W][(0xFE4024 + 0x100n) – (0xFE4025 + 0x100n)][0x0000]

          該寄存器提供定位信息,指示數(shù)據(jù)應(yīng)該寫(xiě)入到什么位置。讀取該寄存器時(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è)值本身不是可以直接訪(fǎng)問(wèn)的物理地址。實(shí)際訪(fǎng)問(wèn)的物理地址計(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í)際訪(fǎng)問(wèn)的物理地址(dst_ptr)?,F(xiàn)在可以將需要傳輸?shù)臄?shù)據(jù)寫(xiě)到dst_ptr。(*有一種情況需要注意,寫(xiě)入數(shù)據(jù)時(shí)可能會(huì)超過(guò)端口n的TX存儲(chǔ)器的上界。這時(shí)將數(shù)據(jù)寫(xiě)入上邊界地址后,再?gòu)腟BUFBASEADDRESS(n)開(kāi)始寫(xiě)入剩余的數(shù)據(jù),如此循環(huán)寫(xiě)入操作。)

          操作完成后,Sn_TX_WR的值必須加上當(dāng)前寫(xiě)入數(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ù)長(zhǎng)度寄存器)[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)寫(xiě)入RECV命令且接收到遠(yuǎn)程的數(shù)據(jù)時(shí),它將自動(dòng)改變。當(dāng)讀取該寄存器時(shí),用戶(hù)應(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è)值的總長(zhǎng)度是由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í)際要訪(fǎng)問(wèn)的物理地址。

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

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

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

          Sn_RX_WR (SOCKET n RX接收存儲(chǔ)器寫(xiě)指針寄存器)[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)寫(xiě)入RECV命令且接收到遠(yuǎn)程的數(shù)據(jù)時(shí),它將自動(dòng)改變。當(dāng)讀取該寄存器時(shí),用戶(hù)應(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é),將通過(guò)一些軟件源代碼,講解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ǔ)器訪(fǎng)問(wèn)時(shí)序設(shè)置

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

          例:禁止中斷,訪(fǎng)問(wèn)數(shù)據(jù)存儲(chǔ)器2個(gè)時(shí)鐘周期,訪(fǎng)問(wèn)程序存儲(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í)用戶(hù)必須禁止其它相關(guān)的中斷。

          3)設(shè)置用戶(hù)使用的波特率。請(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è)置,必須說(shuō)明的是在以太網(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ǔ)器的最大長(zhǎng)度為16K字節(jié)。在16K字節(jié)的范圍內(nèi),用戶(hù)可以將存儲(chǔ)器給8個(gè)SOCKET任意分配為1K、2K、4K、8K、16K字節(jié)。但是TX和RX存儲(chǔ)器的設(shè)置的總和不能超過(guò)16K字節(jié)。(TXMAX=16KB,RXMAX=16KB)

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

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

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

          初始化過(guò)程完成以后,W7100A就可以以TCP、UDP、IPRAW或MACRAW的模式打開(kāi)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ù)都是通過(guò)這個(gè)連接的端SOCKET。

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

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

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

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

          9.2.1.1服務(wù)器

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

          • SOCKET初始化

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

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

          • 建立連接

          當(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ù)包之前沒(méi)有置上一個(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ù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();