⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eth.lst

📁 单片机控制RTL8019AS的程序,C语言编写,仿真通过.
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   ETH                                                                   10/09/2006 21:51:54 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE ETH
OBJECT MODULE PLACED IN eth.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE eth.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //-----------------------------------------------------------------------------
   2          // Net ETH.C
   3          //
   4          // This module is the Ethernet layer
   5          //-----------------------------------------------------------------------------
   6          #include <string.h>
   7          #include <stdlib.h>
   8          #include <general.h>
   9          #include <absacc.h>
  10          
  11          
  12          #define reg00   XBYTE[0x8000]   //reg00- 10为isa网卡接口的寄存器地址300-310;
  13          #define reg01   XBYTE[0x8001]
  14          #define reg02   XBYTE[0x8002]
  15          #define reg03   XBYTE[0x8003]
  16          #define reg04   XBYTE[0x8004]
  17          #define reg05   XBYTE[0x8005]
  18          #define reg06   XBYTE[0x8006]
  19          #define reg07   XBYTE[0x8007]
  20          #define reg08   XBYTE[0x8008]
  21          #define reg09   XBYTE[0x8009]
  22          #define reg0a   XBYTE[0x800a]
  23          #define reg0b   XBYTE[0x800b]
  24          #define reg0c   XBYTE[0x800c]
  25          #define reg0d   XBYTE[0x800d]
  26          #define reg0e   XBYTE[0x800e]
  27          #define reg0f   XBYTE[0x800f]
  28          #define reg10   XBYTE[0x8010]
  29          
  30          bit txd_buffer_select=0;                //选择网卡的发送缓冲区  
  31          extern UCHAR xdata arpbuf[];
  32          extern UCHAR code my_hwaddr[]; 
  33          
  34          void Delay1ms(unsigned char T);
  35          
  36          extern UCHAR idata rcve_buf_allocated;
  37          extern UINT volatile event_word;
  38          
  39          
  40          sbit P16=P1^6;
  41          
  42          //------------------------------------------------------------------------
  43          // Initialize the Cirrus Logic 8019 chip
  44          //------------------------------------------------------------------------
  45          
  46          void page(unsigned char pagenumber)
  47          {
  48   1              unsigned char data temp;
  49   1              temp=reg00;             
  50   1              temp=temp&0x3B ;
  51   1              pagenumber=pagenumber <<6;
  52   1              temp=temp | pagenumber;
  53   1              reg00=temp;
  54   1      }
  55          
