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

📄 rtl8019.lst

📁 51单片机下的RTL8019网络芯片的驱动程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   RTL8019                                                               08/08/2007 10:09:40 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE RTL8019
OBJECT MODULE PLACED IN E:\NETBRO~1\TRUNK\NETBRO~1\RTL8019\RTL8019.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\NETBRO~1\TRUNK\NETBRO~1\RTL8019\RTL8019.C DB SB OE

stmt level    source

   1          /*
   2          */
   3          #include "reg51.h"
   4          #include "config.h"
   5          #include "GloblDef.h"
   6          #include "TCPIPmem.h"
   7          #include "RTL8019.h"
   8          #include <stdio.h>
   9          #include <absacc.h>
  10          
  11          #define RTLBaseAddr 0x8000
  12          
  13          /* to prevent call RTLSendPacket() when RTLSendPackt() is already is called, InSending
  14          is used. example when process run in RTLSendPacket() and a interrupt ocurr then call
  15          RTLSendPacket again, then the Register would have changed when interrupt return. */
  16          static unsigned char xdata InSending;
  17          
  18          static unsigned char xdata StartPageOfPacket;
  19          /* receive head information */
  20          /*struct RTLReceiveHeader
  21          {
  22                  unsigned char ReceiveStatus;
  23                  unsigned char NextPacketStartPage;
  24                  unsigned char PacketSizeLow;
  25                  unsigned char PacketSizeHigh;
  26          }Head;for some unknown resean Head must be a gloal value. */
  27          static unsigned char xdata Head[4];
  28          
  29          /* last trasmit start page */
  30          static unsigned char xdata LastSendStartPage;
  31          
  32          /****************************************************************************
  33          * 名称:WriteReg()
  34          * 功能:把数据写入RTL8019AS
  35          * 入口参数:    chPort          写入地址
  36                          chValue         写入数据
  37          * 出口参数:无
  38          ****************************************************************************/
  39          void  WriteReg(unsigned char chPort,unsigned char chValue)
  40          {
  41   1              unsigned char xdata chWriteRegTmp = 0;
  42   1              volatile unsigned int RTLAddr = 0;
  43   1      
  44   1              /*
  45   1              //方法一
  46   1              (*((volatile unsigned short *) RTLBaseAddr + chPort)) = chValue;
  47   1              //to debug
  48   1              chWriteRegTmp = (*((volatile unsigned short *) RTLBaseAddr + chPort));
  49   1              */
  50   1              //方法二
  51   1              RTLAddr = RTLBaseAddr + chPort;
  52   1              *(volatile unsigned char *)(RTLAddr) = chValue;
  53   1              //to debug
  54   1              chWriteRegTmp = *(volatile unsigned char *)(RTLAddr);
  55   1      
C51 COMPILER V7.06   RTL8019                                                               08/08/2007 10:09:40 PAGE 2   

  56   1      
  57   1      }
  58          
  59          /****************************************************************************
  60          * 名称:ReadReg()
  61          * 功能:从RTL8019AS把数据读出
  62          * 入口参数:    chPort          读出地址
  63          * 出口参数:    Read读出数据
  64          ****************************************************************************/
  65          unsigned char ReadReg(unsigned char chPort)
  66          {
  67   1              unsigned char xdata chReadRegTmp = 0;
  68   1              volatile unsigned int RTLAddr = 0;
  69   1              /*
  70   1              //方法一
  71   1              chReadRegTmp = (*((volatile unsigned short *)RTLBaseAddr + chPort));//0x83400000
  72   1              return (chReadRegTmp); */
  73   1      
  74   1              //方法二
  75   1              RTLAddr = RTLBaseAddr + chPort;
  76   1              chReadRegTmp = *(volatile unsigned char *)(RTLAddr);
  77   1              return chReadRegTmp;
  78   1      
  79   1      }
  80          /**********************************************************************
  81          **函数原型:    void  RTLPage(unsigned char chPageNum)
  82          **入口参数:?    unsigned char chPageNum: 要切换的页
  83          **出口参数:     无
  84          **返 回 值:    无
  85          **说    明:    选择页,可选择0,1,2三页,第四页ne000兼容芯片保留,
  86          set bit 7-6 in CR, CR_TXP must be 0(if 1 the packet is retrasmit)
  87          ************************************************************************/
  88          void RTLPage(unsigned char chPageNum)
  89          {
  90   1              unsigned char chTmp;
  91   1              chTmp= ReadReg(0x00);//command register
  92   1              chTmp = chTmp & 0x3B ;//注意txp位不能要
  93   1              chPageNum = chPageNum << 6;
  94   1              chTmp = chTmp | chPageNum;
  95   1              WriteReg(0x00,chTmp);
  96   1      }
  97          
  98          /* reset rtl8019 and init registers, MacAddr is MAC address */
  99          void RTL8019Init() reentrant
 100          {
 101   1              unsigned char chRTLInitTmp = 0;
 102   1              unsigned int i = 0;
 103   1      
 104   1              /* after hardware reset a longdelay is necessary for rtl to self-initial */
 105   1              //在RSTDRV从高电平回到低电平之后的100MS时,在对RTL8019做读写操作,以确保完全复位
 106   1          P35 = 1;
 107   1              delay(200);
 108   1              P35 = 0;
 109   1              delay(200);
 110   1      
 111   1              /* reset: write to reset prot */
 112   1          WriteReg(0x1f,0xdd);
 113   1          chRTLInitTmp = ReadReg(0x1f);
 114   1          delay(200);
 115   1      
 116   1              /* init RTL registers*/
 117   1              WriteReg(0x00,0x21);
C51 COMPILER V7.06   RTL8019                                                               08/08/2007 10:09:40 PAGE 3   

 118   1          chRTLInitTmp = ReadReg(0x00);
 119   1          delay(200);
 120   1      
 121   1          RTLPage(0);
 122   1          //WriteReg(0x0a,0x00);    //清RBCR0
 123   1          //WriteReg(0x0b,0x00);    //清RBCR1
 124   1          //WriteReg(0x0c,0xe0);    //RCR,监视模式,不接收数据报
 125   1          //WriteReg(0x0d,0xe2);    //TCR,loopback模式
 126   1      
 127   1              WriteReg(0x01,0x4c);    /* Pstart       */
 128   1              WriteReg(0x02,0x80);    /* Pstop        */
 129   1              WriteReg(0x03,0x4c);    /* BNRY         */
 130   1              WriteReg(0x04,0x40);    /* TPSR         */
 131   1      
 132   1          //WriteReg(0x0c,0xcc);    //RCR,
 133   1          //WriteReg(0x0d,0xe0);    //TCR,
 134   1      
 135   1          //WriteReg(0x07,0xFF);      /* ISR: Interrupt Status Register,write FF to clear up all interrupt status */
 136   1          //WriteReg(0x0f,0x00);      /* IMR: Interrupt Mask Register,屏蔽掉所有中断 */
 137   1          WriteReg(0x0e,0xC8);        /* DCR: Data Configuration Register*/
 138   1      
 139   1              //WriteReg(0x0c,0xCE);  /* RCR:  */
 140   1              //WriteReg(0x0d,0xE0);  /* TCR:  */
 141   1      
 142   1          RTLPage(1);
 143   1              WriteReg(0x07,0x4d); //CURR,设置为指向当前正在写的页的下一页
 144   1      
 145   1              // MAR0
 146   1              WriteReg(0x08,0x00);
 147   1              WriteReg(0x09,0x41);
 148   1              WriteReg(0x0a,0x00);
 149   1              WriteReg(0x0b,0x80);
 150   1              WriteReg(0x0c,0x00);
 151   1              WriteReg(0x0d,0x00);
 152   1              WriteReg(0x0e,0x00);
 153   1              WriteReg(0x0f,0x00);
 154   1      
 155   1              // set phisical address
 156   1          WriteReg(0x01,0x52);
 157   1          WriteReg(0x02,0x54);
 158   1          WriteReg(0x03,0x4c);
 159   1          WriteReg(0x06,0x30);
 160   1          WriteReg(0x05,0x2e);
 161   1          WriteReg(0x04,0x2f);
 162   1          /*
 163   1      
 164   1          //To debug
 165   1          RTLPage(0);
 166   1          chRTLInitTmp = ReadReg(0x08);
 167   1          chRTLInitTmp = ReadReg(0x09);
 168   1          chRTLInitTmp = ReadReg(0x0a);
 169   1          chRTLInitTmp = ReadReg(0x0b);
 170   1          chRTLInitTmp = ReadReg(0x0c);
 171   1          chRTLInitTmp = ReadReg(0x0d);
 172   1          chRTLInitTmp = ReadReg(0x0e);
 173   1          chRTLInitTmp = ReadReg(0x0f);
 174   1          //for(i = 0;i < 20000;i++);
 175   1          chRTLInitTmp = ReadReg(0x03);
 176   1          chRTLInitTmp = ReadReg(0x01);
 177   1          chRTLInitTmp = ReadReg(0x02);
 178   1          chRTLInitTmp = ReadReg(0x06);
 179   1          chRTLInitTmp = ReadReg(0x05);
C51 COMPILER V7.06   RTL8019                                                               08/08/2007 10:09:40 PAGE 4   

 180   1          chRTLInitTmp = ReadReg(0x04);
 181   1      
 182   1          RTLPage(1);
 183   1          //MAR0~7
 184   1          chRTLInitTmp = ReadReg(0x08);
 185   1          chRTLInitTmp = ReadReg(0x09);
 186   1          chRTLInitTmp = ReadReg(0x0a);
 187   1          chRTLInitTmp = ReadReg(0x0b);
 188   1          chRTLInitTmp = ReadReg(0x0c);
 189   1          chRTLInitTmp = ReadReg(0x0d);
 190   1          chRTLInitTmp = ReadReg(0x0e);
 191   1          chRTLInitTmp = ReadReg(0x0f);
 192   1          //for(i = 0;i < 20000;i++);
 193   1          //PAR0~5
 194   1          chRTLInitTmp = ReadReg(0x03);
 195   1          chRTLInitTmp = ReadReg(0x01);
 196   1          chRTLInitTmp = ReadReg(0x02);
 197   1          chRTLInitTmp = ReadReg(0x06);
 198   1          chRTLInitTmp = ReadReg(0x05);
 199   1          chRTLInitTmp = ReadReg(0x04); */
 200   1      
 201   1              /* transimit start page */
 202   1              LastSendStartPage = SEND_START_PAGE0;
 203   1              StartPageOfPacket = RECEIVE_START_PAGE + 1;
 204   1      
 205   1              /* in the beginning, no packet is in sending */
 206   1              InSending = FALSE;
 207   1      
 208   1              RTLPage(0);
 209   1              /* initial over, start command and receive */
 210   1          WriteReg(0x0c,0xcc);                //将芯片置于正常模式,跟外部网络连接
 211   1          WriteReg(0x0d,0xe0);
 212   1          WriteReg(0x07,0xFF);
 213   1          chRTLInitTmp = ReadReg(0x07);       //清除所有中断标志位
 214   1          //(CR_PAGE0 | CR_ABORT_COMPLETE_DMA | CR_START_COMMAND));
 215   1              WriteReg(0x00,0x22);
 216   1      }
 217          
 218          /* write buffer to rlt ram */
 219          void RTLWriteRam(unsigned int address, unsigned int size, unsigned char xdata * buff) reentrant
 220          {
 221   1              unsigned char xdata *Endp;
 222   1              unsigned char PrePage;  // store page
 223   1              PrePage = ReadReg(0x00);//CR
 224   1              RTLPage(0);
 225   1              WriteReg(RSARH_WPAGE0,(unsigned char)((address>>8)&0x00ff));
 226   1              WriteReg(RSARL_WPAGE0,(unsigned char)address);

⌨️ 快捷键说明

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