📄 m500aucend.lst
字号:
161 1 }
162 //********************发送应答信号子程序,是单片机发出的*********OK!
163 //Clock out an acknowledge bit(low)
164 //SCL expected low on entry.Return with SCL,SDA low
165 void MAck_I2c()
166 {
167 1 SDA=0;
168 1 wait_I2c();
169 1 SCL=1;
170 1 wait_I2c();
171 1 SCL=0;
172 1 _nop_();
173 1 _nop_();
174 1 SDA=1;
175 1 }
176 //;*****************发送非应答信号,单片机发出******* OK!
177 //Clock out a negative acknowledge bit(high)
178 //SCL expected low on entry.Return with SCL low,SDA high
179 void MNAck_I2c()
180 {
181 1 SDA=1;
182 1 wait_I2c();
183 1 SCL=1;
184 1 wait_I2c();
185 1 SCL=0;
186 1 _nop_();
187 1 _nop_();
188 1 SDA=0;
189 1 }
190 //;*******************************************************OK!
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 6
191 //;发送字节子程序 *
192 //;字节数据放入ACC *
193 //;每发送一字节要调用一次CACK子程序,取应答位 *
194 //;SCL,SDA expected low on entry.Return with SCL low *
195 //;*******************************************************
196 void SendByte(uchar c)
197 {
198 1 uchar BitCnt;
199 1 for(BitCnt=0;BitCnt<8;BitCnt++)
200 1 {if((c<<BitCnt)&0x80)SDA=1;
201 2 else SDA=0;
202 2 _nop_();
203 2 SCL=1;
204 2 wait_I2c();
205 2 SCL=0;
206 2 wait_I2c();
207 2 }
208 1 _nop_();
209 1 _nop_();
210 1 SDA=1;
211 1 _nop_();
212 1 _nop_();
213 1 SCL=1;
214 1 wait_I2c();
215 1 if(SDA==1)ack=0;
216 1 else ack=1;
217 1 SCL=0;
218 1 _nop_();
219 1 _nop_();
220 1 }
221 //;**********************************************************
222 //;读取字节子程序 OK!
223 //;读出的值在ACC
224 //;每取一字节要发送一个应答/非应答信号
225 //;SCL expected low on entry.Return with SCL low
226 //;**********************************************************
227 uchar RcvByte()
228 {
229 uchar retc;
230 uchar BitCnt;
231 retc=0;
232 SDA=1;
233 for(BitCnt=0;BitCnt<8;BitCnt++)
234 {
235 _nop_();
236 SCL=0;
237 wait_I2c();
238 SCL=1;
239 wait_I2c();
240 retc=retc<<1;
241 if(SDA==1)retc=retc+1;
242 _nop_();
243 _nop_();
244 }
245 SCL=0;
246 _nop_();
247 _nop_();
248 return(retc);
249 }
250 //向器件指定子地址写N个数据
251 //;入口参数: 器件从地址sla、器件子地址suba 、发送数据缓冲区*s、发送字节数no
252 bit IWrStr(uchar sla,uchar suba,uchar *s,uchar no)
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 7
253 {
254 uchar i;
255 start_I2c();
256 SendByte(sla);
257 if(ack==0)return(0);
258 SendByte(suba);
259 if(ack==0)return(0);
260 for(i=0;i<no;i++)
261 {
262 SendByte(*s);
263 if(ack==0)return(0);
264 s++;
265 }
266 stop_I2c();
267 return(1);
268 }
269 //;向器件指定子地址读取N个数据
270 //;入口参数: 器件从地址sla、器件子地址suba、接收字节数no
271 //;出口参数: 接收数据缓冲区*s
272 bit IRdStr(uchar sla,uchar suba,uchar *s,uchar no)
273 {
274 uchar i;
275 start_I2c();
276 SendByte(sla);
277 if(ack==0)return(0);
278 SendByte(suba);
279 if(ack==0)return(0);
280 start_I2c();
281 SendByte(sla+1);
282 if(ack==0)return(0);
283 for(i=0;i<no-1;i++)
284 {
285 *s=RcvByte();
286 MAck_I2c();
287 s++;
288 }
289 *s=RcvByte();
290 MNAck_I2c();
291 stop_I2c();
292 return(1);
293 }
294 ///////////////////////////////////结束/////////
295 ////**************下面是rc500的子函数
296
297 ///////////////////////////////////////////////////////////////////////
298 // 往一个地址写一个数据
299 ///////////////////////////////////////////////////////////////////////
300 void WriteRawIO(unsigned char Address,unsigned char value)
301 {
302 XBYTE[Address]=value;
303 }
304
305 ///////////////////////////////////////////////////////////////////////
306 // 从一个地址读出一个数据
307 ///////////////////////////////////////////////////////////////////////
308 unsigned char ReadRawIO(unsigned char Address)
309 {
310 return XBYTE[Address];
311 }
312
313 ///////////////////////////////////////////////////////////////////////
314 // 往一个地址写一个数据(EEPROM)
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 8
315 ///////////////////////////////////////////////////////////////////////
316 void WriteIO(unsigned char Address, unsigned char value)
317 {
318 WriteRawIO(0x00,GetRegPage(Address));
319 WriteRawIO(Address,value);
320 }
321
322 ///////////////////////////////////////////////////////////////////////
323 // 从一个地址读出一个数据(EEPROM)
324 ///////////////////////////////////////////////////////////////////////
325 unsigned char ReadIO(unsigned char Address)
326 {
327 WriteRawIO(0x00,GetRegPage(Address));
328 return ReadRawIO(Address);
329 }
330
331 ///////////////////////////////////////////////////////////////////////
332 // 设置定时时间
333 ///////////////////////////////////////////////////////////////////////
334 void M500PcdSetTmo(unsigned char tmoLength)
335 {
336 switch(tmoLength)
337 {
338 case 1:
339 WriteIO(RegTimerClock,0x07);
340 WriteIO(RegTimerReload,0x6a);
341 break;
342 case 2:
343 WriteIO(RegTimerClock,0x07);
344 WriteIO(RegTimerReload,0xa0);
345 break;
346 case 3:
347 WriteIO(RegTimerClock,0x09);
348 WriteIO(RegTimerReload,0xa0);
349 break;
350 case 4:
351 WriteIO(RegTimerClock,0x09);
352 WriteIO(RegTimerReload,0xff);
353 break;
354 case 5:
355 WriteIO(RegTimerClock,0x0b);
356 WriteIO(RegTimerReload,0xff);
357 break;
358 case 6:
359 WriteIO(RegTimerClock,0x0d);
360 WriteIO(RegTimerReload,0xff);
361 break;
362 case 7:
363 WriteIO(RegTimerClock,0x0f);
364 WriteIO(RegTimerReload,0xff);
365 break;
366 default:
367 WriteIO(RegTimerClock,0x07);
368 WriteIO(RegTimerReload,tmoLength);
369 break;
370 }
371 }
372
373 ///////////////////////////////////////////////////////////////////////
374 // Request Command defined in ISO14443(Mifare)
375 ///////////////////////////////////////////////////////////////////////
376 char M500PcdCmd(unsigned char cmd,
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 9
377 volatile unsigned char data *rcv,
378 MfCmdInfo idata *info)
379 {
380 char idata status = MI_OK;
381 char idata tmpStatus ;
382 unsigned char idata lastBits;
383 unsigned int idata timecnt = 0;
384 unsigned char idata irqEn = 0x00;
385 unsigned char idata waitFor = 0x00;
386 unsigned char idata timerCtl = 0x00;
387
388 WriteIO(RegInterruptEn,0x7F);
389 WriteIO(RegInterruptRq,0x7F);
390 WriteIO(RegCommand,PCD_IDLE);
391
392 FlushFIFO();
393 MpIsrInfo = info;
394 MpIsrOut = rcv;
395 info->irqSource = 0x00;
396 switch(cmd)
397 {
398 case PCD_IDLE:
399 irqEn = 0x00;
400 waitFor = 0x00;
401 break;
402 case PCD_WRITEE2:
403 irqEn = 0x11;
404 waitFor = 0x10;
405 break;
406 case PCD_READE2:
407 irqEn = 0x07;
408 waitFor = 0x04;
409 break;
410 case PCD_LOADCONFIG:
411 case PCD_LOADKEYE2:
412 case PCD_AUTHENT1:
413 irqEn = 0x05;
414 waitFor = 0x04;
415 break;
416 case PCD_CALCCRC:
417 irqEn = 0x11;
418 waitFor = 0x10;
419 break;
420 case PCD_AUTHENT2:
421 irqEn = 0x04;
422 waitFor = 0x04;
423 break;
424 case PCD_RECEIVE:
425 info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);
426 irqEn = 0x06;
427 waitFor = 0x04;
428 break;
429 case PCD_LOADKEY:
430 irqEn = 0x05;
431 waitFor = 0x04;
432 break;
433 case PCD_TRANSMIT:
434 irqEn = 0x05;
435 waitFor = 0x04;
436 break;
437 case PCD_TRANSCEIVE:
438 info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 10
439 irqEn = 0x3D;
440 waitFor = 0x04;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -