打印
[STC单片机]

STC与FM1702SL 读卡请教

[复制链接]
1552|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xixihaha0|  楼主 | 2013-11-22 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xixihaha0 于 2013-11-22 10:53 编辑

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

        write_reg(0x23,0x63);
        write_reg(0x12,0x3f);
        write_reg(0x13,0x3f);
        write_reg(0x22,0x0f);

        buff[0] = RF_CMD_READ;
        buff[1] = Block_Adr;
        temp = Command_Send(2, buff, Transceive);
        if(temp == 0)
        {
                return FM1715_NOTAGERR;
        }

        temp = read_reg(0x0A);
        if((temp & 0x02) == 0x02) return FM1715_PARITYERR;
        if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;
        if((temp & 0x08) == 0x08) return FM1715_CRCERR;
        temp = read_reg(0x04);
        if(temp == 0x10)        /* 8K卡读数据长度为16 */
        {
                Read_FIFO(buff);
                return FM1715_OK;
        }
        else if(temp == 0x04)        /* Token卡读数据长度为16 */
        {
                Read_FIFO(buff);
                return FM1715_OK;
        }
        else
        {
                return FM1715_BYTECOUNTERR;
        }
}

/****************************************************************/
/*名称: MIF_Write */
/*功能: 该函数实现写MIFARE卡块的数值*/
/*输入: buff: 缓冲区首地址*/
/* Block_Adr: 块地址*/
/*输出: FM1715_NOTAGERR: 无卡*/
/* FM1715_BYTECOUNTERR: 接收字节错误*/
/* FM1715_NOTAUTHERR: 未经权威认证*/
/* FM1715_EMPTY: 数据溢出错误*/
/* FM1715_CRCERR: CRC校验错*/
/* FM1715_PARITYERR: 奇偶校验错*/
/* FM1715_WRITEERR: 写卡块数据出错*/
/* FM1715_OK: 应答正确*/
/****************************************************************/
uchar MIF_Write(uchar idata *buff, uchar Block_Adr)
{
        /*~~~~~~~~~~~~~~~~~~~~*/
        uchar idata        temp;
        uchar idata        *F_buff;
        /*~~~~~~~~~~~~~~~~~~~~*/

        write_reg(0x23,0x63);
        write_reg(0x12,0x3f);
        F_buff = buff + 0x10;
        write_reg(0x22,0x07);
        *F_buff = RF_CMD_WRITE;
        *(F_buff + 1) = Block_Adr;
        temp = Command_Send(2, F_buff, Transceive);
        if(temp == FALSE)
        {
                return(FM1715_NOTAGERR);
        }

        temp = read_reg(0x04);
        if(temp == 0)
        {
                return(FM1715_BYTECOUNTERR);
        }

        Read_FIFO(F_buff);
        temp = *F_buff;
        switch(temp)
        {
        case 0x00:        return(FM1715_NOTAUTHERR);        /* 暂时屏蔽掉写错误 */
        case 0x04:        return(FM1715_EMPTY);
        case 0x0a:        break;
        case 0x01:        return(FM1715_CRCERR);
        case 0x05:        return(FM1715_PARITYERR);
        default:        return(FM1715_WRITEERR);
        }

        temp = Command_Send(16, buff, Transceive);
        if(temp == TRUE)
        {
                return(FM1715_OK);
        }
        else
        {
                temp = read_reg(0x0A);
                if((temp & 0x02) == 0x02)
                        return(FM1715_PARITYERR);
                else if((temp & 0x04) == 0x04)
                        return(FM1715_FRAMINGERR);
                else if((temp & 0x08) == 0x08)
                        return(FM1715_CRCERR);
                else
                        return(FM1715_WRITEERR);
        }
}


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

164

帖子

1

粉丝