射频模块程序源码:
RFID_RC522.zip
(7.22 MB, 售价: 2 E币)
部分源码如下,完整源码见附件
- u8 SPIWriteByte(u8 Byte)
- {
- while((SPI2->SR&0X02)==0); //等待发送区空
- SPI2->DR=Byte; //发送一个byte
- while((SPI2->SR&0X01)==0); //等待接收完一个byte
- return SPI2->DR; //返回收到的数据
- }
- //SPIx 读写一个字节
- //TxData:要写入的字节
- //返回值:读取到的字节
- u8 SPI2_ReadWriteByte(u8 TxData)
- {
- u8 retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
- {
- retry++;
- if(retry>200)return 0;
- }
- SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
- retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
- {
- retry++;
- if(retry>200)return 0;
- }
- return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
- }
- //SPI 速度设置函数
- //SpeedSet:
- //SPI_BaudRatePrescaler_2 2分频
- //SPI_BaudRatePrescaler_8 8分频
- //SPI_BaudRatePrescaler_16 16分频
- //SPI_BaudRatePrescaler_256 256分频
-
- void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
- {
- assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
- SPI2->CR1&=0XFFC7;
- SPI2->CR1|=SPI_BaudRatePrescaler; //设置SPI2速度
- SPI_Cmd(SPI2,ENABLE);
- }
- void SPI2_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- SPI_InitTypeDef SPI_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE );//PORTB时钟使能
- RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //IO-->PF0、PF1 端口配置
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOF, &GPIO_InitStructure); //根据设定参数初始化PF0、PF1
- GPIO_ResetBits(GPIOF,GPIO_Pin_1); //PF1输出低
- //GPIO_SetBits(GPIOF,GPIO_Pin_0);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
- GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为低电平
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
- SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
- SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
- SPI_Cmd(SPI2, ENABLE); //使能SPI外设
-
- //SPI2_ReadWriteByte(0xff);//启动传输
- }
- void InitRc522(void)
- {
- SPI2_Init();
- PcdReset();
- PcdAntennaOff();
- delay_ms(2);
- PcdAntennaOn();
- M500PcdConfigISOType( 'A' );
- }
- void Reset_RC522(void)
- {
- PcdReset();
- PcdAntennaOff();
- delay_ms(2);
- PcdAntennaOn();
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:寻卡
- //参数说明: req_code[IN]:寻卡方式
- // 0x52 = 寻感应区内所有符合14443A标准的卡
- // 0x26 = 寻未进入休眠状态的卡
- // pTagType[OUT]:卡片类型代码
- // 0x4400 = Mifare_UltraLight
- // 0x0400 = Mifare_One(S50)
- // 0x0200 = Mifare_One(S70)
- // 0x0800 = Mifare_Pro(X)
- // 0x4403 = Mifare_DESFire
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdRequest(u8 req_code,u8 *pTagType)
- {
- char status;
- u8 unLen;
- u8 ucComMF522Buf[MAXRLEN];
- ClearBitMask(Status2Reg,0x08);
- WriteRawRC(BitFramingReg,0x07);
- SetBitMask(TxControlReg,0x03);
- ucComMF522Buf[0] = req_code;
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
- if ((status == MI_OK) && (unLen == 0x10))
- {
- *pTagType = ucComMF522Buf[0];
- *(pTagType+1) = ucComMF522Buf[1];
- }
- else
- { status = MI_ERR; }
-
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:防冲撞
- //参数说明: pSnr[OUT]:卡片序列号,4字节
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdAnticoll(u8 *pSnr)
- {
- char status;
- u8 i,snr_check=0;
- u8 unLen;
- u8 ucComMF522Buf[MAXRLEN];
-
- ClearBitMask(Status2Reg,0x08);
- WriteRawRC(BitFramingReg,0x00);
- ClearBitMask(CollReg,0x80);
- ucComMF522Buf[0] = PICC_ANTICOLL1;
- ucComMF522Buf[1] = 0x20;
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
- if (status == MI_OK)
- {
- for (i=0; i<4; i++)
- {
- *(pSnr+i) = ucComMF522Buf[i];
- snr_check ^= ucComMF522Buf[i];
- }
- if (snr_check != ucComMF522Buf[i])
- { status = MI_ERR; }
- }
-
- SetBitMask(CollReg,0x80);
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:选定卡片
- //参数说明: pSnr[IN]:卡片序列号,4字节
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdSelect(u8 *pSnr)
- {
- char status;
- u8 i;
- u8 unLen;
- u8 ucComMF522Buf[MAXRLEN];
-
- ucComMF522Buf[0] = PICC_ANTICOLL1;
- ucComMF522Buf[1] = 0x70;
- ucComMF522Buf[6] = 0;
- for (i=0; i<4; i++)
- {
- ucComMF522Buf[i+2] = *(pSnr+i);
- ucComMF522Buf[6] ^= *(pSnr+i);
- }
- CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
-
- ClearBitMask(Status2Reg,0x08);
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
-
- if ((status == MI_OK) && (unLen == 0x18))
- { status = MI_OK; }
- else
- { status = MI_ERR; }
- return status;
- }
- /////////////////////////////////////////////////////////////////////
- //功 能:验证卡片密码
- //参数说明: auth_mode[IN]: 密码验证模式
- // 0x60 = 验证A密钥
- // 0x61 = 验证B密钥
- // addr[IN]:块地址
- // pKey[IN]:密码
- // pSnr[IN]:卡片序列号,4字节
- //返 回: 成功返回MI_OK
- /////////////////////////////////////////////////////////////////////
- char PcdAuthState(u8 auth_mode,u8 addr,u8 *pKey,u8 *pSnr)
- {
- char status;
- u8 unLen;
- u8 i,ucComMF522Buf[MAXRLEN];
- ucComMF522Buf[0] = auth_mode;
- ucComMF522Buf[1] = addr;
- // for (i=0; i<6; i++)
- // { ucComMF522Buf[i+2] = *(pKey+i); }
- // for (i=0; i<6; i++)
- // { ucComMF522Buf[i+8] = *(pSnr+i); }
- memcpy(&ucComMF522Buf[2], pKey, 6);
- memcpy(&ucComMF522Buf[8], pSnr, 4);
-
- status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
- if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|