三天搞定射频识别技术(二)2.5读卡写卡操作

*******************************************************************************
//功    能:读取M1卡一块数据
//参数说明: addr[IN]:块地址
//          pData[OUT]:读出的数据,16字节
//返    回: 成功返回MI_OK
//发	送:cmd_read  	addr  	CRC16
//返回16B,   如果读block3,  返回的keyA是0
*******************************************************************************/
char PcdRead(unsigned char addr,unsigned char *pData)
{
    char status;
    unsigned int  unLen;
    unsigned char i,ucComMF522Buf[MAXRLEN];

    ucComMF522Buf[0] = PICC_READ;
    ucComMF522Buf[1] = addr;
    CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
    if ((status == MI_OK) && (unLen == 0x90))
    {
        for (i=0; i<16; i++)
        {
            *(pData+i) = ucComMF522Buf[i];
        }
    }
    else
    {
        status = MI_ERR;
    }

    return status;
}


void RFID_Read()
{
    uint8_t i;
    unsigned char status = 0;
    PcdReset();		    //初始化射频芯片
    PcdAntennaOff();	//关闭天线
    PcdAntennaOn();		//打开天线
    while (1)
    {
        //寻卡
        printf("req\n");
        status = PcdRequest(PICC_REQALL, card_type);

        if (status != MI_OK)
        {
            break;
        }
        printf("anti\n");
        //防冲撞处理
        status = PcdAnticoll(ID);//执行成功得到卡的序列号
        if (status != MI_OK)
        {
            break;
        }
        //选择卡片
        printf("select\n");
        status = PcdSelect(ID);
        if (status != MI_OK)
        {
            break;
        }
        //验证卡片密码
        printf("ahthor\n");
        status = PcdAuthState(PICC_AUTHENT1A, cmd_addr, KEY_A, ID);
        if (status != MI_OK)
        {
            break;
        }
        //读地址的数据
        memset(cmd_dat,0,sizeof(cmd_dat));
        status = PcdRead(cmd_addr, cmd_dat);
        if (status != MI_OK)
        {
            break;
        }
        printf("Card_Data:\n");
        for (i=0;i<16;i++) {
            printf(" %02x ",cmd_dat[i]);
        }printf("\n");
        TIP_SUCCESS();
       
        break;
    }
}


在这里插入图片描述

在这里插入图片描述

/*******************************************************************************
//功    能:写数据到M1卡一块
//参数说明: addr[IN]:块地址
//          pData[IN]:写入的数据,16字节
//返    回: 成功返回MI_OK
//发	送:分两次发送
//			cmd_write  	addr  	CRC16	
//			data(16bytes)  	CRC16
*******************************************************************************/
char PcdWrite(unsigned char addr,unsigned char *pData)
{
    char status;
    unsigned int  unLen;
    unsigned char i,ucComMF522Buf[MAXRLEN];

    ucComMF522Buf[0] = PICC_WRITE;//PICC_WRITE  0xA0   写块
    ucComMF522Buf[1] = addr;
    CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);//对数据进行CRC校验
    //存放于ucCoMF522Buf【0,1】
    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

    if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
    {
        status = MI_ERR;
		
    }

    if (status == MI_OK)
    {
        //memcpy(ucComMF522Buf, pData, 16);
        for (i=0; i<16; i++)
        {
            ucComMF522Buf[i] = *(pData+i);      // 要充值的内容
        }
        CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);//对数据进行CRC校验校验值
        //存放于ucCoMF522Buf【0,1】
        status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); //发送数据,并接收卡返回的数据
        if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
        {
            status = MI_ERR;
		
        }
    }

    return status;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值