C51 COMPILER V7.06   ETH                                                                   10/09/2006 21:51:54 PAGE 2   

  56          void Rtl8019AS_Reset(void) //复位网卡
  57          {
  58   1              P16=1;  
  59   1              Delay1ms(200);
  60   1              P16=0;
  61   1              Delay1ms(200);
  62   1      }
  63          
  64          
  65          
  66          void WriteRtl8019NodeID()
  67          {
  68   1              page(1);
  69   1              reg01=my_hwaddr[0];
  70   1              reg02=my_hwaddr[1];
  71   1              reg03=my_hwaddr[2];
  72   1              reg04=my_hwaddr[3];
  73   1              reg05=my_hwaddr[4];
  74   1              reg06=my_hwaddr[5];
  75   1              page(0);
  76   1      }
  77          
  78          void init_8019(void)
  79          {
  80   1              Delay1ms(10);
  81   1              Rtl8019AS_Reset();              //复位8019
  82   1              reg00=0x21;                             //使芯片处于停止模式,这时进行寄存器设置 停止模式下,将不会发送和接收数据包
  83   1              Delay1ms(10);                   //延时10毫秒,确保芯片进入停止模式
  84   1              page(0);
  85   1              reg0a=0x00;     reg0b=0x00;
  86   1              reg0c= 0xe0;                    //monitor mode (no packet receive)
  87   1              reg0d= 0xe2;                    //loop back mode 使芯片处于mon和loopback模式,跟外部网络断开  
  88   1              reg01=0x4c;     reg02=0x80;     reg03=0x4c;     reg04=0x40;
  89   1              reg07=0xff;                             //清除所有中断标志位
  90   1              reg0f=0x00;                             //disable all interrupt
  91   1              reg0e=0xc8;                             //byte dma 8位dma方式
  92   1              page(1);
  93   1              reg07=0x4d;     reg08=0x00;     reg09=0x00;     reg0a=0x00;     reg0b=0x00;     
  94   1              reg0c=0x00;     reg0d=0x00;     reg0e=0x00;     reg0f=0x00;
  95   1              reg00=0x22;                             //这时让芯片开始工作 
  96   1              WriteRtl8019NodeID();   //将网卡地址写入到mar寄存器  
  97   1              page(0);
  98   1              reg0c=0xcc;                             //将网卡设置成正常的模式,跟外部网络连接
  99   1              reg0d=0xe0;
 100   1              reg00=0x22;                             //这时让芯片开始工作
 101   1              reg07=0xff;                             //清除所有中断标志位
 102   1      }
 103          
 104          //------------------------------------------------------------------------
 105          // This functions checks 8019 status then sends an ethernet
 106          // frame to it by calling an assembler function. 
 107          //------------------------------------------------------------------------
 108          
 109          void send_frame(UCHAR xdata * outbuf, UINT len)/*发送一个数据包的命令,长度最小为60字节,最大1514字节*/
 110          {
 111   1      UCHAR i;
 112   1      UINT ii;
 113   1              page(0);
 114   1              if(len<60)len=60;
 115   1              txd_buffer_select=!txd_buffer_select;
 116   1              if      (txd_buffer_select)
 117   1                      reg09=0x40 ;    //txdwrite highaddress
C51 COMPILER V7.06   ETH                                                                   10/09/2006 21:51:54 PAGE 3   

 118   1              else
 119   1              reg09=0x46 ;    //txdwrite highaddress
 120   1              reg08=0x00;             //read page address low
 121   1              reg0b=len>>8;           //read count high
 122   1              reg0a=len&0xff;         //read count low;
 123   1              reg00=0x12;                     //write dma, page0
 124   1              for     (ii=0;ii<len;ii++)      
 125   1              {
 126   2                 reg10=*(outbuf+ii);  
 127   2              }
 128   1      
 129   1              /* 以下3句为中止dma的操作,可以不要            */
 130   1              reg0b=0x00;             //read count high   中止DMA操作
 131   1              reg0a=0x00;             //read count low;
 132   1              reg00=0x22;             //complete dma page 0
 133   1      
 134   1              for(i=0;i<6;i++)        //最多重发6次,上次的数据包
 135   1              {
 136   2                      for(ii=0;ii<1000;ii++)  //检查txp为是否为低
 137   2                      {
 138   3                              if ((reg00&0x04)==0) break;
 139   3                      }
 140   2                      if ((reg04&0x01)!=0) break;     //表示发送成功
 141   2                      reg00=0x3e;
 142   2              }
 143   1              reg07=0xff;
 144   1              if(txd_buffer_select)
 145   1                      reg04=0x40;     //txd packet start; 
 146   1              else
 147   1                      reg04=0x46;     //txd packet start; 
 148   1              reg06=len>>8;   //high byte counter
 149   1              reg05=len&0xff; //low byte counter
 150   1              reg07=0xff;
 151   1              reg00=0x3e;             //to sendpacket;  
 152   1              free(outbuf);
 153   1      }
 154          
 155          //------------------------------------------------------------------------
 156          // This functions checks the 8019 receive event status
 157          // word to see if an ethernet frame has arrived.  If so,
 158          // set EVENT_ETH_ARRIVED bit in global event_word
 159          //------------------------------------------------------------------------
 160          void query_8019(void)
 161          {   
 162   1      char bnry,curr;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -