📄 etherdev.lst
字号:
C51 COMPILER V7.06 ETHERDEV 05/02/2009 15:51:21 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE ETHERDEV
OBJECT MODULE PLACED IN .\etherdev.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\src\etherdev.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\etherdev.lst) OBJ
-ECT(.\etherdev.obj)
stmt level source
1 #include "uip.h"
2 #include "etherdev.h"
3
4
5 /*RTL8019的复位管脚*/
6 sbit rst_pin = P1^6;
7
8
9 static void etherdev_delay_ms(unsigned int count);
10 static unsigned int etherdev_poll(void);
11 void page( u8_t pagenumber );
12 void etherdev_reset(void)
13 {
14 1 /*将复位管脚拉高100ms来复位芯片*/
15 1 rst_pin = 1;
16 1 etherdev_delay_ms(100);
17 1 rst_pin = 0;
18 1 etherdev_delay_ms(100);
19 1 }
20
21 /*页面设置函数,pnum为0-3*/
22 void page(u8_t pnum)
23 {
24 1 u8_t temp;
25 1 temp = CR;
26 1 temp=temp & (~(PS1|PS0|TXP)); /*TXP位也应该清0,防止发送数据*/
27 1 pnum = pnum <<6;
28 1 CR = temp | pnum;
29 1 }
30
31 /*以毫秒计算延时*/
32 static void etherdev_delay_ms(unsigned int count)
33 {
34 1 for(count *= ETH_DELAY_MULTPLR; count > 0; count--) continue;
35 1 return;
36 1 }
37
38 /*网卡初始化函数*/
39 void etherdev_init(void)
40 {
41 1 /*先复位芯片*/
42 1 etherdev_reset( );
43 1 /*先停止收发*/
44 1 CR = RD2|STP;
45 1 page(0);
46 1 /* 40H页到45H页共1536(6x256)个字节为发送缓存,其余为接收缓存*/
47 1 /*这样发送缓存可以容纳最长的一个以太网数据帧。*/
48 1 /*设置接收缓存的起始和结束地址*/
49 1 PSTART = ETH_RX_PAGE_START;
50 1 PSTOP = ETH_RX_PAGE_STOP;
51 1 /*BNRY指向接收缓存的首页*/
52 1 BNRY = ETH_RX_PAGE_START;
53 1 /*TPSR,发送缓存区首地址*/
54 1 TPSR = ETH_TX_PAGE_START;
C51 COMPILER V7.06 ETHERDEV 05/02/2009 15:51:21 PAGE 2
55 1 RBCR1 = 0x00;
56 1 RBCR0 = 0x00;
57 1 /*RCR接收配置寄存器1100 1100,*/
58 1 /*接收广播包,组播包,目的MAC与本机相同的包,*/
59 1 /*接收包不小于64字节,包有接收错误不接收*/
60 1 RCR = 0xcc;
61 1 /*TCR传输配置寄存器 1110 0000*/
62 1 /*普通模式,发送时附加CRC*/
63 1 TCR = 0xe0;
64 1 /*DCR数据配置寄存器 1100 1000*/
65 1 /* 8位数据dma,字节长度的DMA传输*/
66 1 DCR = 0xc8;
67 1 /*IMR关所有中断*/
68 1 IMR = 0x00;
69 1 page(1);
70 1 /*CURR 指向接收缓存的首页*/
71 1 CURR = ETH_RX_PAGE_START;
72 1 /*组播地址寄存器*/
73 1 MAR0 = 0x00;
74 1 MAR1 = 0x41;
75 1 MAR2 = 0x00;
76 1 MAR3 = 0x00;
77 1 MAR4 = 0x00;
78 1 MAR5 = 0x00;
79 1 MAR6 = 0x00;
80 1 MAR7 = 0x00;
81 1 /****Write MAC address 以下为写入MAC地址*****/
82 1 PAR0 = UIP_ETHADDR0;
83 1 PAR1 = UIP_ETHADDR1;
84 1 PAR2 = UIP_ETHADDR2;
85 1 PAR3 = UIP_ETHADDR3;
86 1 PAR4 = UIP_ETHADDR4;
87 1 PAR5 = UIP_ETHADDR5;
88 1 page(0);
89 1 CR = RD2|STA;
90 1 /*ISR清所有中断*/
91 1 ISR = 0xff;
92 1 }
93
94 /*网卡发包函数*/
95 void etherdev_send(void)
96 {
97 1 u16_t i;
98 1 u8_t *ptr;
99 1
100 1 ptr = uip_buf;
101 1 page(0);
102 1 /*先结束远程DMA*/
103 1 CR = RD2 | STA;
104 1 /*等待上次发送完成*/
105 1 while(CR & TXP) continue;
106 1 /*清远程DMA中断标志*/
107 1 ISR |= RDC;
108 1 /*启动远程写,将数据写到RAM BUFFER中*/
109 1 RSAR0 = 0x00;
110 1 RSAR1 = ETH_TX_PAGE_START;
111 1 RBCR0 = (u8_t)(uip_len & 0xFF);
112 1 RBCR1 = (u8_t)(uip_len >> 8 );
113 1 CR = RD1 | STA;
114 1 /*uIP将要发送的TCP头部数据放到uip_buf中,
115 1 同时用uip_appdata指向应用层数据*/
116 1 for(i = 0; i < uip_len; i++)
C51 COMPILER V7.06 ETHERDEV 05/02/2009 15:51:21 PAGE 3
117 1 {
118 2 if(i == 40 + UIP_LLH_LEN)
119 2 {
120 3 ptr = (u8_t *)uip_appdata;
121 3 }
122 2 RDMA_REG = *ptr++;
123 2 }
124 1
125 1 /*等待远程DMA操作完成*/
126 1 while(!(ISR & RDC)) continue;
127 1 CR = RD2 | STA;
128 1 /*配置网卡发送数据包*/
129 1 TPSR = ETH_TX_PAGE_START;
130 1 if(uip_len < ETH_MIN_PACKET_LEN)
131 1 {
132 2 uip_len = ETH_MIN_PACKET_LEN;
133 2 }
134 1 TBCR0 = (u8_t)(uip_len & 0xFF);
135 1 TBCR1 = (u8_t)(uip_len >> 8);
136 1 CR = RD2|RD1|RD0|TXP|STA;
137 1 }
138
139 /*网卡收包函数*/
140 u16_t etherdev_read(void)
141 {
142 1 u16_t len = 0;
143 1 u8_t status;
144 1 u8_t retransmit = 0;
145 1 /*检查接收是否正确*/
146 1 if(ISR & PRX)
147 1 {
148 2 /*检查接收缓存是否满了*/
149 2 if(ISR & OVW)
150 2 {
151 3 CR = RD2|STP;
152 3 RBCR0 = 0x00;
153 3 RBCR1 = 0x00;
154 3 while(!(ISR & RST)) continue;
155 3 if(CR & TXP)
156 3 {
157 4 /*发送失败*/
158 4 if(!((ISR & PTX)|| (ISR & TXE)))
159 4 {
160 5 retransmit = 1;
161 5 }
162 4 }
163 3
164 3 TCR = LB0;
165 3 CR = RD2|STA;
166 3 BNRY = ETH_RX_PAGE_START;
167 3 page(1);
168 3 CURR = ETH_RX_PAGE_START;
169 3 page(0);
170 3 /*清中断标志*/
171 3 ISR = PRX | OVW;
172 3 TCR = 0x00;
173 3
174 3 if(retransmit)
175 3 {
176 4 CR = RD2|TXP|STA;
177 4 }
178 3 }
C51 COMPILER V7.06 ETHERDEV 05/02/2009 15:51:21 PAGE 4
179 2 else
180 2 {
181 3 u16_t i;
182 3 u8_t next_rx_packet;
183 3 u8_t current;
184 3 ISR = RDC;
185 3 /*先读RTL8019添加的4个字节*/
186 3 RSAR0 = 0x00;
187 3 RSAR1 = BNRY;
188 3 RBCR0 = 0x04;
189 3 RBCR1 = 0x00;
190 3
191 3 /*获取本帧数据的长度和下一帧页地址*/
192 3 CR = RD0 | STA;
193 3 status = RDMA_REG;
194 3 next_rx_packet = RDMA_REG;
195 3 len = (RDMA_REG); //RDMA);
196 3 len += (RDMA_REG<<8);//<< 8;
197 3 len -= 4;
198 3 /*等待远程DMA操作完成*/
199 3 while(!(ISR & RDC)) continue;
200 3
201 3 CR = RD2 | STA;
202 3 if(len <= UIP_BUFSIZE)
203 3 {
204 4 ISR = RDC;
205 4 RSAR0 = 0x04;
206 4 RSAR1 = BNRY;
207 4 RBCR0 = (u8_t)(len & 0xFF);
208 4 RBCR1 = (u8_t)(len >> 8);
209 4 CR = RD0 | STA;
210 4 /*启动远程读数据*/
211 4 for(i = 0; i < len; i++)
212 4 {
213 5 *(uip_buf + i) = RDMA_REG;
214 5 }
215 4
216 4 while(!(ISR & RDC)) continue;
217 4 CR = RD2 | STA;
218 4 }
219 3 else
220 3 {
221 4 len = 0;
222 4 }
223 3 /*更新BNRY*/
224 3 BNRY = next_rx_packet;
225 3 page(1);
226 3 current = CURR;
227 3 page(0);
228 3 /*RAM BUFFER中没有数据时清PRX*/
229 3 if(next_rx_packet == current)
230 3 {
231 4 ISR = PRX;
232 4 }
233 3 }
234 2 }
235 1 return len;
236 1 }
237
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V7.06 ETHERDEV 05/02/2009 15:51:21 PAGE 5
CODE SIZE = 732 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 8
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -