freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

單片機與tcpip老古-資料下載頁

2025-06-26 03:55本頁面
  

【正文】 =CURR1頁,  例如:CURR=0x4dBNRY=0x4c  要注意的是:如果CURR=0x4c(第一個接收頁)那么BNRY=0x7f(最后一個接收頁)  寫成語言就是:  BNRY=CURR1?! f(BNRY0x4c)BNRY=0x7f。 這就是兩者的初始化的關系式.  初始化CURR=0x4d,表示第一個收到的數(shù)據(jù)包將存放在0x4d00地址開始的緩沖區(qū).初始化CURR=0x4c,表示第一個收到的數(shù)據(jù)包將存放在0x4c00地址開始的緩沖區(qū).CURR只初始化一次,以后都不用再去修改它.  我的設置是CURR=0x4d.  網(wǎng)卡收到一個數(shù)據(jù)包,假如是一個短數(shù)據(jù)包,只要一頁就可以存儲的,那么這時候+1=0x4e.  假如需要兩頁來存儲,那么CURR將等于0x4d+2=0x4f如果CURR等于結(jié)束頁PSTOP,也就是CURR0x7f時,CURR將被重置成等于PSTART=0x4c..  網(wǎng)卡存儲一定是按頁存儲,不滿一頁,也使用一頁,下一包將用下一頁開始存儲.   舉個例子。CURR=0x4fBNRY=0x4e  這時收到一個數(shù)據(jù)包這是一個典型的ARP應答包,數(shù)據(jù)包發(fā)往52:54:ab:3d:8e:2c,發(fā)送者的網(wǎng)卡地址為00:d0:09:68:f7:1e ,類型為0806假設我的網(wǎng)卡地址是52:54:ab:3d:8e:2c,那么可以收到該包這時CURR=0x50BNRY=0x4e   那么收到一包之后BNRY=CURR2,而不是BNRY=CURR1,也就是說兩個指針差了兩頁, , BNRY 兩個指針差2頁或2頁以上時,表示網(wǎng)卡收到新的數(shù)據(jù)包.(檢查是否有新的數(shù)據(jù)包要用到這個關系,沒有新的數(shù)據(jù)包時,兩者指針只差一頁). ,數(shù)據(jù)包只有60個字節(jié)的數(shù)據(jù),那么網(wǎng)卡將用CURR指向的頁0x4f來存儲該包數(shù)據(jù).  存儲內(nèi)容如下:0x4f00:015040005254AB3D8E2C00D00968F71E0x4f10:0806000108000604000200D00968F71E0x4f20:C0A800015254AB3D8E2CC0A8000700000x4f30:000000000000000000000000000000000x4f40:492E24C8  我們可以看到前面和后面都加了一些東西,中間的才是數(shù)據(jù).  共加了8個字節(jié)的內(nèi)容(共用了68個字節(jié)).   那么前面的4個字節(jié)的含義為:  前面的4個字節(jié)為:01504000  第一個字節(jié)0x01為接收的狀態(tài),也就是RSR(接收狀態(tài)寄存器的值)  該字節(jié)Receive Status含義:  那么根據(jù)上面的標志位的定義,0x01=0000 0001B,也就是標志位PRX=1 ,表示這個數(shù)據(jù)包接收良好,=0,=0,表示這不是廣播數(shù)據(jù)包.  第2個字節(jié)0x50 Next Packet Pointer,是一個指針,=0x50.  ,要注意的是長度的高位和低位是顛倒的:Receive Byte Count1=0x00Receive Byte Count0=0x40  長度應該是0x0040=,4字節(jié)校驗.   最后面的4個字節(jié) 492E24C8就是CRC校驗碼.(5)RTL8019AS,RTL8029AS如何讀寫網(wǎng)卡的RAM要接收和發(fā)送數(shù)據(jù)包都必須讀寫網(wǎng)卡的內(nèi)部的16k的ram,一套總線A是網(wǎng)卡控制器讀/寫網(wǎng)卡上的ram,另一套總線B是單片機讀/ DMA,總線B又叫Remote DMA.  上圖中虛線框住的部分為Remote DMA,也就是單片機對網(wǎng)卡ram進行讀寫的總線,(左邊的部分),就是Local DMA,網(wǎng)卡控制器對網(wǎng)卡ram進行讀寫的總線.其中的地址總線沒有畫出來,而不互相沖突.網(wǎng)卡控制器讀寫網(wǎng)卡ram(Local DMA): DMA優(yōu)先獲得控制權(quán). DMA可以中斷Remote DMA,而Remote DMA不能中斷Local DMA DMA,也就是單片機對網(wǎng)卡ram讀寫的過程進行中可以被Local DMA中斷,Local DMA中斷Remote DMA,然后進行Local DMA的數(shù)據(jù)傳輸,Local DMA傳輸完畢之后繼續(xù)剛才被中斷的Remote DMA,以完成Remote DMA的傳輸.   上圖中的Remote就是Remote DMA的傳輸,Local burst就是Local DMA被Local DMA是等到Local ,FT0(是DCR配置寄存器的位)  , DMA的過程中不需要特別的等待時序.但是如果使用較快的CPU,比如DSP,ARM等,(ISA總線的一個信號,RTL8019AS),或者TRDY(PCI總線的信號 RTL8029AS) ,是需要考慮連到CPU上,或者做一定的處理.那么對于不快也不慢的AVR單片機來說,要不要接IOCHRDY?,因為77E58可以內(nèi)部設置外部ram的存取的速度.,一般我們使用8位的DMA,8位的DMA的接線比較少,.,比如RTL8019as,要把該引腳IOCS16B斷開(可以割斷),而不連到ISA總線上,這樣這些網(wǎng)卡會自動的進行8位的操作(地址譯碼為10位).對于使用DM9008芯片的網(wǎng)卡,16位DMA傳輸是由SLOT引腳決定的。我試過把DM9008的IOCS16B引腳與ISA槽斷開(通過貼“透明膠”的方法),配套的設置程序檢查時死機。如果想DM9008使用8位DMA操作,應該把SLOT引腳割斷,而不是IOCS16B。 在DSP里可以使用16位的DMA.  因為不同的單片機(CPU),代碼可能不同,我在下面將用幾種表示法來論述:假設用到的I/O地址為0xC000,讀出到temp變量或?qū)憈emp到寄存器,temp為8位變量: 通用的RTL8019 C程序(mcs51)RTL8019 匯編的程序(mcs51)temp=read_register(address)讀寄存器函數(shù)temp=reg00。MOV DPTR,addressMOVX A,@DPTRMOV temp,Awrite_register(address,temp)寫寄存器函數(shù)reg00=temp。MOV temp,AMOV DPTR,addressMOVX @DPTR,A注:define reg00 XBYTE[0xc000] 注:address equ 0C000H通用的表達式:void write_register(unsigned char address,unsigned char value)或void write_register(unsigned int address,unsigned char value)unsigned char read_register(unsigned char address)或unsigned char read_register(unsigned int address)上面的表達式中,根據(jù)你的地址或?qū)ぶ贩椒ǘx擇unsigned int address或unsigned char address.上表給出了用c語言或匯編語言或其他語言的表達的等價的程序.下面給出用51單片機的c語言程序:define reg00 XBYTE[0xc000] //reg00 10為isa網(wǎng)卡接口的寄存器地址240250; define reg01 XBYTE[0xc100] define reg02 XBYTE[0xc200] define reg03 XBYTE[0xc300] define reg04 XBYTE[0xc400] define reg05 XBYTE[0xc500] define reg06 XBYTE[0xc600] define reg07 XBYTE[0xc700] define reg08 XBYTE[0xc800] define reg09 XBYTE[0xc900] define reg0a XBYTE[0xca00] define reg0b XBYTE[0xcb00] define reg0c XBYTE[0xcc00] define reg0d XBYTE[0xcd00] define reg0e XBYTE[0xce00] define reg0f XBYTE[0xcf00] define reg10 XBYTE[0xd000]xdata unsigned char buffer[1536]。//緩沖區(qū),放在外部ram.unsigned int count。//需要讀或?qū)懙淖止?jié)數(shù)unsigned int i。//DCR=0xc8。要配置DCR為8位的dmavoid write_dma(unsigned int address,unsigned int count)//寫網(wǎng)卡的ram{//address為要寫入到網(wǎng)卡里的ram的起始地址,count為要連續(xù)寫入的字節(jié)數(shù)page(0)。reg09=address8。//address highreg08=addressamp。0xff。//address low reg0b=count8。 //write count high reg0a=countamp。0xff。//write count low reg00=0x12 。//dma write for(i=0。icount。i++){reg10=buffer[i]。}reg0b=0。 // count high 中止DMA操作 reg0a=0。// count lowreg00=0x22。//abort/plete dma page 0 }執(zhí)行的結(jié)果是將buffer數(shù)組的內(nèi)容被寫入到網(wǎng)卡的起始ram地址address的一段ram里. 程序當中的最后3句:reg0b=0。 // count high reg0a=0。// count lowreg00=0x22。//abort/plete dma page 0 可以不要,但推薦使用,以便發(fā)生錯誤的時候能夠正確的退出DMA傳輸,正常的,而在單片機里死機是大事,所以要考慮更多,一旦時序配合有問題,DMA就可能發(fā)生錯誤,提供發(fā)生錯誤時的恢復是有必要的.void read_dma(unsigned int address,unsigned int count)//讀網(wǎng)卡ram{//address為網(wǎng)卡里的ram的起始地址,count為要連續(xù)讀取的字節(jié)數(shù)page(0)。reg09=address8。//address highreg08=addressamp。0xff。//address low reg0b=count8。 //write count high reg0a=countamp。0xff。//write count low reg00=0x0a 。//dma readfor(i=0。icount。i++){buffer[i]=reg10。}reg0b=0。 // count high 中止DMA操作 reg0a=0。// count lowreg00=0x22。//abort/plete dma page 0 } 執(zhí)行的結(jié)果是將網(wǎng)卡里的起始地址為address的共count個字節(jié)讀入到buffer[i]里.如果是使用模擬i/o,程序如下:unsigned char read_register(unsigned char address){//讀寄存器unsigned char temp。ea=0。//關閉中斷是推薦的p2=address。p0=0xff。 //這句不能省略read=0。temp=p0。read=1。//read為單片機的讀引腳ea=1。 return(temp)。 } void write_register(unsigned char address,unsigned char value){//寫寄存器ea=0。p2=address。p0=value。 write=0。//write為單片機的寫引腳write=1。p0=0xff。 //這句也是需要的.ea=1。 }那么我給出的read_dma,write_dma里的函數(shù)的i/o替換成模擬i/o的函數(shù)就可以了,舉例如下:將define reg10 0xd0reg10=buffer[i] 。替換為write_register(reg10,buffer[i])。buffer[i]=reg10 。替換為buffer[i]=read_register(reg10)。 其他reg0a,reg0b等也是做類似的替換. 建議不要使用模擬i/o,因為速度慢,會引起被中斷,但是如果read或write線一直處于低電平的時候,能否被Local DMA中斷,我是持有疑問的. 網(wǎng)卡有8字節(jié)的FIFO,假設在單片機讀寫網(wǎng)卡ram的同時,網(wǎng)卡收到一個數(shù)據(jù)包,那么FIFO最多可以存儲64個bit就必須啟動Local DMA寫網(wǎng)卡ram,網(wǎng)卡的速率為10,000,000bit/秒,. ,write會不會影響網(wǎng)卡收數(shù)據(jù)包.. 盡信書不如無書.實踐是檢驗真理的唯一標準.就像資料說DM9008說支持8位DMA一樣,我以前在電腦里試過,怎么也不行,,有些在電腦里不會出現(xiàn)的問題在單片機里可能碰到.如果采用16位的dma(有些客戶用dsp,或者在電腦里驅(qū)動,16位的dma要求有16條數(shù)據(jù)線的CPU,不能用在51單片機),那么也給出大家參考://DCR=0xC9。//配置成16位dma.unsigned int buffer[768]。//注意用int的數(shù)組void write_dma(unsigned int address,unsigned int count)//寫網(wǎng)卡的ram{//address為要寫入到網(wǎng)卡里的ram的起始地址,c
點擊復制文檔內(nèi)容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1