目录
个人认为,这个比之前的按键解锁和蓝牙好玩哈哈哈哈==
效果如图:
首先,这个模块叫做RFID RC522射频模块,上面一共有8个引脚,其中IRQ引脚保持悬空即可,我们只需要接另外7个引脚。SDA引脚为数据接口,SCK引脚为时钟接口,MOSI引脚为SPI接口主出从入,MISO引脚为SPI接口主入从出,GND接地,RST为复位信号,3.3V接单片机3.3V。
这里涉及到SPI通讯协议,参考: (41条消息) SPI协议详解(图文并茂+超详细)_小麦大叔的博客-CSDN博客_spi协议
cube配置:
使能SPI功能,模式选择>Full-Duplex Master 全双工。
代码部分:
定义两个数组,一个是用来读取的卡号,一个存放自己正确的卡号,要想知道自己的卡号可以手机上下载一个软件NFC Writer可以读取自己卡片的信息,然后将其写入数组用于判断。
/* USER CODE BEGIN 1 */
uint8_t readUid[5];
uint8_t UID[5]={0x43,0x58,0x36,0x84};//自己的卡号
/* USER CODE END 1 */
进行RC522初始化
/* USER CODE BEGIN 2 */
MFRC_Init();
PCD_Reset();
printf("RC522初始化成功\r\n");
/* USER CODE END 2 */
void MFRC_Init(void)
{
RS522_NSS(1);
RS522_RST(1);
}
void PCD_Reset(void)//PCD复位
{
/*硬复位*/
RS522_RST(1);//用到复位引脚
osDelay(2);
RS522_RST(0);
osDelay(2);
RS522_RST(1);
osDelay(2);
/*软复位*/
MFRC_WriteReg(MFRC_CommandReg, MFRC_RESETPHASE);
osDelay(2);
/*复位后的初始化配置*/
MFRC_WriteReg(MFRC_ModeReg, 0x3D); //CRC初始值0x6363
MFRC_WriteReg(MFRC_TReloadRegL, 30); //定时器重装值
MFRC_WriteReg(MFRC_TReloadRegH, 0);
MFRC_WriteReg(MFRC_TModeReg, 0x8D); //定时器设置
MFRC_WriteReg(MFRC_TPrescalerReg, 0x3E); //定时器预分频值
MFRC_WriteReg(MFRC_TxAutoReg, 0x40); //100%ASK
PCD_AntennaOff(); //关天线
osDelay(2);
PCD_AntennaOn(); //开天线
}
while(1)中进行卡号比对,然后正确干什么,错误干什么:
读取卡号函数:
uint8_t readCard(uint8_t *readUid,void(*funCallBack)(void))
{
uint8_t Temp[5];
if (PCD_Request(0x52, Temp) == 0)
{
if (PCD_Anticoll(readUid) == 0)
{
if(funCallBack != NULL)
funCallBack();
return 0;
}
}
return 1;
}
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(!readCard(readUid,NULL)){
printf("卡号:%x-%x-%x-%x\n",readUid[0],readUid[1],readUid[2],readUid[3]);
if(!strncmp((char *)readUid,(char *)UID,4))
{
OLED_Clear();
OLED_ShowCHinese(0,0,18); //卡
OLED_ShowCHinese(20,0,19);//号
OLED_ShowCHinese(40,0,10);//正
OLED_ShowCHinese(60,0,11);//确
OLED_ShowChar(80,0,'!',16);//!
OLED_ShowCHinese(0,3,0); //门
OLED_ShowCHinese(20,3,1);//已
OLED_ShowCHinese(40,3,4);//打
OLED_ShowCHinese(60,3,5);//开
OLED_ShowChar(80,3,'!',16);//!
}
else
{
OLED_Clear();
OLED_ShowCHinese(0,0,18); //卡
OLED_ShowCHinese(20,0,19);//号
OLED_ShowCHinese(40,0,8);//错
OLED_ShowCHinese(60,0,9);//误
OLED_ShowChar(80,0,'!',16);//!
}
}
HAL_Delay (500);
}
/* USER CODE END 3 */
/*PCD函数声明*/
void PCD_Init(void);
void PCD_Reset(void);
void PCD_AntennaOn(void);
void PCD_AntennaOff(void);
char PCD_Request(uint8_t RequestMode, uint8_t *pCardType); //寻卡,并返回卡的类型
char PCD_Anticoll(uint8_t *pSnr); //防冲突,返回卡号
char PCD_Select(uint8_t *pSnr); //选卡
char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t *pKey, uint8_t *pSnr); //验证密码(密码A和密码B)
char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData); //写数据
char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData); //读数据
char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue);
char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr);
char PCD_Halt(void);
void StartIDcardTask(void const * argument);