#include "./SYSTEM/sys/sys.h"
#include "./BSP/RFID/rc522.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "string.h"
#include <stdio.h>
#include <stdlib.h>
//////////////////////////////////////////////////////////
// M1卡分为16个扇区,每个扇区由四个块(块0、块1、块2、块3)组成
// 将16个扇区的64个块按绝对地址编号为:0~63
// 第0个扇区的块0(即绝对地址0块),用于存放厂商代码,已经固化不可更改
// 每个扇区的块0、块1、块2为数据块,可用于存放数据
// 每个扇区的块3为控制块(绝对地址为:块3、块7、块11.....)包括密码A,存取控制、密码B等
/*******************************
*连线说明:
*1--SDA <----->PA4
*2--SCK <----->PA5
*3--MOSI <----->PA7
*4--MISO <----->PA6
*5--悬空
*6--GND <----->GND
*7--RST <----->PB0
*8--VCC <----->VCC
************************************/
/*全局变量*/
unsigned char CT[2];//卡类型
unsigned char SN[4]; //卡号
unsigned char RFID[16]; //存放RFID
unsigned char lxl_bit=0;
unsigned char card1_bit=0;
unsigned char card2_bit=0;
unsigned char card3_bit=0;
unsigned char card4_bit=0;
unsigned char total=0;
unsigned char lxl[4]= {196,58,104,217};
unsigned char card_1[4]= {83,106,11,1};
unsigned char card_2[4]= {208,121,31,57};
unsigned char card_3[4]= {176,177,143,165};
unsigned char card_4[4]= {5,158,10,136};
uint8_t KEY[6]= {0xff,0xff,0xff,0xff,0xff,0xff};
uint8_t AUDIO_OPEN[6] = {0xAA, 0x07, 0x02, 0x00, 0x09, 0xBC};
unsigned char RFID1[16]= {0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x80,0x29,0xff,0xff,0xff,0xff,0xff,0xff};
/*函数声明*/
unsigned char status;
unsigned char s=0x08;
#define RC522_DELAY() delay_us( 20 )
char* RC522_Handel()
{
static char charid[32] = {0};
strcpy(charid, "");
// char* charid = (char*)malloc(sizeof(char) * 32);
status = PcdRequest(PICC_REQALL,CT);//寻卡
uint8_t tempstatus = status;
// printf("\r\nstatus>>>>>>%d\r\n", status);
if(status==MI_OK)// 寻卡成功
{
status=MI_ERR;
status = PcdAnticoll(SN);// 防冲撞
}
if (status==MI_OK)// 防冲撞成功
{
uint32_t id = 0;
status=MI_ERR;
id = ShowID(SN); // 串口打印卡的ID号
char tempchar[10] = {0};
// sprintf(tempchar, "%d", SN[0]);
// strcat(charid, tempchar);
for(int i = 0; i < 4; i++){
sprintf(tempchar, "%d", SN[i]);
strcat(charid, tempchar);
}
// printf("RC522_Handel id = %s\r\n", charid);
if((SN[0]==lxl[0])&&(SN[1]==lxl[1])&&(SN[2]==lxl[2])&&(SN[3]==lxl[3]))
{
lxl_bit=1;
// printf("\r\nThe User is:card_0\r\n");
}
if((SN[0]==card_1[0])&&(SN[1]==card_1[1])&&(SN[2]==card_1[2])&&(SN[3]==card_1[3]))
{
card1_bit=1;
// printf("\r\nThe User is:card_1\r\n");
}
if((SN[0]==card_2[0])&&(SN[1]==card_2[1])&&(SN[2]==card_2[2])&&(SN[3]==card_2[3]))
{
card2_bit=1;
// printf("\r\nThe User is:card_2\r\n");
}
if((SN[0]==card_3[0])&&(SN[1]==card_3[1])&&(SN[2]==card_3[2])&&(SN[3]==card_3[3]))
{
card3_bit=1;
// printf("\r\nThe User is:card_3\r\n");
}
if((SN[0]==card_4[0])&&(SN[1]==card_4[1])&&(SN[2]==card_4[2])&&(SN[3]==card_4[3]))
{
card4_bit=1;
// printf("\r\nThe User is:card_4\r\n");
}
//total=card1_bit+card2_bit+card3_bit+card4_bit+lxl_bit;
status =PcdSelect(SN);
}
else
{
}
if(status==MI_OK)//选卡成功
{
status=MI_ERR;
status =PcdAuthState(0x60,0x09,KEY,SN);
}
if(status==MI_OK)//验证成功
{
status=MI_ERR;
status=PcdRead(s,RFID);
}
if(status==MI_OK)//读卡成功
{
status=MI_ERR;
delay_ms(100);
}
if(tempstatus == 0){
// printf("status = 0 yes\r\n");
return charid;
}else if(tempstatus == 2){
// printf("status = 2 yes\r\n");
return NULL;
}
return NULL;
}
void RC522_Init ( void )
{
SPI1_Init();
RC522_Reset_Disable();
RC522_CS_Disable();
PcdReset ();
M500PcdConfigISOType ( 'A' );//设置工作方式
}
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );//PORTA、B时钟使能
GPIOA_CLK_ENABLE();
GPIOB_CLK_ENABLE();
// CS
GPIO_InitStructure.Pin = GPIO_PIN_4;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //IO口速度为50MHz
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化PF0、PF1
// SCK
GPIO_InitStructure.Pin = GPIO_PIN_5;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //IO口速度为50MHz
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
// MISO
GPIO_InitStructure.Pin = GPIO_PIN_6;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT; //推挽输出
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //IO口速度为50MHz
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
// MOSI
GPIO_InitStructure.Pin = GPIO_PIN_7;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //IO口速度为50MHz
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
// RST
GPIO_InitStructure.Pin = GPIO_PIN_0;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //IO口速度为50MHz
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*
* 函数名:SPI_RC522_SendByte
* 描述 :向RC522发送1 Byte 数据
* 输入 :byte,要发送的数据
* 返回 : RC522返回的数据
* 调用 :内部调用
*/
void SPI_RC522_SendByte ( uint8_t byte )
{
uint8_t counter;
for(counter=0; counter<8; counter++)
{
if ( byte & 0x80 )
RC522_MOSI_1 ();
else
RC522_MOSI_0 ();
RC522_DELAY();
RC522_SCK_0 ();
RC522_DELAY();
RC522_SCK_1();
RC522_DELAY();
byte <<= 1;
}
}
/*
* 函数名:SPI_RC522_ReadByte
* 描述 :从RC522发送1 Byte 数据
* 输入 :无
* 返回 : RC522返回的数据
* 调用 :内部调用
*/
uint8_t SPI_RC522_ReadByte ( void )
{
uint8_t counter;
uint8_t SPI_Data;
for(counter=0; counter<8; counter++)
{
SPI_Data <<= 1;
RC522_SCK_0 ();
RC522_DELAY();
if ( RC522_MISO_GET() == 1)
SPI_Data |= 0x01;
RC522_DELAY();
RC522_SCK_1 ();
RC522_DELAY();
}
// printf("****%c****",SPI_Data);
return SPI_Data;
}
/*
* 函数名:ReadRawRC
* 描述 :读RC522寄存器
* 输入 :ucAddress,寄存器地址
* 返回 : 寄存器的当前值
* 调用 :内部调用
*/
uint8_t ReadRawRC ( uint8_t ucAddress )
{
uint8_t ucAddr, ucReturn;
ucAddr = ( ( ucAddress << 1 ) & 0x7E ) | 0x80;
RC522_CS_Enable();
SPI_RC522_SendByte ( ucAddr );
ucReturn = SPI_RC522_ReadByte ();
RC522_CS_Disable();
return ucReturn;
}
/*
* 函数名:WriteRawRC
* 描述 :写RC522寄存器
* 输入 :ucAddress,寄存器地址
* ucValue,写入寄存器的值
* 返回 : 无
* 调用 :内部调用
*/
void WriteRawRC ( uint8_t ucAddress, uint8_t ucValue )
{
uint8_t ucAddr;
ucAddr = ( ucAddress << 1 ) & 0x7E;
RC522_CS_Enable();
SPI_RC522_SendByte ( ucAddr );
SPI_RC522_SendByte ( ucValue );
RC522_CS_Disable();
}
/*
* 函数名:SetBitMask
* 描述 :对RC522寄存器置位
* 输入 :ucReg,寄存器地址
* ucMask,置位值
* 返回 : 无
* 调用 :内部调用
*/
void SetBitMask (
化作一只猫☁
- 粉丝: 0
- 资源: 1
最新资源
- Hybrid开发,基于h5+ API和mui前端框架,以及seajs模块化开发的一套跨平台APP开发框架.zip
- 计算机组成原理(COD)综合实验,带三级浮点流水的五级RISCV流水线.zip
- sm2解密出Invalid point encoding问题的解决办法
- 乐跑刷数据代码 (1).exe
- 计算机科学与工程学院15级大三短学期JAVA课设-虚拟校园系统.zip
- 备战2025电赛03-驱动1.8寸TFT-LCD屏幕
- 一个基于Java SE的跳跃忍者游戏.zip
- 大数据产业园多类型楼宇群电能共享优化运行策略
- 一个采用MVC架构设计、Java实现的泡泡堂游戏.zip
- 一个基于java socket的可以网络对战的俄罗斯方块游戏.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