mifare_card.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #include "mifare_card.h"
  2. #include "fm175xx.h"
  3. /*********************************************************************************************************
  4. ** Function name: Mifare_Auth
  5. ** Descriptions: mifare卡片校验
  6. ** input parameters: mode,认证模式(0:key A认证,1:key B认证)
  7. ** sector,认证的扇区号(0~15)
  8. ** *mifare_key,6字节认证密钥数组
  9. ** card_uid 4字节卡片UID数组
  10. ** output parameters:
  11. ** Returned value: true:操作成功 ERROR:操作失败
  12. *********************************************************************************************************/
  13. bool Mifare_Auth(uint8_t mode, uint8_t sector, uint8_t *mifare_key, uint8_t *card_uid)
  14. {
  15. uint8_t send_buff[12], rece_buff[1], result;
  16. uint32_t rece_bitlen;
  17. if (mode == 0x00)
  18. send_buff[0] = 0x60; /* kayA认证 0x60 */
  19. if ( mode == 0x01)
  20. send_buff[0] = 0x61; /* keyB认证 */
  21. send_buff[1] = sector << 2; /* 转化为每个扇区的第一块 sector<<2=sector*4 */
  22. send_buff[2] = mifare_key[0];
  23. send_buff[3] = mifare_key[1];
  24. send_buff[4] = mifare_key[2];
  25. send_buff[5] = mifare_key[3];
  26. send_buff[6] = mifare_key[4];
  27. send_buff[7] = mifare_key[5];
  28. send_buff[8] = card_uid[0];
  29. send_buff[9] = card_uid[1];
  30. send_buff[10] = card_uid[2];
  31. send_buff[11] = card_uid[3];
  32. Pcd_SetTimer(1);
  33. Clear_FIFO();
  34. result = Pcd_Comm(MFAuthent, send_buff, 12, rece_buff, &rece_bitlen); /* Authent认证 */
  35. if (result == true) {
  36. if (Read_Reg(Status2Reg) & 0x08) /* 判断加密标志位,确认认证结果 */
  37. return true;
  38. else
  39. return false;
  40. }
  41. return false;
  42. }
  43. /*********************************************************************************************************
  44. ** Function name: Mifare_Blockset
  45. ** Descriptions: mifare卡设置卡片值块数值
  46. ** input parameters: block:块号
  47. ** buff:4字节初始值
  48. ** output parameters:
  49. ** Returned value: true:操作成功 ERROR:操作失败
  50. *********************************************************************************************************/
  51. bool Mifare_Blockset(uint8_t block, uint8_t *buff)
  52. {
  53. uint8_t block_data[16], result;
  54. block_data[0] = buff[3];
  55. block_data[1] = buff[2];
  56. block_data[2] = buff[1];
  57. block_data[3] = buff[0];
  58. block_data[4] = ~buff[3];
  59. block_data[5] = ~buff[2];
  60. block_data[6] = ~buff[1];
  61. block_data[7] = ~buff[0];
  62. block_data[8] = buff[3];
  63. block_data[9] = buff[2];
  64. block_data[10] = buff[1];
  65. block_data[11] = buff[0];
  66. block_data[12] = block;
  67. block_data[13] = ~block;
  68. block_data[14] = block;
  69. block_data[15] = ~block;
  70. result = Mifare_Blockwrite(block, block_data);
  71. return result;
  72. }
  73. /*********************************************************************************************************
  74. ** Function name: Mifare_Blockread
  75. ** Descriptions: mifare卡读取块函数
  76. ** input parameters: block:块号 0x00-0x3f 64个块
  77. ** output parameters: buff:读出16字节数据
  78. ** Returned value: true:操作成功 ERROR:操作失败
  79. *********************************************************************************************************/
  80. bool Mifare_Blockread(uint8_t block, uint8_t *buff)
  81. {
  82. uint8_t send_buff[2], result;
  83. uint32_t rece_bitlen;
  84. Pcd_SetTimer(1);
  85. send_buff[0] = 0x30; /* 读操作命令 */
  86. send_buff[1] = block; /* 读操作地址 */
  87. Clear_FIFO();
  88. result = Pcd_Comm(Transceive, send_buff, 2, buff, &rece_bitlen);
  89. if ((result != true ) || (rece_bitlen != 16 * 8)) /* 接收到的数据长度为16 */
  90. return false;
  91. return true;
  92. }
  93. /*********************************************************************************************************
  94. ** Function name: mifare_blockwrite
  95. ** Descriptions: mifare卡写块函数
  96. ** input parameters: block:块号 0x00-0x3f 64个块
  97. ** buff:写入16字节数据
  98. ** output parameters:
  99. ** Returned value: true:操作成功 ERROR:操作失败
  100. *********************************************************************************************************/
  101. bool Mifare_Blockwrite(uint8_t block, uint8_t *buff)
  102. {
  103. uint8_t result, send_buff[16], rece_buff[1];
  104. uint32_t rece_bitlen;
  105. send_buff[0] = 0xA0; /* 写块命令 */
  106. send_buff[1] = block; /* 块地址 */
  107. Pcd_SetTimer(1);
  108. Clear_FIFO();
  109. result = Pcd_Comm(Transceive, send_buff, 2, rece_buff, &rece_bitlen);
  110. if ( (result != true ) || ((rece_buff[0]&0x0F) != 0x0A) ) /* 如果未接收到0x0A,表示无ACK*/
  111. return(false);
  112. Pcd_SetTimer(5);
  113. Clear_FIFO();
  114. result = Pcd_Comm(Transceive, buff, 16, rece_buff, &rece_bitlen);
  115. if ( (result != true ) || ((rece_buff[0]&0x0F) != 0x0A) ) /* 如果未接收到0x0A,表示无ACK*/
  116. return false;
  117. return true;
  118. }
  119. /*********************************************************************************************************
  120. ** Function name: Mifare_Blockinc
  121. ** Descriptions: mifare卡片增值操作
  122. ** input parameters: block:块号 0x00-0x3f
  123. ** buff:增加4字节数据
  124. ** output parameters:
  125. ** Returned value: true:操作成功 ERROR:操作失败
  126. *********************************************************************************************************/
  127. bool Mifare_Blockinc(uint8_t block, uint8_t *buff)
  128. {
  129. uint8_t result, send_buff[2], rece_buff[1];
  130. uint32_t rece_bitlen;
  131. Pcd_SetTimer(5);
  132. send_buff[0] = 0xC1; /* 增值操作命令 */
  133. send_buff[1] = block; /* 块地址 */
  134. Clear_FIFO();
  135. result = Pcd_Comm(Transceive, send_buff, 2, rece_buff, &rece_bitlen);
  136. if ((result != true) || ((rece_buff[0] & 0x0F) != 0x0A)) /* 如果未接收到0x0A,表示无ACK */
  137. return false;
  138. Pcd_SetTimer(5);
  139. Clear_FIFO();
  140. Pcd_Comm(Transceive, buff, 4, rece_buff, &rece_bitlen);
  141. return result;
  142. }
  143. /*********************************************************************************************************
  144. ** Function name: Mifare_Blockdec
  145. ** Descriptions: mifare卡片减值操作
  146. ** input parameters: block:块号 0x00-0x3f
  147. ** buff:减少4字节数据
  148. ** output parameters:
  149. ** Returned value: true:操作成功 ERROR:操作失败
  150. *********************************************************************************************************/
  151. bool Mifare_Blockdec(uint8_t block, uint8_t *buff)
  152. {
  153. uint8_t result, send_buff[2], rece_buff[1];
  154. uint32_t rece_bitlen;
  155. Pcd_SetTimer(5);
  156. send_buff[0] = 0xC0; /* 增值操作命令 */
  157. send_buff[1] = block; /* 块地址 */
  158. Clear_FIFO();
  159. result = Pcd_Comm(Transceive, send_buff, 2, rece_buff, &rece_bitlen);
  160. if ((result != true ) || ((rece_buff[0] & 0x0F) != 0x0A)) /* 如果未接收到0x0A,表示无ACK */
  161. return false;
  162. Pcd_SetTimer(5);
  163. Clear_FIFO();
  164. Pcd_Comm(Transceive, buff, 4, rece_buff, &rece_bitlen);
  165. return result;
  166. }
  167. /*********************************************************************************************************
  168. ** Function name: Mifare_Transfer
  169. ** Descriptions: mifare卡片传输块 将发送缓冲器的数据写入到目的块
  170. ** input parameters: block:块号 0x00-0x3f
  171. ** output parameters:
  172. ** Returned value: true:操作成功 ERROR:操作失败
  173. *********************************************************************************************************/
  174. bool Mifare_Transfer(uint8_t block)
  175. {
  176. uint8_t result, send_buff[2], rece_buff[1];
  177. uint32_t rece_bitlen;
  178. Pcd_SetTimer(5);
  179. send_buff[0] = 0xB0; /* 传输命令 */
  180. send_buff[1] = block; /* 块地址 */
  181. Clear_FIFO();
  182. result=Pcd_Comm(Transceive, send_buff, 2, rece_buff, &rece_bitlen);
  183. if ((result != true ) || ((rece_buff[0]&0x0F) != 0x0A)) /* 如果未接收到0x0A,表示无ACK */
  184. return false;
  185. return result;
  186. }
  187. /*********************************************************************************************************
  188. ** Function name: Mifare_Restore
  189. ** Descriptions: mifare卡片储存命令
  190. ** input parameters: block:块号 0x00-0x3f
  191. ** output parameters:
  192. ** Returned value: true:操作成功 ERROR:操作失败
  193. *********************************************************************************************************/
  194. bool Mifare_Restore(uint8_t block)
  195. {
  196. uint8_t result, send_buff[4], rece_buff[1];
  197. uint32_t rece_bitlen;
  198. Pcd_SetTimer(5);
  199. send_buff[0] = 0xC2; /* 重载命令 */
  200. send_buff[1] = block; /* 块地址 */
  201. Clear_FIFO();
  202. result = Pcd_Comm(Transceive, send_buff, 2, rece_buff, &rece_bitlen);
  203. if ((result != true ) || ((rece_buff[0] & 0x0F) != 0x0A)) /* 如果未接收到0x0A,表示无ACK */
  204. return false;
  205. Pcd_SetTimer(5);
  206. send_buff[0] = 0x00;
  207. send_buff[1] = 0x00;
  208. send_buff[2] = 0x00;
  209. send_buff[3] = 0x00;
  210. Clear_FIFO();
  211. Pcd_Comm(Transceive, send_buff, 4, rece_buff, &rece_bitlen);
  212. return result;
  213. }