在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(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://www.biyoush.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)庫的頭文件

            #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è)置寄存器頁*/

            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頁,剛好存儲(chǔ)2個(gè)最大的以太網(wǎng)數(shù)據(jù)包。

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

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

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

            void RTL8019Init()

            {

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

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

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

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

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

            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);//選擇頁1的寄存器

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

            /*多址地址寄存器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;//遠(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);//選擇頁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)閉