📄 global.lst
字号:
214 1 uint ii;
215 1
216 1 page(0);
217 1 bnry=Reg03; //bnry page have read 读页指针
218 1 page(1);
219 1 curr=Reg07; //curr writepoint 8019写页指针
220 1 page(0);
221 1 if((curr==0)) return(0); //读的过程出错
222 1 bnry=bnry++;
223 1 if(bnry>0x7f) bnry=0x4c;
224 1 if(bnry!=curr) //此时表示有新的数据包在缓冲区里
225 1 { //在任何操作都最好返回page0
226 2 page(0);
227 2 //=======================================
228 2 Reg09=bnry; //读页地址的高字节
229 2 Reg08=0x00; //读页地址的低字节
230 2 Reg0b=0x00; //读取字节计数高字节
231 2 Reg0a=18; //读取字节计数高字节
232 2 Reg00=0x0a; //启动Remote DMA读操作
233 2
234 2 for(i=0;i<18;i++)//读取一包的前18个字节:4字节的8019头部,6字节目的地址,6字节原地址,2字节协议
235 2 {
236 3 RxdNetBuff.bytes.bytebuf[i]=Reg10;
237 3 }
238 2 //=======================================中止DMA操作
239 2 Reg0b=0x00; //
240 2 Reg0a=0x00; //
241 2 Reg00=0x22; //结束或放弃DMA操作
C51 COMPILER V7.06 GLOBAL 05/27/2008 11:02:05 PAGE 5
242 2 //=======================================
243 2 i=RxdNetBuff.bytes.bytebuf[3];
244 2 RxdNetBuff.bytes.bytebuf[3]=RxdNetBuff.bytes.bytebuf[2];
245 2 RxdNetBuff.bytes.bytebuf[2]=i; //将长度字段的高低字节掉转
246 2 RxdNetBuff.EtherFrame.length=RxdNetBuff.EtherFrame.length-4;//去掉4个字节的CRC
247 2
248 2 //=====================以上各步操作表示读入的数据包有效
249 2
250 2 if(((RxdNetBuff.bytes.bytebuf[0]&0x01)==0)||(RxdNetBuff.bytes.bytebuf[1]>0x7f)
251 2 ||(RxdNetBuff.bytes.bytebuf[1]<0x4c)||(RxdNetBuff.bytes.bytebuf[2]>0x06))
252 2 {//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度>1500字节
253 3 page(1);
254 3 curr=Reg07; //page1
255 3 page(0); //切换回page0
256 3 bnry = curr -1;
257 3 if(bnry < 0x4c)
258 3 bnry =0x7f;
259 3 Reg03=bnry; //write to bnry
260 3
261 3 Reg07=0xff;
262 3 return(0);
263 3 }//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度>1500字节
264 2 //=============================================
265 2
266 2 else//表示数据包是完好的.读取剩下的数据
267 2 {
268 3 if((RxdNetBuff.EtherFrame.NextProtocal==0x0800)||(RxdNetBuff.EtherFrame.NextProtocal==0x0806))
269 3 { //协议为IP或ARP才接收
270 4 Reg09=bnry; //read page address high
271 4 Reg08=4; //read page address low
272 4 Reg0b=RxdNetBuff.EtherFrame.length>>8; //read count high
273 4 Reg0a=RxdNetBuff.EtherFrame.length&0xff;//read count low;
274 4 Reg00=0x0a; //read dma
275 4 for(ii=4;ii<RxdNetBuff.EtherFrame.length+4;ii++)
276 4 {RxdNetBuff.bytes.bytebuf[ii]=Reg10;}
277 4 //================终止DMA操作
278 4 Reg0b=0x00; //read count high
279 4 Reg0a=0x00; //read count low;
280 4 Reg00=0x22; //结束或放弃DMA
281 4 //============================
282 4 }
283 3 //=========================================
284 3 bnry=RxdNetBuff.bytes.bytebuf[1]-1;
285 3 if(bnry<0x4c)
286 3 {bnry=0x7f;}
287 3 Reg03=bnry; //write to bnry
288 3 Reg07=0xff;
289 3 if((TCP1024.State==TCP_STATE_ESTABLISHED)&&(RxdNetBuff.IpFrame.NextProtocal==6))
290 3 if(RxdNetBuff.IpFrame.SourceIp[0]!=TxdNetBuff.IpFrame.DestId[0])
291 3 if(RxdNetBuff.IpFrame.SourceIp[1]!=TxdNetBuff.IpFrame.DestId[1])//目标IP地址是否本机
292 3 return(0);
293 3 return(1); //have new packet
294 3 }//表示数据包是完好的.读取剩下的数据
295 2 }//if(bnry!=curr)//此时表示有新的数据包在缓冲区里
296 1 return(0);
297 1 }
298
299 /**********************************************************************
300 **函数原型: void InitNic()
301 **入口参数: 无
302 **出口参数: 无
303 **返 回 值: 无
C51 COMPILER V7.06 GLOBAL 05/27/2008 11:02:05 PAGE 6
304 **说 明: 对芯片的工作寄存器进行设置,各个寄存器的用法可参考文档和
305 ** 络芯片的数据手册
306 ************************************************************************/
307 void InitNic()
308 {
309 1 Delay_MS(10);
310 1 /**********************************************************************
311 1
312 1 1.Reg00命令寄存器: CR,命令寄存器,地址偏移量00H,为一个字节
313 1 位: 7 6 5 4 3 2 1 0
314 1 名字: PS1 PS0 RD2 RD1 RD0 TXP STA STP
315 1 //============================================
316 1 2.
317 1 RD2,RD1,RD0: 这3个位代表要执行的功能。
318 1 0 0 1 : 读网卡内存
319 1 0 1 0 : 写网卡内存
320 1 0 1 1 : 发送网卡数据包
321 1 1 * * : 完成或结束DMA的读写操作
322 1 //============================================
323 1 3.TXP位置1时发送数据包,发完自动清零
324 1 //============================================
325 1 4.
326 1 STA,STP: 这两个位用来启动命令或停止命令
327 1 1 0 启动命令
328 1 0 1 停止命令
329 1 //============================================
330 1 ********************************************************/
331 1 Reg00=0x21; //使芯片处于停止模式,这时进行寄存器设置
332 1
333 1 Delay_MS(10); //延时10毫秒,确保芯片进入停止模式
334 1 page(0);
335 1 Reg0a=0x00; //清rbcr0
336 1 Reg0b=0x00; //清rbcr1
337 1 Reg0c= 0xe0; //RCR,监视模式,不接收数据包
338 1 Reg0d= 0xe2; //TCR,loop back模式
339 1
340 1 Reg01=0x4c;
341 1 Reg02=0x80;
342 1 Reg03=0x4c;
343 1 Reg04=0x40; //TPSR,发送起始页寄存器
344 1 Reg07=0xff; //清除所有中断标志位,中断状态寄存器
345 1 Reg0f=0x00; //中断屏蔽寄存器清0,禁止中断
346 1
347 1 Reg0e=0xc8; // 数据配置寄存器,8位dma方式
348 1 page(1);
349 1 Reg07=0x4d;
350 1 Reg08=0x00;
351 1 Reg09=0x00;
352 1 Reg0a=0x00;
353 1 Reg0b=0x00;
354 1 Reg0c=0x00;
355 1 Reg0d=0x00;
356 1 Reg0e=0x00;
357 1 Reg0f=0x00;
358 1 Reg00=0x22; //这时让芯片开始工作
359 1
360 1 SetMacID(); //将芯片物理地址写入到MAR寄存器
361 1
362 1 page(0);
363 1 Reg0c=0xcc; //将芯片设置成正常模式,跟外部网络连接
364 1 Reg0d=0xe0;
365 1 Reg00=0x22; //启动芯片开始工作
C51 COMPILER V7.06 GLOBAL 05/27/2008 11:02:05 PAGE 7
366 1 Reg07=0xff; //清除所有中断标志位
367 1
368 1 }
369
370 /**********************************************************************
371 **函数原型: void Timer0_Init( )
372 **入口参数: 无
373 **出口参数: 无
374 **返 回 值: 无
375 **说 明: 初始化定时器0
376 ************************************************************************/
377 void Timer0_Init()
378 {
379 1 tmod=tmod&0xf0;
380 1 tmod=tmod|0x01;
381 1 th0 = 0;
382 1 tl0 = 0;
383 1 tr0 = 1;
384 1 }
385
386 /**********************************************************************
387 **函数原型: void Serial_Init( )
388 **入口参数: 无
389 **出口参数: 无
390 **返 回 值: 无
391 **说 明: 初始化串口
392 ************************************************************************/
393 void Serial_Init()
394 {
395 1 //====设置波特率===================
396 1 tmod = tmod & 0x0f;
397 1 tmod = tmod | 0x20;
398 1 th1 = 0xfa;
399 1 tr1 = 1;
400 1 pcon = pcon | 0x80;
401 1 //=======================
402 1 //工作方式为8位数据
403 1 sm0 = 0;
404 1 sm1 = 1;
405 1 sm2 = 0;
406 1 tr1 = 1;
407 1 //==========================
408 1 ren = 1; //允许接收
409 1 ti = 1;
410 1 }
411
412 /**********************************************************************
413 **函数原型: void Interrupt_Init(void)
414 **入口参数: 无
415 **出口参数: 无
416 **返 回 值: 无
417 **说 明: 初始化中断
418 ************************************************************************/
419 void Interrupt_Init(void)
420 {
421 1 //定时器0允许中断
422 1 et0 = 1;
423 1 ea = 1;
424 1 //======================
425 1 et1 = 0; //禁止定时器1中断
426 1 //======================
427 1 ps0 = 1; //设置串行口高优先级
C51 COMPILER V7.06 GLOBAL 05/27/2008 11:02:05 PAGE 8
428 1 //==============================
429 1 es0 = 1;
430 1 ea = 1; //允许串口中断
431 1 }
432
433 /**********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -