STM32硬件SPI通过fm17550读取身份证UID,识别银行卡,识别TYPEA与TYPEB

上面是我的微信和QQ群,欢迎新朋友的加入。

目录

1.硬件平台

2.驱动实现

3.循环扫卡测试程序

4.TYPEB射频卡扫描

5.TYPEA射频卡扫描

6.身份证UID读取


1.硬件平台

1.STM32F103+FM17550

2.卡片类型:身份证、TYPEA/B卡、银行卡

2.驱动实现

1.硬件SPI,配置如下

/* SPI1 init function */
static void MX_SPI1_Init(void)
{

  /* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}

3.循环扫卡测试程序

/*********************************************
** 函数描述:循环寻卡
** 输入参数:无
** 返回值  :无
** 说明:
*********************************************/
void Find_Card(void)
{
	volatile unsigned char statues;
	unsigned int Rec_len;               //卡片返回数据长度
	
	statues=TypeA_CardActive(picc_atqa,picc_uid,picc_sak);
	if(statues != TRUE)
	{
		FM175X_SoftReset();
		Rec_len = 0;
		Pcd_ConfigISOType(1);             //设置TypeB
		Set_Rf(3);   //turn on radio
		statues=TypeB_WUP(&Rec_len,Send_Buff+Data,PUPI);//寻卡 Standard	 send request command Standard mode
		if(statues == TRUE)statues=TypeB_Select(PUPI,&Rec_len,Send_Buff+Data);				 
	}
	if(statues == TRUE)
	{
		HAL_Delay(10);
	}			
	HAL_Delay(1000);	
	Set_Rf(0);   //turn off radio	
}

4.TYPEB射频卡扫描

/*************************************************
** 函数描述:测试TYPEB卡
** 输入参数:无
** 返回值  :无
** 说明:
*************************************************/
void Test_CardB(void)
{
	uint8_t status;
	unsigned int Rec_len;               //卡片返回数据长度
	
	HAL_Delay(1000);
	
	FM175X_SoftReset();	
	Rec_len = 0;
	Pcd_ConfigISOType(1);             //设置TypeB
	Set_Rf(3);                        //turn on radio
	status=TypeB_WUP(&Rec_len,Send_Buff,PUPI);//寻卡 Standard	 send request command Standard mode
	if(Rec_len == 0x60)
	{
		status=TypeB_Select(PUPI,&Rec_len,Send_Buff);
		if(status == TRUE)
		{
			status=TypeB_GetUID(&Rec_len,Send_Buff);
			if(status == TRUE)
			{
				junValue++;
			}
		}
	}
}

5.TYPEA射频卡扫描

/***********************************************************
** 函数描述:测试TYPEA卡
** 输入参数:无
** 返回值  :无
** 说明:
***********************************************************/
void Test_CardA(void)
{
	uint8_t status;
	
	//激活卡(寻卡,防冲突,选卡)
    status=TypeA_CardActive(picc_atqa,picc_uid,picc_sak);
    if (status != TRUE)
    {
		//激活失败
        return;
    }

	status=Mifare_Auth(0x00,0x01,DefualtKey,picc_uid);	//card authentication
	
	if (status != TRUE)
    {
		//认证失败
        return;
    }

	//测试的时候避免反复写数据
	if(junValue)
	{
		status=Mifare_Blockwrite(0x04,DefualtData);	 //block write function
		if (status != TRUE)
		{
			//写数据失败
			return;
		}
		junValue = 0;
	}
	
	status=Mifare_Blockread(0x04,Send_Buff);	//bolck read function(读04块的数据)
	if (status != TRUE)
    {
		//读数据失败
        return;
    }
}

6.身份证UID读取

//检测TYPEB 射频卡
		FM175X_SoftReset();	
		Rec_len = 0;
		Pcd_ConfigISOType(1);             //设置TypeB
		Set_Rf(3);                        //turn on radio
		status=TypeB_WUP(&Rec_len,Send_Buff,PUPI);//寻卡 Standard	 send request command Standard mode
		if(Rec_len == 0x60)
		{
			status=TypeB_Select(PUPI,&Rec_len,Send_Buff);
			if(status == TRUE)
			{
				status=TypeB_GetUID(&Rec_len,Send_Buff);
				if(status == TRUE)
				{
					for(uint8_t i=0;i<12;i++)
					{
						HID_SendHex(Send_Buff[i]);
					}
					HID_Enter();
				}
			}
		}

 

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32通过SPI方式读取SD的原理如下: 1. SPI总线的初始化 首先需要通过SPI总线与SD进行通信,因此需要对SPI总线进行初始化。在STM32中,可以通过配置SPI的控制寄存器来设置SPI的工作模式、数据位数、时钟极性等参数,同时还需要配置SPI的GPIO口,将SCK、MISO、MOSI等信号连接到正确的GPIO口上。 2. SD的初始化 在使用SD之前,需要对SD进行初始化操作,包括检查SD是否存在、设定SD的工作模式等。具体步骤如下: (1)向SD发送CMD0命令,将SD置于空闲状态。 (2)向SD发送CMD8命令,检查SD是否支持高速模式。 (3)向SD发送CMD55命令,进入应用命令模式。 (4)向SD发送ACMD41命令,等待SD初始化完成。 (5)向SD发送CMD2命令,获取SDCID信息。 (6)向SD发送CMD3命令,获取SDRCA信息。 (7)向SD发送CMD7命令,选择SD。 3. 读取SD的数据 在完成SPI总线和SD的初始化之后,就可以通过SPI总线读取SD的数据了。具体步骤如下: (1)向SD发送CMD17命令,选择要读取的扇区。 (2)向SD发送读命令,读取指定扇区的数据。 (3)读取SD返回的数据,并将数据保存到指定的存储器中。 需要注意的是,SD读取速度较慢,因此在读取数据时需要考虑到速度问题,避免出现数据读取不完整或者出现超时等问题。同时,也需要注意SD的时序问题,以保证读取数据的正确性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值