📄 eth.lst
字号:
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 + -