[STC单片机] STC与FM1702SL 读卡请教

[复制链接]
 楼主| xixihaha0 发表于 2013-11-22 09:30 | 显示全部楼层 |阅读模式
本帖最后由 xixihaha0 于 2013-11-22 10:53 编辑

寻卡和认证都过了,就卡在读写扇区上,一直返回CRC错误,对照了网上多份示例代码,驱动都没有问题,请各位调试过的指导一下,主要是
MIF_Read函数中,这时总是返回if((temp & 0x08) == 0x08) return FM1702_CRCERR;错误,单片机为  STC89LE54RD+
  1. /****************************************************************/
  2. /*名称: MIF_Read */
  3. /*功能: 该函数实现读MIFARE卡块的数值*/
  4. /*输入: buff: 缓冲区首地址*/
  5. /* Block_Adr: 块地址*/
  6. /*输出: FM1715_NOTAGERR: 无卡*/
  7. /* FM1715_PARITYERR: 奇偶校验错*/
  8. /* FM1715_CRCERR: CRC校验错*/
  9. /* FM1715_BYTECOUNTERR: 接收字节错误*/
  10. /* FM1715_OK: 应答正确*/
  11. /****************************************************************/
  12. uchar MIF_READ(uchar idata *buff, uchar Block_Adr)
  13. {
  14.         /*~~~~~~~~~~~~~~~~~*/
  15.         uchar idata        temp;
  16.         /*~~~~~~~~~~~~~~~~~*/

  17.         write_reg(0x23,0x63);
  18.         write_reg(0x12,0x3f);
  19.         write_reg(0x13,0x3f);
  20.         write_reg(0x22,0x0f);

  21.         buff[0] = RF_CMD_READ;
  22.         buff[1] = Block_Adr;
  23.         temp = Command_Send(2, buff, Transceive);
  24.         if(temp == 0)
  25.         {
  26.                 return FM1715_NOTAGERR;
  27.         }

  28.         temp = read_reg(0x0A);
  29.         if((temp & 0x02) == 0x02) return FM1715_PARITYERR;
  30.         if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;
  31.         if((temp & 0x08) == 0x08) return FM1715_CRCERR;
  32.         temp = read_reg(0x04);
  33.         if(temp == 0x10)        /* 8K卡读数据长度为16 */
  34.         {
  35.                 Read_FIFO(buff);
  36.                 return FM1715_OK;
  37.         }
  38.         else if(temp == 0x04)        /* Token卡读数据长度为16 */
  39.         {
  40.                 Read_FIFO(buff);
  41.                 return FM1715_OK;
  42.         }
  43.         else
  44.         {
  45.                 return FM1715_BYTECOUNTERR;
  46.         }
  47. }

  48. /****************************************************************/
  49. /*名称: MIF_Write */
  50. /*功能: 该函数实现写MIFARE卡块的数值*/
  51. /*输入: buff: 缓冲区首地址*/
  52. /* Block_Adr: 块地址*/
  53. /*输出: FM1715_NOTAGERR: 无卡*/
  54. /* FM1715_BYTECOUNTERR: 接收字节错误*/
  55. /* FM1715_NOTAUTHERR: 未经权威认证*/
  56. /* FM1715_EMPTY: 数据溢出错误*/
  57. /* FM1715_CRCERR: CRC校验错*/
  58. /* FM1715_PARITYERR: 奇偶校验错*/
  59. /* FM1715_WRITEERR: 写卡块数据出错*/
  60. /* FM1715_OK: 应答正确*/
  61. /****************************************************************/
  62. uchar MIF_Write(uchar idata *buff, uchar Block_Adr)
  63. {
  64.         /*~~~~~~~~~~~~~~~~~~~~*/
  65.         uchar idata        temp;
  66.         uchar idata        *F_buff;
  67.         /*~~~~~~~~~~~~~~~~~~~~*/

  68.         write_reg(0x23,0x63);
  69.         write_reg(0x12,0x3f);
  70.         F_buff = buff + 0x10;
  71.         write_reg(0x22,0x07);
  72.         *F_buff = RF_CMD_WRITE;
  73.         *(F_buff + 1) = Block_Adr;
  74.         temp = Command_Send(2, F_buff, Transceive);
  75.         if(temp == FALSE)
  76.         {
  77.                 return(FM1715_NOTAGERR);
  78.         }

  79.         temp = read_reg(0x04);
  80.         if(temp == 0)
  81.         {
  82.                 return(FM1715_BYTECOUNTERR);
  83.         }

  84.         Read_FIFO(F_buff);
  85.         temp = *F_buff;
  86.         switch(temp)
  87.         {
  88.         case 0x00:        return(FM1715_NOTAUTHERR);        /* 暂时屏蔽掉写错误 */
  89.         case 0x04:        return(FM1715_EMPTY);
  90.         case 0x0a:        break;
  91.         case 0x01:        return(FM1715_CRCERR);
  92.         case 0x05:        return(FM1715_PARITYERR);
  93.         default:        return(FM1715_WRITEERR);
  94.         }

  95.         temp = Command_Send(16, buff, Transceive);
  96.         if(temp == TRUE)
  97.         {
  98.                 return(FM1715_OK);
  99.         }
  100.         else
  101.         {
  102.                 temp = read_reg(0x0A);
  103.                 if((temp & 0x02) == 0x02)
  104.                         return(FM1715_PARITYERR);
  105.                 else if((temp & 0x04) == 0x04)
  106.                         return(FM1715_FRAMINGERR);
  107.                 else if((temp & 0x08) == 0x08)
  108.                         return(FM1715_CRCERR);
  109.                 else
  110.                         return(FM1715_WRITEERR);
  111.         }
  112. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

164

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

164

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部