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

正文內容

51單片機rtl8019上網編程指南-資料下載頁

2025-01-07 11:25本頁面
  

【正文】 單片機的總線要比網卡的 DMA總線慢很多 .網卡的 DMA總線大概在 10Mhz,而單片機的總線Kingant 金安特自動識別研發(fā)中心 34 大概 Remote DMA的過程中不需要特別的等待時序 . 但是如果使用較快的 CPU,比如 DSP,ARM 等 ,可能要考慮時序問題 .也就是說 IOCHRDY(ISA總線的一個信號 ,RTL8019AS),或者 TRDY(PCI 總線的信號 RTL8029AS) ,是需要考慮連到 CPU上 ,或者做一定的處理 . 那么對于不快也不慢的 AVR 單片機來說 ,要不要接 IOCHRDY?估計是要的 .因為我不提供avr 的上網方案 ,所以也沒有做太多的研究 .對于 77E58 來說可以不接 IOCHRDY,因為 77E58 可以內部設置外部 ram的存取的速度 . DMA 有 8 位和 16 位兩種 .網卡支持這兩種 DMA,一般我們使用 8 位的 DMA,8 位的 DMA 的接線比較少 ,同時適合單片機處理 .電腦里一般使用 16位 DMA. 有人問到在電腦里如何使用 8位的 DMA的問題 .有些卡自動檢測總線上的 IOCS16B來選擇總線 ,比如 RTL8019as,我試過 RTL8019as 使用 8 位 DMA 在電腦里是失敗的 .如果真的要在電腦里使用 8 位的 DMA,要把該引腳 IOCS16B 斷開 (可以割斷 ),而不連到 ISA 總線上 ,這樣這些網卡會自動的進行 8位的操作 (地址譯碼為 10位 ). 對于使用 DM9008 芯片的網卡, 16位 DMA傳輸是由 SLOT引腳決定的。我試過把 DM9008的IOCS16B 引腳與 ISA槽斷開(通過貼“透明膠”的方法),配套的設置程序檢查時死機。如果想 DM9008 使用 8位 DMA操作,應該把 SLOT引腳割斷,而不是 IOCS16B。 在 DSP里可以使用 16 位的 DMA. 因為不同的單片機 (CPU),代碼可能不同 ,我在下面將用幾種表示法來論述 : 假設用到的 I/O地址為 0xC000,讀出到 temp 變量或寫 temp到寄存器 ,temp為 8位變量 : 通用的 RTL8019 C程序 (mcs51) RTL8019 匯編的程序(mcs51) temp=read_register(address) 讀寄存器函數 temp=reg00。 MOV DPTR,address MOVX A,@DPTR MOV temp,A write_register(address,temp) 寫寄存器函數 reg00=temp。 MOV temp,A MOV DPTR,address MOVX @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) 上面的表達式中 ,根據你的地址或尋址方法而選擇 unsigned int address 或 unsigned char address. 上表給出了用 c語言或匯編語言或其他語言的表達的等價的程序 . 下面給出用 51單片機的 c語言程序 : define reg00 XBYTE[0xc000] //reg00 10為 isa網卡接口的寄存器地址 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] Kingant 金安特自動識別研發(fā)中心 35 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。//需要讀或寫的字節(jié)數 unsigned int i。 //DCR=0xc8。要配置 DCR為 8位的 dma . void write_dma(unsigned int address,unsigned int count) //寫網卡的 ram {//address為要寫入到網卡里的 ram的起始地址 ,count為要連續(xù)寫入的字節(jié)數 page(0)。 reg09=address8。//address high reg08=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 low reg00=0x22。//abort/plete dma page 0 } 執(zhí)行的結果是將 buffer數組的內容被寫入到網卡的起始 ram地址 address 的一段 ram里 . 程序當中的最后 3句 : reg0b=0。 // count high reg0a=0。// count low reg00=0x22。//abort/plete dma page 0 可以不要 ,但推薦使用 ,以便發(fā)生錯誤的時候能夠正確的退出 DMA 傳輸 ,3 句是中止 DMA 的代碼 .在電腦里死機是很 正常 的 ,而在單片機里 死機 是大事 ,所以要考慮更多 ,一旦 時序配合有問題 ,DMA就可能發(fā)生錯誤 ,提供發(fā)生錯誤時的恢復是有必要的 . . void read_dma(unsigned int address,unsigned int count) //讀網卡 ram {//address為網卡里的 ram 的起始地址 ,count為要連續(xù)讀取的字節(jié)數 page(0)。 reg09=address8。//address high Kingant 金安特自動識別研發(fā)中心 36 reg08=addressamp。0xff。//address low reg0b=count8。 //write count high reg0a=countamp。0xff。//write count low reg00=0x0a 。//dma read for(i=0。icount。i++) { buffer[i]=reg10。 } reg0b=0。 // count high 中止 DMA操作 reg0a=0。// count low reg00=0x22。//abort/plete dma page 0 } 執(zhí)行的結果是將網卡里的起始地址為 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 里的函數的 i/o 替換成模擬 i/o 的函數就可以了 ,舉例如下 : 將 define reg10 0xd0 reg10=buffer[i] 。替換為 write_register(reg10,buffer[i])。 buffer[i]=reg10 。替換為 buffer[i]=read_register(reg10)。 Kingant 金安特自動識別研發(fā)中心 37 其他 reg0a,reg0b 等也是做類似的替換 . 建議不要使用模擬 i/o,因為速度慢 ,同時也不可靠 .模擬 i/o 中一般要關閉中斷 . 因為如果不關閉中斷 ,會引起被中斷 ,使讀或寫寄存器的時間變得很長 .盡管 DMA 有優(yōu)先級 ,但是如果read 或 write 線一直處于低電平的時候 ,能否被 Local DMA 中斷 ,我是持有疑問的 . 網卡有 8字節(jié)的 FIFO,假設在單片機讀寫網卡 ram 的同時 ,網卡收到一個數據包 ,那么 FIFO 最多可以存儲 64個 bit就必須啟動 Local DMA寫網卡 ram,網卡的速率為 10,000,000bit/秒 ,64個 bit的時間為 . 單片機讀寫一個字節(jié)的網卡 ram的時間最好不要超過 .所以關閉中斷以盡快執(zhí)行 i/o 操作 .雖然資料上沒有說是否可以超過 微秒 .有興趣的可以做實驗看是否一個很慢的 read,write會不會影響網卡收數據包 . 有時候我們不要相信資料 .比如有些單片機書對 MOVX 指令的時序圖就有誤 .RTL8019AS關于溢出時網卡不會覆蓋以前接收的數據包的論述也是有誤的 . 盡信書不如無書 .實踐是檢驗真理的唯一標準 .就像 資料說 DM9008說支持 8位 DMA一樣 ,我以前在電腦里試過 ,怎么也不行 ,用單片機的時候就可以 .網卡并不是為單片機設計的,有些在電腦里不會出現的問題在單片機里可能碰到 . . 有些客戶用 dsp,或者在電腦里驅動 如果采用 16 位的 dma(有些客戶用 dsp,或者在電腦里驅動 ,16 位的 dma 要求有 16 條數據線的 CPU,不能用在 51 單片機 ),那么也給出大家參考 : //DCR=0xC9。//配置成 16位 dma. unsigned int buffer[768]。//注意用 int的數組 void write_dma(unsigned int address,unsigned int count)//寫網卡的 ram {//address為要寫入到網卡里的 ram的起始地址 ,count為要連續(xù)寫入的字節(jié)數 page(0)。 reg09=address8。//address high reg08=addressamp。0xff。//address low reg0b=count8。 //write count high reg0a=countamp。0xff。//write count low reg00=0x12 。//dma write count=(count+1) /2。 for(i=0。icount。i++) { reg10=buffer[i]。 } reg0b=0。 // count high 中止 DMA操作 reg0a=0。// count low reg00=0x22。//abort/plete dma page 0 } void read_dma(unsigned int address,unsigned int count)//讀網卡 ram {//address為網卡里的 ram 的起始地址 ,count為要連續(xù)讀取的字節(jié)數 page(0)。 reg09=address8。//address high reg08=addressamp。0xff。//address low reg0b=count8。 //write count high reg0a=countamp。0xff。//write count low reg00=0x0a 。//dma read count=(count+1) /2。 Ki
點擊復制文檔內容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1