中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

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

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

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

        本文引用地址:http://www.antipu.com.cn/article/201611/315973.htm

        主要器件:

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

        2、74LS373地址鎖存器。

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

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

        試驗電路圖:



        試驗程度代碼:

        //Ethernet.h程序

        #ifndef_ETHERNET_H//防止Ethernet.h被重復引用

        #define_ETHERNET_H

        #include //引用標準庫的頭文件

        #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);//延時1s,保證電源穩(wěn)定和網(wǎng)卡自身的上電完成

        NICRst();// RTL8019AS熱復位

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

        RTL8019Init();//初始化RTL8019AS

        while(1)

        {

        ;

        }

        }

        /*延時t毫秒*/

        void delay(uint t)

        {

        uint i;

        while(t--)

        {

        /*對于12M時鐘,約延時1ms */

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

        {}

        }

        }

        /* RTL8019AS熱復位*/

        void NICRst()

        {

        uchar i,tmp;

        tmp = REG1f;//讀RTL8019AS的復位端口

        REG1f = tmp;//寫RTL8019AS的復位端口

        for(i=0;i<250;i++);//適當延時

        }

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

        void SelectPage(uchar pagenum)

        {

        uchar tmp;

        tmp = REG00;

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

        pagenum = pagenum<<6;

        tmp = tmp|pagenum;

        REG00 = tmp;

        }

        接上篇程序代碼:

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

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

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

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

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

        void RTL8019Init()

        {

        REG00 = 0x21;//選擇頁0的寄存器,網(wǎng)卡停止運行,因為還沒有初始化

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

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

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

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

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

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

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

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

        字節(jié)順序為高位字節(jié)在前,低位字節(jié)在后*/

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

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

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

        /*多址地址寄存器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;//選擇頁0寄存器,執(zhí)行命令。

        }

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

        void ClearISR()

        {

        SelectPage(0);

        REG07 = REG07|0xff;

        }

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

        void GetPhyAdd()

        {

        uchar tmp;

        SelectPage(0);//選擇頁0

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

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

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

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

        REG00 = 0x0a;//遠程DMA,啟動命令

        SelectPage(1);//選擇頁1

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

        REG01 = tmp;//寫入PAR0

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

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

        REG02 = tmp;//寫入PAR1

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

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

        REG03 = tmp;//寫入PAR2

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

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

        REG04 = tmp;//寫入PAR3

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

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

        REG05 = tmp;//寫入PAR4

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

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

        REG06 = tmp;//寫入PAR5

        }



        評論


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

        關(guān)閉