rc522.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. #include "rc522.h"
  2. //void system_delay_us(unsigned int k)
  3. //{
  4. // system_delay_us(k);
  5. //}
  6. void SPIWriteByte(unsigned char infor)
  7. {
  8. unsigned int counter;
  9. for(counter=0;counter<8;counter++)
  10. {
  11. if(infor&0x80)
  12. IC_MOSI_PIN = 1;
  13. else
  14. IC_MOSI_PIN = 0;
  15. system_delay_us(3);
  16. IC_SCK_PIN = 0;
  17. system_delay_us(1);
  18. IC_SCK_PIN = 1;
  19. system_delay_us(3);
  20. infor <<= 1;
  21. }
  22. }
  23. unsigned char SPIReadByte(void)
  24. {
  25. unsigned int counter;
  26. unsigned char SPI_Data;
  27. for(counter=0;counter<8;counter++)
  28. {
  29. SPI_Data<<=1;
  30. IC_SCK_PIN = 0;
  31. system_delay_us(3);
  32. if(IC_MISO_PIN == 1)
  33. SPI_Data |= 0x01;
  34. system_delay_us(2);
  35. IC_SCK_PIN = 1;
  36. system_delay_us(3);
  37. }
  38. return SPI_Data;
  39. }
  40. /////////////////////////////////////////////////////////////////////
  41. //功 能:读RC632寄存器
  42. //参数说明:Address[IN]:寄存器地址
  43. //返 回:读出的值
  44. /////////////////////////////////////////////////////////////////////
  45. unsigned char ReadRawRC(unsigned char Address)
  46. {
  47. unsigned char ucAddr;
  48. unsigned char ucResult=0;
  49. IC_SDA_PIN = 0;
  50. ucAddr = ((Address<<1)&0x7E)|0x80;//地址变换,SPI的读写地址有要求
  51. SPIWriteByte(ucAddr);
  52. ucResult=SPIReadByte();
  53. IC_SDA_PIN = 1;
  54. return ucResult;
  55. }
  56. /////////////////////////////////////////////////////////////////////
  57. //功 能:写RC632寄存器
  58. //参数说明:Address[IN]:寄存器地址
  59. // value[IN]:写入的值
  60. /////////////////////////////////////////////////////////////////////
  61. void WriteRawRC(unsigned char Address, unsigned char value)
  62. {
  63. unsigned char ucAddr;
  64. Address <<= 1;
  65. ucAddr = (Address&0x7e);
  66. IC_SDA_PIN = 0;
  67. SPIWriteByte(ucAddr);
  68. SPIWriteByte(value);
  69. IC_SDA_PIN = 1;
  70. }
  71. /////////////////////////////////////////////////////////////////////
  72. //功 能:置RC522寄存器位
  73. //参数说明:reg[IN]:寄存器地址
  74. // mask[IN]:置位值
  75. /////////////////////////////////////////////////////////////////////
  76. void SetBitMask(unsigned char reg,unsigned char mask)
  77. {
  78. char tmp = 0x0;
  79. tmp = ReadRawRC(reg);
  80. WriteRawRC(reg,tmp | mask); // set bit mask
  81. }
  82. /////////////////////////////////////////////////////////////////////
  83. //功 能:清RC522寄存器位
  84. //参数说明:reg[IN]:寄存器地址
  85. // mask[IN]:清位值
  86. /////////////////////////////////////////////////////////////////////
  87. void ClearBitMask(unsigned char reg,unsigned char mask)
  88. {
  89. char tmp = 0x0;
  90. tmp = ReadRawRC(reg);
  91. WriteRawRC(reg, tmp & ~mask); // clear bit mask
  92. }
  93. /////////////////////////////////////////////////////////////////////
  94. //开启天线
  95. //每次启动或关闭天险发射之间应至少有1ms的间隔
  96. /////////////////////////////////////////////////////////////////////
  97. void PcdAntennaOn(void)
  98. {
  99. unsigned char i;
  100. i = ReadRawRC(TxControlReg);
  101. if (!(i & 0x03))
  102. {
  103. SetBitMask(TxControlReg, 0x03);
  104. }
  105. }
  106. /////////////////////////////////////////////////////////////////////
  107. //关闭天线
  108. /////////////////////////////////////////////////////////////////////
  109. void PcdAntennaOff(void)
  110. {
  111. ClearBitMask(TxControlReg, 0x03);
  112. }
  113. /////////////////////////////////////////////////////////////////////
  114. //功 能:复位RC522
  115. //返 回: 成功返回MI_OK
  116. /////////////////////////////////////////////////////////////////////
  117. void PcdReset(void)
  118. {
  119. //PORTD|=(1<<RC522RST);
  120. IC_RST_PIN = 1;
  121. system_delay_us(1);
  122. //PORTD&=~(1<<RC522RST);
  123. IC_RST_PIN = 0;
  124. system_delay_us(1);
  125. //PORTD|=(1<<RC522RST);
  126. IC_RST_PIN = 1;
  127. system_delay_us(1);
  128. WriteRawRC(0x01,0x0f);
  129. //while(ReadRawRC(0x01)&0x10);//复位时关掉 不然没识别到卡片会卡死
  130. system_delay_us(10);
  131. WriteRawRC(ModeReg,0x3D); //定义发送和接收常用模式 和Mifare卡通讯,CRC初始值0x6363
  132. WriteRawRC(TReloadRegL,30); //16位定时器低位
  133. WriteRawRC(TReloadRegH,0); //16位定时器高位
  134. WriteRawRC(TModeReg,0x8D); //定义内部定时器的设置
  135. WriteRawRC(TPrescalerReg,0x3E); //设置定时器分频系数
  136. WriteRawRC(TxAutoReg,0x40); // 调制发送信号为100%ASK
  137. //return MI_OK;
  138. }
  139. //////////////////////////////////////////////////////////////////////
  140. //设置RC632的工作方式
  141. //////////////////////////////////////////////////////////////////////
  142. void M500PcdConfigISOType(unsigned char type)
  143. {
  144. if (type == 'A') //ISO14443_A
  145. {
  146. ClearBitMask(Status2Reg,0x08);
  147. WriteRawRC(ModeReg,0x3D);//3F
  148. WriteRawRC(RxSelReg,0x86);//84
  149. WriteRawRC(RFCfgReg,0x7F); //4F
  150. WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
  151. WriteRawRC(TReloadRegH,0);
  152. WriteRawRC(TModeReg,0x8D);
  153. WriteRawRC(TPrescalerReg,0x3E);
  154. system_delay_us(2);
  155. PcdAntennaOn();//开天线
  156. }
  157. // else return (-1);
  158. //return MI_OK;
  159. }
  160. /////////////////////////////////////////////////////////////////////
  161. //功 能:通过RC522和ISO14443卡通讯
  162. //参数说明:Command[IN]:RC522命令字
  163. // pInData[IN]:通过RC522发送到卡片的数据
  164. // InLenByte[IN]:发送数据的字节长度
  165. // pOutData[OUT]:接收到的卡片返回数据
  166. // *pOutLenBit[OUT]:返回数据的位长度
  167. /////////////////////////////////////////////////////////////////////
  168. char PcdComMF522(unsigned char Command, //RC522命令字
  169. unsigned char *pInData, //通过RC522发送到卡片的数据
  170. unsigned char InLenByte, //发送数据的字节长度
  171. unsigned char *pOutData, //接收到的卡片返回数据
  172. unsigned int *pOutLenBit) //返回数据的位长度
  173. {
  174. char status = MI_ERR;
  175. unsigned char irqEn = 0x00;
  176. unsigned char waitFor = 0x00;
  177. unsigned char lastBits;
  178. unsigned char n;
  179. unsigned int i;
  180. switch (Command)
  181. {
  182. case PCD_AUTHENT: //Mifare认证
  183. irqEn = 0x12; //允许错误中断请求ErrIEn 允许空闲中断IdleIEn
  184. waitFor = 0x10; //认证寻卡等待时候 查询空闲中断标志位
  185. break;
  186. case PCD_TRANSCEIVE: //接收发送 发送接收
  187. irqEn = 0x77; //允许TxIEn RxIEn IdleIEn LoAlertIEn ErrIEn TimerIEn
  188. waitFor = 0x30; //寻卡等待时候 查询接收中断标志位与 空闲中断标志位
  189. break;
  190. default:
  191. break;
  192. }
  193. WriteRawRC(ComIEnReg,irqEn|0x80); //IRqInv置位管脚IRQ与Status1Reg的IRq位的值相反
  194. ClearBitMask(ComIrqReg,0x80); //Set1该位清零时,CommIRqReg的屏蔽位清零
  195. WriteRawRC(CommandReg,PCD_IDLE); //写空闲命令
  196. SetBitMask(FIFOLevelReg,0x80); //置位FlushBuffer清除内部FIFO的读和写指针以及ErrReg的BufferOvfl标志位被清除
  197. for (i=0; i<InLenByte; i++)
  198. { WriteRawRC(FIFODataReg, pInData[i]); } //写数据进FIFOdata
  199. WriteRawRC(CommandReg, Command); //写命令
  200. if (Command == PCD_TRANSCEIVE)
  201. { SetBitMask(BitFramingReg,0x80); } //StartSend置位启动数据发送 该位与收发命令使用时才有效
  202. i = 1000;//根据时钟频率调整,操作M1卡最大等待时间25ms
  203. do //认证 与寻卡等待时间
  204. {
  205. n = ReadRawRC(ComIrqReg); //查询事件中断
  206. i--;
  207. }
  208. while ((i!=0) && !(n&0x01) && !(n&waitFor)); //退出条件i=0,定时器中断,与写空闲命令
  209. ClearBitMask(BitFramingReg,0x80); //清理允许StartSend位
  210. if (i!=0)
  211. {
  212. if(!(ReadRawRC(ErrorReg)&0x1B)) //读错误标志寄存器BufferOfI CollErr ParityErr ProtocolErr
  213. {
  214. status = MI_OK;
  215. if (n & irqEn & 0x01) //是否发生定时器中断
  216. { status = MI_NOTAGERR; }
  217. if (Command == PCD_TRANSCEIVE)
  218. {
  219. n = ReadRawRC(FIFOLevelReg); //读FIFO中保存的字节数
  220. lastBits = ReadRawRC(ControlReg) & 0x07; //最后接收到得字节的有效位数
  221. if (lastBits)
  222. { *pOutLenBit = (n-1)*8 + lastBits; } //N个字节数减去1(最后一个字节)+最后一位的位数 读取到的数据总位数
  223. else
  224. { *pOutLenBit = n*8; } //最后接收到的字节整个字节有效
  225. if (n == 0)
  226. { n = 1; }
  227. if (n > MAXRLEN)
  228. { n = MAXRLEN; }
  229. for (i=0; i<n; i++)
  230. { pOutData[i] = ReadRawRC(FIFODataReg); }
  231. }
  232. }
  233. else
  234. { status = MI_ERR; }
  235. }
  236. SetBitMask(ControlReg,0x80); // stop timer now
  237. WriteRawRC(CommandReg,PCD_IDLE);
  238. return status;
  239. }
  240. /////////////////////////////////////////////////////////////////////
  241. //功 能:寻卡
  242. //参数说明: req_code[IN]:寻卡方式
  243. // 0x52 = 寻感应区内所有符合14443A标准的卡
  244. // 0x26 = 寻未进入休眠状态的卡
  245. // pTagType[OUT]:卡片类型代码
  246. // 0x4400 = Mifare_UltraLight
  247. // 0x0400 = Mifare_One(S50)
  248. // 0x0200 = Mifare_One(S70)
  249. // 0x0800 = Mifare_Pro(X)
  250. // 0x4403 = Mifare_DESFire
  251. //返 回: 成功返回MI_OK
  252. /////////////////////////////////////////////////////////////////////
  253. char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  254. {
  255. char status;
  256. unsigned int unLen;
  257. unsigned char ucComMF522Buf[MAXRLEN];
  258. ClearBitMask(Status2Reg,0x08); //清理指示MIFARECyptol单元接通以及所有卡的数据通信被加密的情况
  259. WriteRawRC(BitFramingReg,0x07); // 发送的最后一个字节的 七位
  260. SetBitMask(TxControlReg,0x03); //TX1,TX2管脚的输出信号传递经发送调制的13.56的能量载波信号
  261. ucComMF522Buf[0] = req_code; //存入 卡片命令字
  262. status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen); //寻卡
  263. if ((status == MI_OK) && (unLen == 0x10)) //寻卡成功返回卡类型
  264. {
  265. *pTagType = ucComMF522Buf[0];
  266. *(pTagType+1) = ucComMF522Buf[1];
  267. }
  268. else
  269. {
  270. status = MI_ERR;
  271. }
  272. return status;
  273. }
  274. /////////////////////////////////////////////////////////////////////
  275. //功 能:防冲撞
  276. //参数说明: pSnr[OUT]:卡片序列号,4字节
  277. //返 回: 成功返回MI_OK
  278. /////////////////////////////////////////////////////////////////////
  279. char PcdAnticoll(unsigned char *pSnr)
  280. {
  281. char status;
  282. unsigned char i,snr_check=0;
  283. unsigned int unLen;
  284. unsigned char ucComMF522Buf[MAXRLEN];
  285. ClearBitMask(Status2Reg,0x08); //清MFCryptol On位 只有成功执行MFAuthent命令后,该位才能置位
  286. WriteRawRC(BitFramingReg,0x00); //清理寄存器 停止收发
  287. ClearBitMask(CollReg,0x80); //清ValuesAfterColl所有接收的位在冲突后被清除
  288. // WriteRawRC(BitFramingReg,0x07); // 发送的最后一个字节的 七位
  289. // SetBitMask(TxControlReg,0x03); //TX1,TX2管脚的输出信号传递经发送调制的13.56的能量载波信号
  290. ucComMF522Buf[0] = 0x93; //卡片防冲突命令
  291. ucComMF522Buf[1] = 0x20;
  292. status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);//与卡片通信
  293. if (status == MI_OK) //通信成功
  294. {
  295. for (i=0; i<4; i++)
  296. {
  297. *(pSnr+i) = ucComMF522Buf[i]; //读出UID
  298. snr_check ^= ucComMF522Buf[i];
  299. }
  300. if (snr_check != ucComMF522Buf[i])
  301. { status = MI_ERR; }
  302. }
  303. SetBitMask(CollReg,0x80);
  304. return status;
  305. }
  306. /////////////////////////////////////////////////////////////////////
  307. //用MF522计算CRC16函数
  308. /////////////////////////////////////////////////////////////////////
  309. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  310. {
  311. unsigned char i,n;
  312. ClearBitMask(DivIrqReg,0x04);
  313. WriteRawRC(CommandReg,PCD_IDLE);
  314. SetBitMask(FIFOLevelReg,0x80);
  315. for (i=0; i<len; i++)
  316. { WriteRawRC(FIFODataReg, *(pIndata+i)); }
  317. WriteRawRC(CommandReg, PCD_CALCCRC);
  318. i = 0xFF;
  319. do
  320. {
  321. n = ReadRawRC(DivIrqReg);
  322. i--;
  323. }
  324. while ((i!=0) && !(n&0x04));
  325. pOutData[0] = ReadRawRC(CRCResultRegL);
  326. pOutData[1] = ReadRawRC(CRCResultRegM);
  327. }
  328. /////////////////////////////////////////////////////////////////////
  329. //功 能:选定卡片
  330. //参数说明: pSnr[IN]:卡片序列号,4字节
  331. //返 回: 成功返回MI_OK
  332. /////////////////////////////////////////////////////////////////////
  333. char PcdSelect(unsigned char *pSnr)
  334. {
  335. char status;
  336. unsigned char i;
  337. unsigned int unLen;
  338. unsigned char ucComMF522Buf[MAXRLEN];
  339. ucComMF522Buf[0] = PICC_ANTICOLL1;
  340. ucComMF522Buf[1] = 0x70;
  341. ucComMF522Buf[6] = 0;
  342. for (i=0; i<4; i++)
  343. {
  344. ucComMF522Buf[i+2] = *(pSnr+i);
  345. ucComMF522Buf[6] ^= *(pSnr+i);
  346. }
  347. CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  348. ClearBitMask(Status2Reg,0x08);
  349. status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  350. if ((status == MI_OK) && (unLen == 0x18))
  351. { status = MI_OK; }
  352. else
  353. { status = MI_ERR; }
  354. return status;
  355. }
  356. /////////////////////////////////////////////////////////////////////
  357. //功 能:验证卡片密码
  358. //参数说明: auth_mode[IN]: 密码验证模式
  359. // 0x60 = 验证A密钥
  360. // 0x61 = 验证B密钥
  361. // addr[IN]:块地址
  362. // pKey[IN]:密码
  363. // pSnr[IN]:卡片序列号,4字节
  364. //返 回: 成功返回MI_OK
  365. /////////////////////////////////////////////////////////////////////
  366. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  367. {
  368. char status;
  369. unsigned int unLen;
  370. unsigned char i,ucComMF522Buf[MAXRLEN];
  371. ucComMF522Buf[0] = auth_mode;
  372. ucComMF522Buf[1] = addr;
  373. for (i=0; i<6; i++)
  374. { ucComMF522Buf[i+2] = *(pKey+i); }
  375. for (i=0; i<6; i++)
  376. { ucComMF522Buf[i+8] = *(pSnr+i); }
  377. // memcpy(&ucComMF522Buf[2], pKey, 6);
  378. // memcpy(&ucComMF522Buf[8], pSnr, 4);
  379. status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  380. if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  381. { status = MI_ERR; }
  382. return status;
  383. }
  384. /////////////////////////////////////////////////////////////////////
  385. //功 能:写数据到M1卡一块
  386. //参数说明: addr[IN]:块地址
  387. // pData[IN]:写入的数据,16字节
  388. //返 回: 成功返回MI_OK
  389. /////////////////////////////////////////////////////////////////////
  390. char PcdWrite(unsigned char addr,unsigned char *pData)
  391. {
  392. char status;
  393. unsigned int unLen;
  394. unsigned char i,ucComMF522Buf[MAXRLEN];
  395. ucComMF522Buf[0] = PICC_WRITE;
  396. ucComMF522Buf[1] = addr;
  397. CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  398. status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  399. if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  400. { status = MI_ERR; }
  401. if (status == MI_OK)
  402. {
  403. //memcpy(ucComMF522Buf, pData, 16);
  404. for (i=0; i<16; i++)
  405. { ucComMF522Buf[i] = *(pData+i); }
  406. CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
  407. status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  408. if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  409. { status = MI_ERR; }
  410. }
  411. return status;
  412. }
  413. /////////////////////////////////////////////////////////////////////
  414. //功 能:读取M1卡一块数据
  415. //参数说明: addr[IN]:块地址
  416. // pData[OUT]:读出的数据,16字节
  417. //返 回: 成功返回MI_OK
  418. /////////////////////////////////////////////////////////////////////
  419. char PcdRead(unsigned char addr,unsigned char *pData)
  420. {
  421. char status;
  422. unsigned int unLen;
  423. unsigned char i,ucComMF522Buf[MAXRLEN];
  424. ucComMF522Buf[0] = PICC_READ;
  425. ucComMF522Buf[1] = addr;
  426. CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  427. status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  428. if ((status == MI_OK) && (unLen == 0x90))
  429. // { memcpy(pData, ucComMF522Buf, 16); }
  430. {
  431. for (i=0; i<16; i++)
  432. { *(pData+i) = ucComMF522Buf[i]; }
  433. }
  434. else
  435. { status = MI_ERR; }
  436. return status;
  437. }
  438. /////////////////////////////////////////////////////////////////////
  439. //功 能:命令卡片进入休眠状态
  440. //返 回: 成功返回MI_OK
  441. /////////////////////////////////////////////////////////////////////
  442. char PcdHalt(void)
  443. {
  444. // char status;
  445. unsigned int unLen;
  446. unsigned char ucComMF522Buf[MAXRLEN];
  447. ucComMF522Buf[0] = PICC_HALT;
  448. ucComMF522Buf[1] = 0;
  449. CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  450. PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  451. // status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  452. return MI_OK;
  453. }
  454. void RC522_HAL_Init(void)
  455. {
  456. // IC_SDA P2_0
  457. // P2DIR |= 1<<0;
  458. // P2INP |= 1<<0; //设置io口为三态
  459. // P2SEL &= ~(1<<0);//设置为普通io口
  460. //
  461. // // IC_SCK P0_7
  462. // P0DIR |= 1<<7;
  463. // P0INP |= 1<<7;
  464. // P0SEL &= ~(1<<7);
  465. //
  466. // // IC_MOSI P0_6
  467. // P0DIR |= 1<<6;
  468. // P0INP |= 1<<6;
  469. // P0SEL &= ~(1<<6);
  470. //
  471. // // IC_MISO P0_5
  472. // P0DIR |= 1<<5;
  473. // P0INP |= 1<<5;
  474. // P0SEL &= ~(1<<5);
  475. //
  476. // // IC_RST P0_4
  477. // P0DIR &= ~(1<<4);
  478. // P0INP &= ~(1<<4);
  479. // P0SEL &= ~(1<<4);
  480. IC_SDA_PIN_OUT();
  481. IC_SCK_PIN_OUT();
  482. IC_MOSI_PIN_OUT();
  483. IC_MISO_PIN_OUT();
  484. IC_RST_PIN_IN();
  485. IC_SCK_PIN = 1;
  486. IC_SDA_PIN = 1;
  487. PcdReset();
  488. M500PcdConfigISOType('A');//设置工作方式
  489. }
  490. //void IC_test()
  491. //{
  492. // uchar ucTagType[4];
  493. // uchar find=0xaa;
  494. // uchar ret;
  495. //
  496. // while(1)
  497. // {
  498. // //16进制转ASC码
  499. // char i;
  500. // char Card_Id[8]; //存放32位卡号
  501. // uchar asc_16[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  502. //
  503. // ret = PcdRequest(0x52,ucTagType);//寻卡
  504. // if(ret != 0x26)
  505. // ret = PcdRequest(0x52,ucTagType);
  506. // if(ret != 0x26)
  507. // find = 0xaa;
  508. // if((ret == 0x26)&&(find == 0xaa))
  509. // {
  510. // if(PcdAnticoll(ucTagType) == 0x26);//防冲撞
  511. // {
  512. // UartSend_String("The Card ID is: ",16);
  513. //
  514. // //16进制转ASC码
  515. // for(i=0;i<4;i++)
  516. // {
  517. // Card_Id[i*2]=asc_16[ucTagType[i]/16];
  518. // Card_Id[i*2+1]=asc_16[ucTagType[i]%16];
  519. // }
  520. // UartSend_String(Card_Id,8);
  521. // UartSend_String("\n",1);
  522. //
  523. // find = 0x00;
  524. // }
  525. // }
  526. // }
  527. //}
  528. //void IC_CMT(uchar *UID,uchar *KEY,uchar RW,char *Dat)
  529. //{
  530. // uchar status = 0xab;
  531. // uchar qq[16]=0;//IC卡的类型
  532. // uchar IC_uid[16]=0;//IC卡的UID
  533. //
  534. // UartSend(PcdRequest(0x52,qq));//寻卡
  535. // UartSend(PcdAnticoll(IC_uid));//防冲撞
  536. //
  537. // UartSend(PcdSelect(UID));//选定卡
  538. //
  539. // UartSend(PcdAuthState(0x60,0x10,KEY,UID));//校验
  540. // if(RW)//读写选择,1是读,0是写
  541. // {
  542. // UartSend (PcdRead(0x10,Dat));
  543. // }
  544. // else
  545. // {
  546. // UartSend(PcdWrite(0x10,Dat));
  547. // }
  548. // UartSend(PcdHalt());
  549. //}