OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3126|回复: 1

stm32f1+rc522对两个数据块操作就报错,求助求助

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-8-9
在线时间
2 小时
发表于 2020-8-9 09:22:06 | 显示全部楼层 |阅读模式
2金钱
我想先读出来数据块1的内容,再写数据块4,再读出来数据块4,密码是默认的白卡密码,很疑惑求助大家,main函数如下:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include "usart.h"
#include "stm32f10x_spi.h"
#include "RC522.h"
#include "delay.h"
#include "string.h"
#include "spi_driver.h"
#include "stdio.h"

uint8_t Card_Type1[2];  
uint8_t Card_ID[4];
uint8_t Card_KEY[6] = {0xff,0xff,0xff,0xff,0xff,0xff};    //{0x11,0x11,0x11,0x11,0x11,0x11};   //密码
uint8_t Card_Data[16];
uint8_t status;

int main(void)
{
   uint8_t i;
   Card_Type1[0]=0x04;
   Card_Type1[1]=0x00;
   delay_init();          //延时函数初始化   
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
   uart_init(115200);  //串口初始化为115200   
   
   printf("\r\n**********************************************************\r\n");

   delay_init();
   RC522_IO_Init();
   PcdReset();  //复位RC522
   PcdAntennaOff();  //关闭天线
   delay_ms(100);
   PcdAntennaOn();  //开启天线
   
   printf("\r\n**********************************************************\r\n");
   while(1)
   {
      delay_ms(10);
   // if(MI_OK==PcdRequest(0x52, Card_Type1))  //寻卡函数,如果成功返回MI_OK  打印多次卡号
   if(MI_OK==PcdRequest(0x26, Card_Type1))  //寻卡函数,如果成功返回MI_OK   打印1次卡号
      {
         uint16_t cardType = (Card_Type1[0]<<8)|Card_Type1[1];//读不同卡的类型
         printf("卡类型:(0x%04X)\r\n",cardType);  //"Card Type(0x%04X):"
         switch(cardType){
         case 0x4400:
               printf("Mifare UltraLight\r\n");
               break;
         case 0x0400:
               printf("Mifare One(S50)\r\n");
               break;
         case 0x0200:
               printf("Mifare One(S70)\r\n");
               break;
         case 0x0800:
               printf("Mifare Pro(X)\r\n");
               break;
         case 0x4403:
               printf("Mifare DESFire\r\n");
               break;
         default:
               printf("Unknown Card\r\n");
               break;
         }
         
         status = PcdAnticoll(Card_ID);//防冲撞 如果成功返回MI_OK
         if(status != MI_OK){
               printf("Anticoll Error\r\n");
         }else{
               printf("Serial Number:%02X%02X%02X%02X\r\n",Card_ID[0],Card_ID[1],Card_ID[2],Card_ID[3]);
         }
         
         status = PcdSelect(Card_ID);  //选卡 如果成功返回MI_OK
         if(status != MI_OK){
               printf("Select Card Error\r\n");
         }
         else
            printf("Select Card OK\r\n");
         
         status = PcdAuthState(PICC_AUTHENT1A,1,Card_KEY,Card_ID);//验证卡密码 如果成功返回MI_OK;问题就出在这,验证1成功只能对1数据块进行操作,我在写一个针对于4的也不行,一次只能一个
         if(status != MI_OK){
               printf("Auth State Error\r\n");
               continue;
         }
         
         
         
         memset(Card_ID,1,4);  //函数用于为变量开辟空间,或将变量都赋值为一个值
         status = PcdRead(1,Card_Data);                    //再一次把它读取出来16字节的卡片数据,选择块地址读出数据,成功则返回MI_OK
         if(status != MI_OK){
               printf("Card Read Error\r\n");
               continue;
         }else{
            for(i=0;i<16;i++){
               printf("%02X ",Card_Data);
            }
            printf("\r\n");
         }
         memset(Card_Data,0,16);  //清零
         
         
         
         
      memset(Card_Data,1,16);
         Card_Data[0]=0x77;
         Card_Data[1]=0x10;
         Card_Data[2]=0x65;
         Card_Data[3]=0x01;
         Card_Data[4]=0xFF;
         status = PcdWrite(4,Card_Data);                   //写入0XAA,0X01,0X01……选择块地址写入数据,成功则返回MI_OK
         if(status != MI_OK){
               printf("Card Write Error\r\n");
               continue;
         }
         memset(Card_Data,0,16);  //清零
         delay_us(8);
         


         
         
         status = PcdRead(4,Card_Data);                    //再一次把它读取出来16字节的卡片数据,选择块地址读出数据,成功则返回MI_OK
         if(status != MI_OK){
               printf("Card Read Error\r\n");
               continue;
         }else{
            for(i=0;i<16;i++){
               printf("%02X ",Card_Data);
            }
            printf("\r\n");
         }
         
      
         

         
         status = PcdHalt();  //卡片进入休眠状态
         if(status != MI_OK){
               printf("PcdHalt Error\r\n");         
         }
         else
         {
               printf("PcdHalt OK\r\n");  
         }
      }
      
   }
}





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-8-9
在线时间
2 小时
 楼主| 发表于 2020-8-9 09:49:42 | 显示全部楼层
问题解决了memset(Card_ID,1,4),把这个删了后面再认证一次就行了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 11:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表