rc522优点_51单片机rc522接线图

rc522优点_51单片机rc522接线图公司需要做刷卡模块,因此选了RC522做demo程序。下面就RC522知识做简要的总结。本人使用stm32的硬件spi接口搭建工程,相关的配置如下:spi配置:引脚配置SDA——-PA4SCLK—-PB13MOSI——-PB15MISO——PB14IRQ—没接RST—-PB0//PB12–NSSPB13–SCKPB14–…


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

公司需要做刷卡模块,因此选了RC522做demo程序。下面就RC522知识做简要的总结。
本人使用stm32的硬件spi接口搭建工程,相关的配置如下:
spi配置:
引脚配置
SDA ——-PA4
SCLK —-PB13
MOSI ——-PB15
MISO ——PB14
IRQ —没接
RST —- PB0

//PB12--NSS PB13--SCK  PB14--MISO  PB15--MOSI
void SPI2_Init(void)
{	 
	RCC->APB2ENR |= 1 << 3;   //开启PORT b端口时钟      
	RCC->APB1ENR |= 1 << 14;  //开启SPI2时钟   
	//	PB13,PB14 PB15复用输出   
	GPIOB->CRH &= 0X000FFFFF; 
	GPIOB->CRH |= 0XBBB00000;    
	GPIOB->ODR |= 7 << 13;    
		
	SPI2->CR1 |= 0<<10;   //全双工模式
	SPI2->CR1 |= 1<<9;    //启用软件管理
	SPI2->CR1 |= 1<<8;      //ssi = 1

	SPI2->CR1 |= 1<<2;     // 主设备
	SPI2->CR1 |= 0<<11;    //8 bit
	SPI2->CR1 |= 1<<1;     //SCK空闲为高
	SPI2->CR1 |= 1<<0;     //上升沿采样
	SPI2->CR1 |= 7<<3;     //256分频
	SPI2->CR1 |= 0<<7;     //先发MSB
	SPI2->CR1 |= 1<<6;    //开启SPI	
	SPI2->CR2 |= 1 << 2;
	//SPI2_ReadWriteByte(0xff);	 
}   

void SPI2_SetSpeed(u8 SpeedSet)
{
	SPI2->CR1 &= 0XFFC7;
	if(SpeedSet==SPI_SPEED_2)
	{
		SPI2->CR1|=0<<3;
	}
	else if(SpeedSet==SPI_SPEED_8) 
	{
		SPI2->CR1|=2<<3;
	}
	else if(SpeedSet==SPI_SPEED_16)
	{
		SPI2->CR1|=3<<3;
	}
	else			 	 
	{
		SPI2->CR1|=7<<3; 
	}
	SPI2->CR1|=1<<6; 	  
} 

u8 SPI2_ReadWriteByte(u8 TxData)
{		
	u8 retry=0;				 
	while((SPI2->SR&1<<1)==0)
	{
		retry++;
		if(retry>200)return 0;
	}			  
	SPI2->DR=TxData;	 	 
	retry=0;
	while((SPI2->SR&1<<0)==0)  
	{
		retry++;
		if(retry>200)return 0;
	}	  						    
	return SPI2->DR;          			    
}

RC522相关接口初始化:
由于spi的cs由软件控制,所以,这里设置PA4为CS,PB0为rst

void RCC52_init(void)
{
	RCC->APB2ENR |= 1 << 3;       	    
	RCC->APB2ENR |= 1 << 2;
	GPIOB->CRL &= 0XFFFFFFF0; 
	GPIOB->CRL |= 0X00000003;   
	GPIOB->ODR |= 1 << 0;   
	
	GPIOA->CRL &= 0XFFF0FFFF; 
	GPIOA->CRL |= 0X00030000;   
	GPIOA->ODR |= 1 << 4; 
}

rc522的识别过程:
在这里插入图片描述寻卡———->防冲突———->寻卡———>验证密码———>存储操作
卡的操作包括:
读 (Read):读一个块;
写 (Write):写一个块;
加(Increment):对数值块进行加值;
减(Decrement):对数值块进行减值;
存储(Restore):将块中的内容存到数据寄存器中;
传输(Transfer):将数据寄存器中的内容写入块中;
中止(Halt):将卡置于暂停工作状态;

