📄 m500auc.lst
字号:
C51 COMPILER V6.02 M500AUC 11/20/2007 16:53:51 PAGE 1
C51 COMPILER V6.02, COMPILATION OF MODULE M500AUC
OBJECT MODULE PLACED IN D:\资源文件\RFREADER\SOURCE\ICMF\M500AUC.OBJ
COMPILER INVOKED BY: C:\WAVE6000\cv602\C51.EXE D:\资源文件\RFREADER\SOURCE\ICMF\M500AUC.C OT(5)
stmt level source
1 #pragma small DEBUG SYMBOLS OBJECTEXTEND CODE
2 #include <string.h>
3 #include <stdio.h>
4 #include <absacc.h>
5 #include <intrins.h>
6 #include "Mfreg500.h" //RC500寄存器
7 #include "MfErrNo.h" //错误标识
8 #include "reg52.h" //89C52寄存器
9 #include "M500AuC.h"
10 #define uchar unsigned char
11 #define uint unsigned int
12 #define GetRegPage(addr) (0x80 | (addr>>3))
13 #define NO_TIMER2 1
14 uchar status;
15 uchar ID,command,NAD;
16 uchar LcLe,Rlen,sw1,sw2;
17 uchar cla,ins,pcb,pcb_r;
18 uchar block_num;
19 uchar timer0;
20 uint Len,ramlen,tt0;
21 uchar TC1,DD,WI;
22
23 void delay_1ms(unsigned char _1ms);
24 void delay_50us(unsigned char _50us);
25 uchar M500PcdRfReset(unsigned char ms);
26 uchar SetBitMask(unsigned char reg,unsigned char mask);
27 void M500PcdSetTmo(unsigned char tmoLength);
28 uchar M500PcdCmd(
29 volatile unsigned char data * rcv,
30 volatile MfCmdInfo idata *info);
31 uchar ClearBitMask(unsigned char reg,unsigned char mask);
32 void FlushFIFO(void);
33 void toPpc(unsigned int Address,unsigned char value) //向外存中写入数据
34 {
35 1 //XBYTE[0x8000+Address]=value; //20030317 片选引脚改变
36 1 XBYTE[0xc000+Address]=value;
37 1 }
38 unsigned char fromPpc(unsigned int Address) //从外存中读出数据
39 {
40 1 //return XBYTE[0x8000+Address]; //20030317 片选引脚改变
41 1 return XBYTE[0xc000+Address];
42 1 }
43
44 void WriteRawIO(unsigned char Address,unsigned char value) //向RC500寄存器中写数据
45 {
46 1 //XBYTE[0x6000+Address]=value; //20030317 片选引脚改变
47 1 XBYTE[0xa000+Address]=value;
48 1 }
49 unsigned char ReadRawIO(unsigned char Address) //从RC500寄存器中读数据
50 {
51 1 //return XBYTE[0x6000+Address]; //20030317 片选引脚改变
52 1 return XBYTE[0xa000+Address];
53 1 }
54
55 void WriteIO(unsigned char Address, unsigned char value)
C51 COMPILER V6.02 M500AUC 11/20/2007 16:53:51 PAGE 2
56 {
57 1 WriteRawIO(0x00,GetRegPage(Address));
58 1 WriteRawIO(Address,value);
59 1 }
60 unsigned char ReadIO(unsigned char Address)
61 {
62 1 WriteRawIO(0x00,GetRegPage(Address));
63 1 return ReadRawIO(Address);
64 1 }
65
66
67 void M500PcdSetTmo(unsigned char tmoLength) //设置计时器
68 {switch(tmoLength)
69 1 { // 时钟频率13.56MHz
70 2 case 1: // short timeout (1,0 ms)
71 2 WriteIO(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
72 2 WriteIO(RegTimerReload,0x6a);// TReloadVal = 'h6a =106(dec)
73 2 break;
74 2 case 2: // medium timeout (1,5 ms)
75 2 WriteIO(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
76 2 WriteIO(RegTimerReload,0xa0);// TReloadVal = 'ha0 =160(dec)
77 2 break;
78 2 case 3: // medium timeout (6 ms)
79 2 WriteIO(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
80 2 WriteIO(RegTimerReload,0xa0);// TReloadVal = 'ha0 =160(dec)
81 2 break;
82 2 case 4: // long timeout (9.6 ms)
83 2 WriteIO(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
84 2 WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
85 2 break;
86 2 case 5: // long timeout (38.5 ms)
87 2 WriteIO(RegTimerClock,0x0b); // TAutoRestart=0,TPrescale=16*128
88 2 WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
89 2 break;
90 2 case 6: // long timeout (154 ms)
91 2 WriteIO(RegTimerClock,0x0d); // TAutoRestart=0,TPrescale=64*128
92 2 WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
93 2 break;
94 2 case 7: // long timeout (616.2 ms)
95 2 WriteIO(RegTimerClock,0x0f); // TAutoRestart=0,TPrescale=256*128
96 2 WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
97 2 break;
98 2 default: //
99 2 WriteIO(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
100 2 WriteIO(RegTimerReload,tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
101 2 break;
102 2 }
103 1 }
104 void t0int(void) interrupt 1 using 3
105 {
106 1 timer0++;
107 1 }
108
109
110
111
112 //---------------------------------------------------------------------------------------
113
114 void ES_int(void) interrupt 4 using 3 //从串口读出第一个字节
115 {
116 1 EA = 0;
117 1 ES = 0;//ES int off
C51 COMPILER V6.02 M500AUC 11/20/2007 16:53:51 PAGE 3
118 1 STATE_FLAG = 0;
119 1 RI = 0;
120 1 if(SBUF != 0xaa) {ES = EA = 1;return ;}//Head = 0xAA
121 1 ESint = 1;
122 1 EA = 1;
123 1 }
124
125 void SRCH232(void) //设置串行通讯端口
126 {
127 1 INH = 0;
128 1 TH1=TL1=254;//57600bps with 22.1184MHz
129 1 TR1=1;
130 1 delay_1ms(1);//1ms
131 1 XC1=XC2=1;
132 1 delay_1ms(1);//1ms
133 1 RI=0;
134 1 }
135
136 void SRCH_ICC(uchar C4052)//?/*建立与CPU_ICC.AT24c16.AT45d041通信关系*/
137 {
138 1 INH = 0;
139 1
140 1 TH1=TL1=BAUD_9600;
141 1
142 1
143 1 TR1 = 1;
144 1 delay_1ms(1);//1ms
145 1 if(C4052==CPUtype) //cpu card
146 1 {XC1=XC2=0;}
147 1 if(C4052==SAM1type) //sam card
148 1 {XC1=1;XC2=0;}
149 1 if(C4052==AT24type)
150 1 {XC1=0;XC2=1;}//AT24C16
151 1 delay_1ms(1);//1ms
152 1 tt0 = timer0 = 0;
153 1 RI=0;
154 1 }
155 //---------------------------------------------------------------------------------------
156
157 uchar recv_pc(void) //从PC接受一个字符
158 {
159 1 ET0 = 0;
160 1 timer0 = 0;
161 1 STATE_FLAG=0;
162 1 ET0 = 1;EA = 1;
163 1 while(!RI) if(timer0 > 20000) break;//10
164 1 if(RI==0)
165 1 {STATE_FLAG=1;return(0x84);}//time out
166 1 RI=0;
167 1 ET0 = 0;
168 1 return(SBUF);
169 1 }
170
171 uchar recvfrompc(void) //从PC接受数据
172 {
173 1 uchar temp=0;
174 1 uint i;
175 1 uint length;
176 1 uchar Bcc = 0;
177 1 Rlen = 0;
178 1 led=0;
179 1 SRCH232();
C51 COMPILER V6.02 M500AUC 11/20/2007 16:53:51 PAGE 4
180 1 ES = 0;
181 1 do
182 1 {
183 2 while(!RI)
184 2 {
185 3 if(ICSW)
186 3 {
187 4 EX1 = 1;
188 4 led = 1;
189 4 }
190 3 else
191 3 {
192 4 EX1 = 0;
193 4 led = 0;
194 4 }
195 3
196 3 }
197 2 RI=0;
198 2 } while(SBUF != 0xaa); //Head = 0xAA
199 1
200 1 temp=SBUF;
201 1 ID=recv_pc(); //device
202 1 if(STATE_FLAG) return(ID);
203 1
204 1 command=recv_pc(); //command
205 1 if(STATE_FLAG) return(command);
206 1
207 1 temp=recv_pc(); //block addr/No.
208 1 if(STATE_FLAG) return(temp);
209 1
210 1 block_num=recv_pc(); //block number
211 1 if(STATE_FLAG) return(block_num);
212 1
213 1 length=recv_pc(); //length.L
214 1 if(STATE_FLAG) return((uchar)length);
215 1
216 1 temp=recv_pc(); //length.H
217 1 if(STATE_FLAG) return(temp);
218 1 length|=((uint)temp)<<8;
219 1
220 1 if(length!=0)
221 1 {
222 2 NAD=recv_pc();
223 2 if(STATE_FLAG) return(NAD);
224 2 Bcc ^= NAD;
225 2
226 2 pcb=recv_pc();
227 2 if(STATE_FLAG) return(pcb);
228 2 Bcc ^= pcb;
229 2
230 2 Rlen=recv_pc();
231 2 if(STATE_FLAG) return(Rlen);
232 2 Bcc ^= Rlen;
233 2
234 2 if(command == 0x52) return 0;
235 2
236 2 Len=length-3;
237 2
238 2 for(i=0;i<length - 3;i++)
239 2 {
240 3 temp=recv_pc();
241 3 if(STATE_FLAG)
C51 COMPILER V6.02 M500AUC 11/20/2007 16:53:51 PAGE 5
242 3 return(temp);
243 3 toPpc(i,temp);
244 3 Bcc ^= temp;
245 3 }
246 2
247 2
248 2 temp=recv_pc();
249 2 if(Bcc != temp)
250 2 return -1;
251 2
252 2 cla=fromPpc(0);
253 2 ins=fromPpc(1);
254 2 LcLe=fromPpc(4);
255 2 return 0;
256 2 }
257 1
258 1 }
259
260
261 void SEND_PC(uchar chr) //向PC发送一个字节
262 {
263 1 TXD = 1;
264 1 while(!TXD);
265 1 ACC = chr;
266 1 TB8 = P;
267 1 SBUF = ACC;
268 1 while(!TI);
269 1 TI=0;
270 1 }
271
272
273
274 void sendtopc(void) //向PC发送数据
275 {
276 1 uint i;
277 1 uchar chr,Bcc;
278 1
279 1 ET0 = 0;
280 1 SEND_PC(0x55);//send headle
281 1 Bcc = 0x55;
282 1 SEND_PC(ID);//send device
283 1 Bcc ^= ID;
284 1 SEND_PC(command);//send command/ST
285 1 Bcc ^= command;
286 1 SEND_PC(Len);//send lengthL
287 1 Bcc ^= Len;
288 1 SEND_PC(0);//send lengthH
289 1
290 1 if(Len!=0)
291 1 {
292 2 //Bcc=0;//BCC
293 2 for(i = 0; i < Len; i++)
294 2 {
295 3 chr=fromPpc(i);
296 3 SEND_PC(chr);//send DATA
297 3 Bcc^=chr;
298 3 }
299 2 }
300 1 SEND_PC(Bcc);//send BCC
301 1 }
302 //M500PcdCmd函数负责取得命令代码cmd,数据指针rcv,状态指针info,并向RC500发送命令,取得应答返回到数据指针
303 uchar M500PcdCmd(
C51 COMPILER V6.02 M500AUC 11/20/2007 16:53:51 PAGE 6
304 volatile unsigned char data *rcv,
305 MfCmdInfo idata *info)
306 {
307 1 char idata status = MI_OK;
308 1 char idata tmpStatus ;
309 1 unsigned char idata lastBits;
310 1 unsigned int idata timecnt=0;
311 1 uint i;
312 1 unsigned char idata irqEn = 0x00;
313 1 unsigned char idata waitFor = 0x00;
314 1 unsigned char idata timerCtl = 0x00;
315 1
316 1 WriteIO(RegInterruptEn,0x7F);
317 1 WriteIO(RegInterruptRq,0x7F);
318 1 WriteIO(RegCommand,PCD_IDLE);
319 1
320 1 FlushFIFO();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -