色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)實(shí)現(xiàn)以太網(wǎng)接口-基于RTL8019

          單片機(jī)實(shí)現(xiàn)以太網(wǎng)接口-基于RTL8019

          作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
          隨著互聯(lián)網(wǎng)的迅速發(fā)展,網(wǎng)絡(luò)用戶飛速增長(zhǎng),在使用計(jì)算機(jī)進(jìn)行網(wǎng)絡(luò)互聯(lián)的同時(shí),各種家電設(shè)備、儀表設(shè)備及工業(yè)中數(shù)據(jù)采集與控制設(shè)備也在逐步走向網(wǎng)絡(luò)化,基于此結(jié)合專用的以太網(wǎng)控制芯片RTL8019學(xué)習(xí)了利用單片機(jī)實(shí)現(xiàn)以太網(wǎng)接口的設(shè)計(jì)。

          本文引用地址:http://cafeforensic.com/article/201611/315973.htm

          主要器件:

          1、AT89C52單片機(jī)芯片,實(shí)現(xiàn)對(duì)RTL8019的初始化和輸入輸出控制。

          2、74LS373地址鎖存器。

          3、HM62256高速CMOS 8位32KB的RAM芯片。

          4、RTL8019AS高集成以太網(wǎng)控制器芯片。

          試驗(yàn)電路圖:



          試驗(yàn)程度代碼:

          //Ethernet.h程序

          #ifndef_ETHERNET_H//防止Ethernet.h被重復(fù)引用

          #define_ETHERNET_H

          #include //引用標(biāo)準(zhǔn)庫(kù)的頭文件

          #include

          #include

          #define uchar unsigned char

          #define uint unsigned int

          #define REG00 XBYTE[0x8000]//端口300H,命令寄存器CR

          #define REG01 XBYTE[0x8001]//端口301H

          #define REG02 XBYTE[0x8002]//端口302H

          #define REG03 XBYTE[0x8003]//端口303H

          #define REG04 XBYTE[0x8004]//端口304H

          #define REG05 XBYTE[0x8005]//端口305H

          #define REG06 XBYTE[0x8006]//端口306H

          #define REG07 XBYTE[0x8007]//端口307H

          #define REG08 XBYTE[0x8000]//端口308H

          #define REG09 XBYTE[0x8001]//端口309H

          #define REG0a XBYTE[0x800a]//端口30aH

          #define REG0b XBYTE[0x800b]//端口30bH

          #define REG0c XBYTE[0x800c]//端口30cH

          #define REG0d XBYTE[0x800d]//端口30dH

          #define REG0e XBYTE[0x800e]//端口30eH

          #define REG0f XBYTE[0x800f]//端口30fH

          #define REG10 XBYTE[0x8010]//端口310H

          #define REG11 XBYTE[0x8011]//端口311H

          #define REG12 XBYTE[0x8012]//端口312H

          #define REG13 XBYTE[0x8013]//端口313H

          #define REG14 XBYTE[0x8014]//端口314H

          #define REG15 XBYTE[0x8015]//端口315H

          #define REG16 XBYTE[0x8016]//端口316H

          #define REG17 XBYTE[0x8017]//端口317H

          #define REG18 XBYTE[0x8010]//端口318H

          #define REG19 XBYTE[0x8011]//端口319H

          #define REG1a XBYTE[0x801a]//端口31aH

          #define REG1b XBYTE[0x801b]//端口31bH

          #define REG1c XBYTE[0x801c]//端口31cH

          #define REG1d XBYTE[0x801d]//端口31dH

          #define REG1e XBYTE[0x801e]//端口31eH

          #define REG1f XBYTE[0x801f]//端口31fH

          void delay(uint t);

          void NICRst();

          void SelectPage(uchar pagenum);

          void ClearISR();

          void GetPhyAdd();

          void RTL8019Init();

          #endif

          //Ethernet.c程序

          #include "Ethernet.h"

          /*主函數(shù)*/

          void main(void)

          {

          delay(1000);//延時(shí)1s,保證電源穩(wěn)定和網(wǎng)卡自身的上電完成

          NICRst();// RTL8019AS熱復(fù)位

          ClearISR();//清除ISR寄存器

          RTL8019Init();//初始化RTL8019AS

          while(1)

          {

          ;

          }

          }

          /*延時(shí)t毫秒*/

          void delay(uint t)

          {

          uint i;

          while(t--)

          {

          /*對(duì)于12M時(shí)鐘,約延時(shí)1ms */

          for (i=0;i<125;i++)

          {}

          }

          }

          /* RTL8019AS熱復(fù)位*/

          void NICRst()

          {

          uchar i,tmp;

          tmp = REG1f;//讀RTL8019AS的復(fù)位端口

          REG1f = tmp;//寫RTL8019AS的復(fù)位端口

          for(i=0;i<250;i++);//適當(dāng)延時(shí)

          }

          /*通過CR寄存器的PS1和PS0設(shè)置寄存器頁(yè)*/

          void SelectPage(uchar pagenum)

          {

          uchar tmp;

          tmp = REG00;

          tmp = tmp&0x3B;//注意不是0x3F,TXP位在不發(fā)送時(shí)要置0

          pagenum = pagenum<<6;

          tmp = tmp|pagenum;

          REG00 = tmp;

          }

          接上篇程序代碼:

          /*初始化RTL8019AS,PAGE2寄存器只讀,PAGE3寄存器不是NE2000兼容的,均不用設(shè)置*/

          /*使用0x40-0x4b為網(wǎng)卡的發(fā)送緩沖區(qū),共12頁(yè),剛好存儲(chǔ)2個(gè)最大的以太網(wǎng)數(shù)據(jù)包。

          使用0x4c-0x7f為網(wǎng)卡的接收緩沖區(qū),共52頁(yè)。因此PSTART=0x4c,PSTOP=0x80

          (0x80為停止頁(yè),接收緩沖區(qū)直到0x7f,不包括0x80)。剛開始時(shí),網(wǎng)卡沒有接收

          到任何數(shù)據(jù)包,因此BNRY設(shè)置為指向第一個(gè)接收緩沖區(qū)的頁(yè)0x4c)*/

          void RTL8019Init()

          {

          REG00 = 0x21;//選擇頁(yè)0的寄存器,網(wǎng)卡停止運(yùn)行,因?yàn)檫€沒有初始化

          REG01 = 0x4c;//寄存器PSTART,設(shè)置接收緩沖區(qū)的起始頁(yè)的地址

          REG02 = 0x80;//寄存器PSTOP,設(shè)置接收緩沖區(qū)的結(jié)束頁(yè)的地址

          REG03 = 0x4c;//寄存器BNRY,設(shè)置為指向第一個(gè)接收緩沖區(qū)的頁(yè)0x4c(用作讀指針)

          REG04 = 0x40;//寄存器TPSR,發(fā)送起始頁(yè)地址初始化為指向第一個(gè)發(fā)送緩沖區(qū)的頁(yè)

          REG0c = 0xcc;/*接收配置寄存器RCR,設(shè)置為僅接收自己地址的數(shù)據(jù)包以及廣播地址

          和多點(diǎn)播送地址數(shù)據(jù)包,小于64字節(jié)的包丟棄,校驗(yàn)錯(cuò)的數(shù)據(jù)包不接收*/

          REG0d = 0xe0;//發(fā)送配置寄存器TCR,設(shè)置為啟用crc自動(dòng)生成和校驗(yàn),正常模式工作

          REG0e = 0xc8;/*數(shù)據(jù)配置寄存器DCR,設(shè)置為使用FIFO緩存,普通模式,8位數(shù)據(jù)傳輸,

          字節(jié)順序?yàn)楦呶蛔止?jié)在前,低位字節(jié)在后*/

          REG0f = 0x00;//中斷屏蔽寄存器IMR,設(shè)置為屏蔽所有中斷

          SelectPage(1);//選擇頁(yè)1的寄存器

          REG07=0x4d;//寄存器CURR,設(shè)置為指向當(dāng)前正在寫的頁(yè)的下一頁(yè)(用作寫指針)

          /*多址地址寄存器MAR0-MAR7均設(shè)置為0x00 */

          REG08 = 0x00;// MAR0

          REG09 = 0x00;// MAR1

          REG0a = 0x00;// MAR2

          REG0b = 0x80;// MAR3

          REG0c = 0x00;// MAR4

          REG0d = 0x00;// MAR5

          REG0e = 0x00;// MAR6

          REG0f = 0x00;// MAR7

          GetPhyAdd();//獲取以太網(wǎng)物理地址

          REG00 = 0x22;//選擇頁(yè)0寄存器,執(zhí)行命令。

          }

          /*上電后清除ISR寄存器*/

          void ClearISR()

          {

          SelectPage(0);

          REG07 = REG07|0xff;

          }

          /*獲取以太網(wǎng)物理地址*/

          void GetPhyAdd()

          {

          uchar tmp;

          SelectPage(0);//選擇頁(yè)0

          REG08 = 0;//遠(yuǎn)程DMA起始地址低位寄存器RSAR0,設(shè)置為0

          REG09 = 0;//遠(yuǎn)程DMA起始地址高位寄存器RSAR1,設(shè)置為0

          REG0a = 12;//遠(yuǎn)程DMA計(jì)數(shù)器低位寄存器RBCR0,設(shè)置為12

          REG0b = 0;//遠(yuǎn)程DMA計(jì)數(shù)器高位寄存器RBCR1,設(shè)置為0

          REG00 = 0x0a;//遠(yuǎn)程DMA,啟動(dòng)命令

          SelectPage(1);//選擇頁(yè)1

          tmp = REG10;//讀取一個(gè)字節(jié)

          REG01 = tmp;//寫入PAR0

          tmp = REG10;//讀取一個(gè)重復(fù)的字節(jié),這個(gè)字節(jié)被丟棄

          tmp = REG10;//讀取一個(gè)字節(jié)

          REG02 = tmp;//寫入PAR1

          tmp = REG10;//讀取一個(gè)重復(fù)的字節(jié),這個(gè)字節(jié)被丟棄

          tmp = REG10;//讀取一個(gè)字節(jié)

          REG03 = tmp;//寫入PAR2

          tmp = REG10;//讀取一個(gè)重復(fù)的字節(jié),這個(gè)字節(jié)被丟棄

          tmp = REG10;//讀取一個(gè)字節(jié)

          REG04 = tmp;//寫入PAR3

          tmp = REG10;//讀取一個(gè)重復(fù)的字節(jié),這個(gè)字節(jié)被丟棄

          tmp = REG10;//讀取一個(gè)字節(jié)

          REG05 = tmp;//寫入PAR4

          tmp = REG10;//讀取一個(gè)重復(fù)的字節(jié),這個(gè)字節(jié)被丟棄

          tmp = REG10;//讀取一個(gè)字節(jié)

          REG06 = tmp;//寫入PAR5

          }



          評(píng)論


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

          關(guān)閉