存储器组织

在这里插入图片描述下面是识别卡过程的主函数

#include "sys.h"
#include "usart.h"		
#include "delay.h"	
#include "led.h" 
#include "key.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"	   
#include "rtc.h"
#include "wkup.h"
#include "adc.h"
#include "dma.h"
#include "24cxx.h"
#include "flash.h" 		 
#include "RC522.h"
#include "spi2.h"
#include <string.h>
unsigned char DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char data[16] = {0};
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
unsigned char bull[16] = {0x01,0x00,0x00,0x00,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x01,0x02,0xFD,0x02,0xFD};
unsigned char value[4] = {0X00,0x00,0x00,0x0A};
int main(void)
{		
	
	unsigned char ucArray_ID [ 4 ];   /*先后存放IC卡的类型和UID(IC卡序列号)*/ 
	unsigned char ucStatusReturn = MI_ERR;     /*返回状态 */ 	
	char cStr [ 30 ];	   
	int i = 0;
	unsigned char addr = 2;
  	Stm32_Clock_Init(9);//系统时钟设置
	delay_init(72);		//延时初始化
	uart_init(72,9600); //串口1初始化   
	LED_Init();	   		//LED初始化


  	RCC52_init ();
  	//PB12--NSS PB13--SCK  PB14--MISO  PB15--MOSI
	SPI2_Init()	 ;
//	SPIx_SetSpeed(256);
 	if( MI_OK == PcdReset())
	{
		printf("RESET OK\n");
	}
	else
	{
		printf("reset failed\n");
		while(1);
	}
	PcdConfigISOType();
	PcdAntennaOff();
	delay_ms(10);
	PcdAntennaOn();
	while(1)
	{
		   ucStatusReturn = PcdRequest(PICC_REQALL,ucArray_ID );
		  if(MI_OK !=  ucStatusReturn)
		  {	//	 printf("yanzheng fial\n");
		  		PcdAntennaOff();
				delay_ms(10);
				PcdAntennaOn();
		  		continue;	
		  }
		  if(ucStatusReturn == MI_OK)
		  {
		  		 /*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/
			if ( PcdAnticoll ( ucArray_ID ) == MI_OK )                                                                   
			{
				sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X",
                  ucArray_ID [ 0 ],
                  ucArray_ID [ 1 ],
                  ucArray_ID [ 2 ],
                  ucArray_ID [ 3 ] );
								
				printf ( "%s\r\n",cStr ); 			
				
			
			}		
		  }
		  ucStatusReturn = PcdSelect(ucArray_ID);
		  if(ucStatusReturn != MI_OK)
		  	continue;
#if 0		 
		 ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, ucArray_ID);//验证卡片密码
		 if(ucStatusReturn != MI_OK)
		 	continue;
		 ucStatusReturn = PcdRead(1,data);
		 if(ucStatusReturn == MI_OK)
		 {
		 	for(i = 0; i < 16; i++)
			{
				printf("0x%x ",data[i]);
			}
			
		 }
		 printf("\n");
		 ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, ucArray_ID);//验证卡片密码
		 if(ucStatusReturn != MI_OK)
		 	continue;
			data[14] = 0x11;
			data[15] = 0x13;
		 ucStatusReturn = PcdWrite(1,data);
		 if(ucStatusReturn == MI_OK)
		 {
		 	for(i = 0; i < 16; i++)
			{
				printf("0x%x ",data[i]);
			}
		 }
		 printf("\n");
#else
		//初始化钱包
		 ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 2, DefaultKey, ucArray_ID);//验证卡片密码
		 if(ucStatusReturn != MI_OK)
		 	continue;
		 ucStatusReturn = PcdWrite(2,bull);
		  if(ucStatusReturn != MI_OK)
		 	continue;
		//查询钱包
		 ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 2, DefaultKey, ucArray_ID);//验证卡片密码
		 if(ucStatusReturn != MI_OK)
		 	continue;
		 ucStatusReturn = PcdRead(2,bull);
		 if(ucStatusReturn == MI_OK)
		 {
		 	for(i = 0; i < 16; i++)
			{
				printf("0x%x ",bull[i]);
			}
			
		 }
		 printf("\n");
		//扣值
		 ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, addr, DefaultKey, ucArray_ID);//验证卡片密码
		 if(ucStatusReturn != MI_OK)
		 		continue;
		ucStatusReturn =  PcdValue(PICC_INCREMENT,addr,value)	   ;
		 if(ucStatusReturn != MI_OK)
		 {printf("decre fial\n");
		 	 continue;
		 }
		 ucStatusReturn = PcdAuthState(PICC_AUTHENT1A, 2, DefaultKey, ucArray_ID);//验证卡片密码
		 if(ucStatusReturn != MI_OK)
		 	continue;
		//显示余额
		 ucStatusReturn = PcdRead(2,bull);
		 if(ucStatusReturn == MI_OK)
		 {
		 	for(i = 0; i < 16; i++)
			{
				printf("0x%x ",bull[i]);
			}
			
		 }
		 printf("\n");
#endif
		  delay_ms(1000);
		  
	}
}

大概过程就是这样。其中,充值,减值的电子钱包功能测试没有通过,没时间研究了,毕竟跟工作关系不大。相关代码已经上传了。
参考:
https://blog.csdn.net/liujianhua1989/article/details/72639307
https://blog.csdn.net/a827415225/article/details/51898897
https://blog.csdn.net/txf1984/article/details/46560261

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191808.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Oracle11g安装教程「建议收藏」

    Oracle11g安装教程「建议收藏」oracleScott

    2022年7月4日
  • 电脑广告多?Windows 自带恶意软件删除工具还不会使用?有必要安装杀毒软件吗?

    电脑广告多?Windows 自带恶意软件删除工具还不会使用?有必要安装杀毒软件吗?可能有些小伙伴发现,哎?为什么我的电脑弹窗广告这么多?难不成小视频看多了?电脑中毒了?Windows系统自带的恶意软件删除工具你还不会使用?今天我们一方面带领大家学会使用这个系统自带的工具,另一方面,谈一谈作为一个程序员对于恶意软件和杀毒软件的一些看法,希望能帮助大家纠正一些误区。

    2022年6月24日
  • zabbix短信报警_手机短信监听

    zabbix短信报警_手机短信监听zabbix短信监控

    2022年10月31日
  • python简单代码编写_python编码规范

    python简单代码编写_python编码规范本书以Python3.7为编程工具,共分8个单元,从易到难,从基础应用到综合实战,详细讲解Python创意编程的方法和思维。本书通过丰富有趣的实例,帮助学生学习编程思维方式,掌握Python编程基础知识,包括Python环境的搭建、Python的认识、顺序结构、选择结构、循环结构、列表、元组与字典、函数、字符串及算法。本书适合对Python编程感兴趣的初高中学生阅读,也适合作为家长和老师指导中学…

    2022年10月25日
  • k8s pod配置_k8s cka

    k8s pod配置_k8s ckak8sPod的结构Pod定义Pod的配置镜像拉取策略启动命令环境变量(不推荐)端口设置资源配额Pod的介绍Pod的结构每个Pod中都包含一个或者多个容器,这些容器可以分为两类:用户程序所在的容器,数量可多可少。Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:可以以它为依据,评估整个Pod的健康状况。可以在根容器上设置IP地址,其它容器都共享此IP(Pod的IP),以实现Pod内部的网络通信(这里是Pod内部的通讯,Pod之间的通讯采用虚拟二层网络技术来实现,我们当前环境使

    2022年8月11日
  • oracle linux 设置ip[通俗易懂]

    oracle linux 设置ip[通俗易懂]1.ifconfig查看网卡是否启动(两个一个127.0.0.1)2.若只是一个查看所有网卡 ifconfig-a 获取未启动的网卡名3.启动网卡 ifconfigeht0up 注: eht0;未启动的网卡名4.修改网卡配置文件eth0 1.修改/etc/sysconfig/network-scripts/etho文件 参数详解 …

    2022年5月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号