📄 eth.lst
字号:
C51 COMPILER V7.20 ETH 03/07/2006 14:49:09 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE ETH
OBJECT MODULE PLACED IN ETH.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ETH.C OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND
line 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 <absacc.h>
9 #include "reg52.h"
10 #include "net.h"
11 #include "serial.h"
12 #include "arp.h"
13 #include "ip.h"
14 #include "eth.h"
15
16 #define reg00 XBYTE[0x8000] //reg00- 10为isa网卡接口的寄存器地址300-310;
17 #define reg01 XBYTE[0x8001]
18 #define reg02 XBYTE[0x8002]
19 #define reg03 XBYTE[0x8003]
20 #define reg04 XBYTE[0x8004]
21 #define reg05 XBYTE[0x8005]
22 #define reg06 XBYTE[0x8006]
23 #define reg07 XBYTE[0x8007]
24 #define reg08 XBYTE[0x8008]
25 #define reg09 XBYTE[0x8009]
26 #define reg0a XBYTE[0x800a]
27 #define reg0b XBYTE[0x800b]
28 #define reg0c XBYTE[0x800c]
29 #define reg0d XBYTE[0x800d]
30 #define reg0e XBYTE[0x800e]
31 #define reg0f XBYTE[0x800f]
32 #define reg10 XBYTE[0x8010]
33
34 bit txd_buffer_select=0; //选择网卡的发送缓冲区
35 extern UCHAR idata debug;
36 extern UCHAR xdata arpbuf[];
37 extern UCHAR code my_hwaddr[];
38
39 void Delay1ms(unsigned char);
40
41 extern UCHAR idata rcve_buf_allocated;
42 extern UINT volatile event_word;
43
44 #define Rtl8019ResetLow P1 &= ~(0x4); // P52
45 #define Rtl8019ResetHigh P1 |= 0x4; // P52
46
47 //------------------------------------------------------------------------
48 // Initialize the Cirrus Logic 8019 chip
49 //------------------------------------------------------------------------
50
51 void page(unsigned char pagenumber)
52 {
53 1 unsigned char data temp;
54 1 temp=reg00;
55 1 temp=temp&0x3b ;
C51 COMPILER V7.20 ETH 03/07/2006 14:49:09 PAGE 2
56 1 pagenumber=pagenumber<<6;
57 1 temp=temp | pagenumber;
58 1 reg00=temp;
59 1 }
60
61 void Rtl8019AS_Reset() //复位网卡
62 {
63 1 Rtl8019ResetHigh;
64 1 Delay1ms(200);
65 1 Rtl8019ResetLow;
66 1 Delay1ms(200);
67 1 }
68 /*
69 void ReadRtl8019NodeID(void)//读出网卡的物理地址存到my_ethernet_address.bytes[6]里
70 {
71 // unsigned char data i;
72 page(0);
73 reg09=0; //读取网卡的ram的地址为0x0000
74 reg08=0;
75 reg0b=0;
76 reg0a=12; //读取12个字节
77 reg00=0x0a; //读ram
78 // for (i=0;i<6;i++)
79 // {
80 // my_hwaddr[i]=reg10;
81 // my_hwaddr[i]=reg10;
82 // }
83 }*/
84
85 void WriteRtl8019NodeID(void)
86 {
87 1 page(1);
88 1 reg01=my_hwaddr[0];
89 1 reg02=my_hwaddr[1];
90 1 reg03=my_hwaddr[2];
91 1 reg04=my_hwaddr[3];
92 1 reg05=my_hwaddr[4];
93 1 reg06=my_hwaddr[5];
94 1 page(0);
95 1 }
96 //控制指示灯的操作
97 /*void LED_T_R(void)
98 {
99 unsigned cha temp;
100 page(3);
101 temp=reg01;
102 reg01=temp|0xc0;
103 temp=reg06;
104 reg06=temp&&0xdf;
105 page(0);
106 }*/
107 //初始化
108 void init_8019(void)
109 {
110 1 Delay1ms(10);
111 1 Rtl8019AS_Reset(); //复位8019
112 1 // R8019_CHIP_SELECT; //A19=1
113 1 reg00=0x21; //使芯片处于停止模式,这时进行寄存器设置 停止模式下,将不会发送和接收数据包
114 1 Delay1ms(10); //延时10毫秒,确保芯片进入停止模式
115 1 page(0);
116 1 reg0a=0x00; reg0b=0x00;
117 1 reg0c= 0xe0; //monitor mode (no packet receive)
C51 COMPILER V7.20 ETH 03/07/2006 14:49:09 PAGE 3
118 1 reg0d= 0xe2; //loop back mode 使芯片处于mon和loopback模式,跟外部网络断开
119 1 reg01=0x4c; reg02=0x80; reg03=0x4c; reg04=0x40;
120 1 reg07=0xff; //清除所有中断标志位
121 1 reg0f=0x00; //disable all interrupt
122 1 reg0e=0xc8; //byte dma 8位dma方式
123 1 page(1);
124 1 reg07=0x4d; reg08=0x00; reg09=0x00; reg0a=0x00; reg0b=0x00;
125 1 reg0c=0x00; reg0d=0x00; reg0e=0x00; reg0f=0x00;
126 1 reg00=0x22; //这时让芯片开始工作
127 1 // ReadRtl8019NodeID(); //读出网卡的物理地址48位
128 1 WriteRtl8019NodeID(); //将网卡地址写入到mar寄存器
129 1 page(0);
130 1 reg0c=0xcc; //将网卡设置成正常的模式,跟外部网络连接
131 1 reg0d=0xe0;
132 1 reg00=0x22; //这时让芯片开始工作
133 1 reg07=0xff; //清除所有中断标志位
134 1 // LED_T_R(); //控制LED
135 1 }
136
137 //------------------------------------------------------------------------
138 // This functions checks 8019 status then sends an ethernet
139 // frame to it by calling an assembler function.
140 //------------------------------------------------------------------------
141
142 void send_frame(UCHAR xdata * outbuf, UINT len)/*发送一个数据包的命令,长度最小为60字节,最大1514字节*/
143 {
144 1 UCHAR i;
145 1 UINT ii;
146 1 page(0);
147 1 if(len<60)len=60;
148 1 txd_buffer_select=!txd_buffer_select;
149 1 if (txd_buffer_select)
150 1 reg09=0x40 ; //txdwrite highaddress
151 1 else
152 1 reg09=0x46 ; //txdwrite highaddress
153 1 reg08=0x00; //read page address low
154 1 reg0b=len>>8; //read count high
155 1 reg0a=len&0xff; //read count low;
156 1 reg00=0x12; //write dma, page0
157 1 for (ii=0;ii<len;ii++) //for (ii=4;ii<len+4;ii++) //是否加4有待验证
158 1 {
159 2 reg10=*(outbuf+ii);
160 2 }
161 1
162 1 /* 以下3句为中止dma的操作,可以不要 */
163 1 reg0b=0x00; //read count high 中止DMA操作
164 1 reg0a=0x00; //read count low;
165 1 reg00=0x22; //complete dma page 0
166 1
167 1 for(i=0;i<16;i++) //最多重发16次
168 1 {
169 2 for(ii=0;ii<1000;ii++) //检查txp为是否为低
170 2 {
171 3 if ((reg00&0x04)==0) break;
172 3 }
173 2 if ((reg04&0x01)!=0) break; //表示发送成功
174 2 reg00=0x3e;
175 2 }
176 1 reg07=0xff;
177 1 if(txd_buffer_select)
178 1 reg04=0x40; //txd packet start;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -