📄 slrc500.lst
字号:
C51 COMPILER V7.06 SLRC500 05/01/2009 01:52:10 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE SLRC500
OBJECT MODULE PLACED IN SlRc500.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SlRc500.C ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "reg52.h"
2 #include <intrins.h>
3 #include <string.h>
4 #include <absacc.h>
5 #include "main.h"
6 #include "slrc500.h"
7 #define Gpbase 0x7F00 //感应模块地址
8
9 #define outportb(addr,d) XBYTE[addr]=d
10 #define inportb(addr) XBYTE[addr]
11
12 #define FSD 64
13
14 extern struct TranSciveBuffer{unsigned char MfCommand;
15 unsigned int MfLength;
16 unsigned char MfData[64];
17 };
18 /////////////////////////////////////////////////////////////////////
19 //复位并初始化RC500
20 //
21 /////////////////////////////////////////////////////////////////////
22 char PcdReset()
23 {
24 1 char status = MI_OK;
25 1 char n = 0xFF;
26 1 unsigned int i = 3000;
27 1
28 1 DelayMs(100);
29 1 DelayMs(100);
30 1 DelayMs(100);
31 1 DelayMs(100);
32 1 DelayMs(100);
33 1 DelayMs(100);
34 1 DelayMs(100);
35 1 RC500_CE =0;
36 1 RC500_RST=0;
37 1 DelayMs(50);
38 1 DelayMs(50);
39 1
40 1 RC500_RST=1; //高电平复位
41 1 DelayMs(5); //复位时间
42 1 DelayMs(50);
43 1 DelayMs(50);
44 1 DelayMs(50);
45 1 DelayMs(50);
46 1 DelayMs(50);
47 1 DelayMs(50);
48 1 RC500_RST=0;
49 1 DelayMs(5);
50 1
51 1 while (i!=0 && n)
52 1 {
53 2 n = ReadRawRC(RegCommand);//读取指令寄存器的值,不为0--初始化没完成,为0--初始化完成
54 2 i--; //初始化完成后RC500自动输入Idle 命令,结果Command 值变为00H
55 2 }
C51 COMPILER V7.06 SLRC500 05/01/2009 01:52:10 PAGE 2
56 1
57 1 if (i != 0)
58 1 {
59 2 WriteRawRC(RegPage,0x80);//PageSelect位为1,则第三位的值选择寄存器页
60 2 n = 0x80;
61 2 while ( (i!=0) && (n&0x80) )
62 2 {
63 3 n = ReadRawRC(RegCommand);//接口检测是否成功完成,Command的第八位IfDetectBusy
64 3 i--;
65 3 }
66 2 if (i==0 || (n&0xFF)) //复位不成功,读取Command的值不为0
67 2 { status = MI_RESETERR; }
68 2 }
69 1 else
70 1 { status = MI_RESETERR; }
71 1
72 1 if (status == MI_OK)
73 1 { WriteRawRC(RegPage,0x0); }//将0X00 写入页寄存器可激活线性地址模式
74 1
75 1 return status;
76 1 }
77
78 //////////////////////////////////////////////////////////////////////
79 //设置RC500的工作方式
80 //////////////////////////////////////////////////////////////////////
81 char PcdConfigISOType(unsigned char type)
82 {
83 1
84 1 if (type == 'A') //ISO14443_A
85 1 {
86 2 ClearBitMask(RegControl,0x08); //Crypto1On 该位指示Crypto1 单元打开因此与卡的所有数据通信都被加密
-
87 2
88 2 WriteRawRC(RegClockQControl,0x0);//Q时钟复位
89 2 WriteRawRC(RegClockQControl,0x40);//Q时钟写入0x40,复位后或从卡接收数据后自动校准
90 2 Delay_50us(2); // wait approximately 100 us - calibration in progress
91 2 ClearBitMask(RegClockQControl,0x40);//清掉该位
92 2 WriteRawRC(RegBitPhase,0xAD); //写BitPhase寄存器
93 2 WriteRawRC(RegRxThreshold,0xFF); //选择位解码器的阀值
94 2 WriteRawRC(RegRxControl2,0x01); //RxControl2寄存器写入01H,曼切斯特内部解码器
95 2
96 2 WriteRawRC(RegTimerControl,0x02);//设置数据发送完成后停止定时器
97 2 WriteRawRC(RegIRqPinConfig,0x03);//配置IRQ管脚的输出状态,中端口输出低有效使能
98 2
99 2 M500PcdRfReset(1);
100 2
101 2 PcdSetTmo(106);
102 2 DelayMs(1);
103 2 PcdAntennaOn(); //开启天线
104 2
105 2 }
106 1
107 1 else{ return -1; }
108 1 return MI_OK;
109 1 }
110 ///////////////////////////////////////////////////////////////////////
111 // Reset Rf Card
112 ///////////////////////////////////////////////////////////////////////
113 char M500PcdRfReset(unsigned char ms)
114 {
115 1 char status = MI_OK;
116 1
C51 COMPILER V7.06 SLRC500 05/01/2009 01:52:10 PAGE 3
117 1 if(ms)
118 1 {
119 2 ClearBitMask(RegTxControl,0x03); //TX2RFEn、TX1RFEn位清零,复位天线
120 2 DelayMs(2);
121 2 SetBitMask(RegTxControl,0x03);
122 2 }
123 1 else
124 1 {
125 2 ClearBitMask(RegTxControl,0x03);
126 2 }
127 1 return status;
128 1 }
129
130 /////////////////////////////////////////////////////////////////////
131 //读RC500寄存器位
132 //input:Address=寄存器地址
133 //ouput:读出的值
134 /////////////////////////////////////////////////////////////////////
135 unsigned char ReadRawRC(unsigned char Address)
136 {
137 1 //unsigned char pdata *pa;
138 1 // unsigned i;
139 1 // pa = Address;
140 1 // i = *pa;
141 1 // return(i);
142 1 return inportb(Gpbase+Address);
143 1 }
144
145 /////////////////////////////////////////////////////////////////////
146 //写RC500寄存器
147 //input:Address=寄存器地址
148 // value=要写入的值
149 /////////////////////////////////////////////////////////////////////
150 void WriteRawRC(unsigned char Address, unsigned char value)
151 {
152 1 // unsigned char pdata *pa;
153 1 // pa = Address;
154 1 // *pa = value;
155 1 outportb(Gpbase+Address,value);
156 1
157 1 }
158
159
160 /////////////////////////////////////////////////////////////////////
161 //置RC500寄存器位
162 //input:reg=寄存器地址
163 // mask=置位值
164 /////////////////////////////////////////////////////////////////////
165 void SetBitMask(unsigned char reg,unsigned char mask)
166 {
167 1 char tmp = 0x0;
168 1 tmp = ReadRawRC(reg);
169 1 WriteRawRC(reg,tmp | mask); // set bit mask
170 1 }
171
172 /////////////////////////////////////////////////////////////////////
173 //清RC500寄存器位
174 //input:reg=寄存器地址
175 // mask=清位值
176 /////////////////////////////////////////////////////////////////////
177 void ClearBitMask(unsigned char reg,unsigned char mask)
178 {
C51 COMPILER V7.06 SLRC500 05/01/2009 01:52:10 PAGE 4
179 1 char tmp = 0x0;
180 1 tmp = ReadRawRC(reg);
181 1 WriteRawRC(reg, tmp & ~mask); // clear bit mask
182 1 }
183
184 /////////////////////////////////////////////////////////////////////
185 //设置RC500定时器
186 //input:tmolength=设置值
187 /////////////////////////////////////////////////////////////////////
188 void PcdSetTmo(unsigned char tmoLength)
189 {
190 1 switch(tmoLength)//TAutoRestart 如果设置为1 定时器从TReloadValue 处自动重新开始向下计数而不是向下计数到
-零,如果设置为0 定时器减少到零并且TimerIRq 置位
191 1 {
192 2 case 0: // (0.302 ms) FWI=0
193 2 WriteRawRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
194 2 WriteRawRC(RegTimerReload,0x21);// TReloadVal = 'h21 =33(dec)
195 2 break;
196 2 case 1: // (0.604 ms) FWI=1
197 2 WriteRawRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
198 2 WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
199 2 break;
200 2 case 2: // (1.208 ms) FWI=2
201 2 WriteRawRC(RegTimerClock,0x07); // TAutoRestart=0,TPrescale=128
202 2 WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
203 2 break;
204 2 case 3: // (2.416 ms) FWI=3
205 2 WriteRawRC(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
206 2 WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
207 2 break;
208 2 case 4: // (4.833 ms) FWI=4
209 2 WriteRawRC(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128
210 2 WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
211 2 break;
212 2 case 5: // (9.666 ms) FWI=5
213 2 WriteRawRC(RegTimerClock,0x0B); // TAutoRestart=0,TPrescale=16*128
214 2 WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
215 2 break;
216 2 case 6: // (19.33 ms) FWI=6
217 2 WriteRawRC(RegTimerClock,0x0B); // TAutoRestart=0,TPrescale=16*128
218 2 WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
219 2 break;
220 2 case 7: // (38.66 ms) FWI=7
221 2 WriteRawRC(RegTimerClock,0x0D); // TAutoRestart=0,TPrescale=64*128
222 2 WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
223 2 break;
224 2 case 8: // (77.32 ms) FWI=8
225 2 WriteRawRC(RegTimerClock,0x0D); // TAutoRestart=0,TPrescale=64*128
226 2 WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
227 2 break;
228 2 case 9: // (154.6 ms) FWI=9
229 2 WriteRawRC(RegTimerClock,0x0F); // TAutoRestart=0,TPrescale=256*128
230 2 WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h41 =65(dec)
231 2 break;
232 2 case 10: // (309.3 ms) FWI=10
233 2 WriteRawRC(RegTimerClock,0x0F); // TAutoRestart=0,TPrescale=256*128
234 2 WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec)
235 2 break;
236 2 case 11: // (618.6 ms) FWI=11
237 2 WriteRawRC(RegTimerClock,0x13); // TAutoRestart=0,TPrescale=4096*128
238 2 WriteRawRC(RegTimerReload,0x11);// TReloadVal = 'h21 =17(dec)
239 2 break;
C51 COMPILER V7.06 SLRC500 05/01/2009 01:52:10 PAGE 5
240 2 case 12: // (1.2371 s) FWI=12
241 2 WriteRawRC(RegTimerClock,0x13); // TAutoRestart=0,TPrescale=4096*128
242 2 WriteRawRC(RegTimerReload,0x21);// TReloadVal = 'h41 =33(dec)
243 2 break;
244 2 case 13: // (2.4742 s) FWI=13
245 2 WriteRawRC(RegTimerClock,0x13); // TAutoRestart=0,TPrescale=4096*128
246 2 WriteRawRC(RegTimerReload,0x41);// TReloadVal = 'h81 =65(dec)
247 2 break;
248 2 case 14: // (4.9485 s) FWI=14
249 2 WriteRawRC(RegTimerClock,0x13); // TAutoRestart=0,TPrescale=4096*128
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -