📄 89c52ctr.lst
字号:
C51 COMPILER V6.12 89C52CTR 05/16/2008 11:16:47 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE 89C52CTR
OBJECT MODULE PLACED IN .\89C52ctr.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\89C52ctr.c DEBUG OBJECTEXTEND
stmt level source
1 #include "GloblDef.h"
2 //#include "RTL8019.h"
3 #include "AT89X52.h"
4 #include "math.h"
5 extern byte MemAllocation(word size);
*** ERROR C141 IN LINE 5 OF .\89C52CTR.C: syntax error near 'size', expected ')'
*** ERROR C129 IN LINE 5 OF .\89C52CTR.C: missing ';' before ')'
6 extern void FreePage(byte page);
7 extern byte xdata *MemPageToPoint(byte page);
8 extern byte WriteQueue(byte page,stuct queue xdata *pQueue);
9
10 byte xdata LocalMACAddr[6]={0x52,0x68,0x3a,0x1c,0x2b,0x56};
11 struct Queue xdata QueueNetPacketIn;
12 byte StartPageOfPacket;
13
14
15
16
17 /*接收头文件信息*/
18 struct RTLReceiveHeader
19 {
20 byte ReceiveStatus;
21 byte NextPacketStartPage;
22 byte PacketSizeLow;
23 byte PacketSizeHigh;
24 }Head;
25 byte xdata Head[4];
26 byte LastSendStartPage;
27 sbit RTLResetPin = RTL_RESET_PIN;
28
29
30 //读rtl寄存器端口
31 byte ReadReg(word port)
32 {
33 byte xdata *p;
34 p=(byte xdata *)port; //强制类型转换,为什么不是p=byte xdata port;
35
36 return *p;
37 }
38
39
40 void WriteReg(word port,byte value)
41 {
42 byte xdata *p;
43 p=(byte xdata *)port;
44 *p=value;
45 }
46
47
48 //chose page
49 void RTLPage(byte Index)
50 {
51 //set cr,cr_txp 7--6bit0 (1,resend)
52 byte temp;
53 temp=ReadReg(CR);
C51 COMPILER V6.12 89C52CTR 05/16/2008 11:16:47 PAGE 2
54 temp=temp&0x3b; //set 7-6 and 2 bit(TXP) to 0
55 Index=Index<<6; //把页码左移到ps1,ps0 实现选择 ^^;
56 temp =temp | Index;
57 WriteReg(CR,temp);
58 }
59
60
61 //PRA为物理地址//
62 void RTLInitial()
63 {
64 byte temp;
65 int i;
66
67 /*硬件重启*/
68 RTLResetPin=1;
69 for(i=0;i<255;i++); //延迟时间让高电平持续1us以上
70 RTLResetPin=0; //再给个低电平,从而复位RTL
71 /*若硬件重启延迟很大,rtl自我初始化*/
72 for(i=0;i<DELAY_AFTER_HARDWARE_RESET;i++); //复位过程需要一些时间推荐100ms
73
74 /*写重启口*/
75 temp=ReadReg(RESET_PORT);
76 WriteReg(RESET_PORT,temp);//软件复位通过写ResetPort达到复位,也就是给18~1F之间的任意一个寄存器写入任意
-一个数,就使得以太网口复位
77
78 /*初始化rtl寄存器*/
79 WriteReg(CR,(CR_PAGE0 | CR_ABORT_COMPLETE_DMA | CR_STOP_COMMAND));
80 //选择page0,stop command
81
82 WriteReg(PSTART_WPAGE0,RECEIVE_START_PAGE);
83 WriteReg(PSTOP_WPAGE0, RECEIVE_STOP_PAGE);
84 WriteReg(BNRY_WPAGE0, RECEIVE_START_PAGE);
85 WriteReg(TPSR_WPAGE0, SEND_START_PAGE0);//Pstart,Pstop,bnry,tpsr
86
87 WriteReg(RCR_WPAGE0, 0XCE);
88 WriteReg(TCR_WPAGE0, 0XE0);
89 WriteReg(DCR_WPAGE0, 0XC8); //RCR,TCR,DCR在头文件里定义
90
91 WriteReg(IMR_WPAGE0,0); //RTL接收中断使能
92 WriteReg(ISR_WPAGE0, 0XFF); //写ff清除所有中断标志
93
94 RTLPage(1);
95
96 WriteReg(CURR_WPAGE,RECEIVE_START_PAGE+1);
97 //MAR0
98 WriteReg(0x08,0x00);
99 WriteReg(0x09,0x41);
100 WriteReg(0x0a,0x00);
101 WriteReg(0x0b,0x80);
102 WriteReg(0x0c,0x00);
103 WriteReg(0x0d,0x00);
104 WriteReg(0x0e,0x00);
105 WriteReg(0x0f,0x00);
106 //设置物理地址
107 WriteReg(PRA0_WPAGE1,LocalMACAddr[0]);
108 WriteReg(PRA1_WPAGE1,LocalMACAddr[1]);
109 WriteReg(PRA2_WPAGE1,LocalMACAddr[2]);
110 WriteReg(PRA3_WPAGE1,LocalMACAddr[3]);
111 WriteReg(PRA4_WPAGE1,LocalMACAddr[4]);
112 WriteReg(PRA5_WPAGE1,LocalMACAddr[5]);
113 //传输起始页
114 LastSendStartPage=SEND_START_PAGE0;
C51 COMPILER V6.12 89C52CTR 05/16/2008 11:16:47 PAGE 3
115 StartPageOfPacket=RECEIVE_START_PAGE+1;
116 //初始化结束
117 WriteReg(CR,(CR_PAGE0|CR_ABORT_COMPLETE_DMA|CR_STOP_COMMAND));
118 }
119
120
121
122 //写buffer到rtl ram
123 void RTLWriteRam(word address,word size,byte xdata *buff)
124 {
125 word i;
126 byte PrePage; //store page
127 Prepage=ReadReg(CR);
128 RTLPage(0);
129 WriteReg(RSARH_WPAGE0,(byte)((address>>8)&0x00ff));
130 WriteReg(RSARL_WPAGE0,(byte)address);
131 WriteReg(RBCRH_WPAGE0,(byte)((size>>8)&0x00ff));
132 WriteReg(RBCRL_WPAGE0,(byte)size);
133 WriteReg(CR,(0x00|CR_REMOTE_WRITE|CR_START_COMMAND));
134 for(i=0;i<size;i++)
135 {
136 WriteReg(REMOTE_DMA_PORT,buff[i]);
137 }
138 //完成DMA
139 WriteReg(RBCRH_WPAGE0,0);
140 WriteReg(RBCRL_WPAGE0,0);
141 WriteReg(CR,((PrePage&0xc0)|CR_ABORT_COMPLETE|CR_STARAT_COMMAND));
142 }
143
144
145 //读rtl ram 数据到 buffer
146 void RTLReadRam(word address,word size,byte xdata *buff)
147 {
148 word i;
149 byte PrePage;
150
151 PrePage=ReadReg(CR);
152 RTLPage(0);
153 WriteReg(RSARH_WPAGE0,(byte)((address>>8)&0x00ff));
154 WriteReg(RSARL_WPAGE0,(byte)address);
155 WriteReg(RBCRH_WPAGE0,(byte)((size>>8)&0x00ff));
156 WriteReg(RBCRL_WPAGE0,(byte)size);
157 WriteReg(CR,(0x00|CR_REMOTE_READ|CR_START_COMMAND));
158 for (i=0;i<size;i++)
159 {
160 buff[i]=ReadReg(REMOTE_DMA_PORT);
161 }
162 //完成dma
163 WriteReg(RBCRH_WPAGE0,0);
164 WriteReg(RBCRL_WPAGE0,0);
165 WriteReg(CR,((PrePage&0xc0)|CR_ABORT_COMPLETE|CR_STARAT_COMMAND));
166 }
167
168
169 byte RTLSendPacket(byte xdata *buffer,word size)
170 {
171 byte StartPage;
172 byte PrePage;
173 PrePage=ReadReg(CR);
174 //检测包大小
175 if(size<MIN_PACKET_SIZE||size>MAX_PACKET_SIZE)
176 return FALSE;
C51 COMPILER V6.12 89C52CTR 05/16/2008 11:16:47 PAGE 4
177 //写包到ram
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -