请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:EK-TM4C123GXL 工具/软件:Code Composer Studio
大家好、大家好。 挖掘网络我找到了一个库来方便使用 MFRC552、但它是用 C++编写的、但我使用 C、所以我尝试移植到 C、但存在一个问题:我无法对我的卡/标签进行身份验证。 下面的代码能够检索卡/标签 ID、但每次我尝试通过身份验证来读取或写入块时、它都会失败、我猜将代码从 C++移植到 C 时会出现一些问题。我尝试了 MFRC552_Auth 函数中的几处更改、但没有任何效果。
main.c
#include
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/ssn.h"
*或"driverlib.idi.h"#include "driverlib_timers.idr.pn.idr.r.idr.r.idr.r.idr.r.idr.idr.h *#include "driverlib"#include "driverlib"#include "driverlib./r.r.r.idr.idr.idr./r.idr.r.r.r.idr.idr.r.idr.idr.r.
... NRSTPD 和芯片选择引脚应更改为引脚掩码。
*
*此外、在 MFRC552_CPP 中、CHIPSELECT_BASE 的定义...
*。。必须将 NRSTPD_BASE 和 SSI_BASE 更改为相应的。。。
*...使用的端口基座。
*
*最后、相应的芯片选择引脚和 NRSTPD...
*。 应在 InitSSI 功能中启用 GPIO 基址和引脚。
*
*
**后续版本应自动更改此值。
*
*
* SDA / CS / FSS --- Pb5
* SCK / CLK ------ PB4
* MOSI / TX ------ Pb7
* MISO / RX ------ Pb6
*
* RST ------ PF0 *
*
**/
#define redLED 0x00000002
#define blueLED 0x00000004
#define greenLED 0x00000008
void initLets();
void dumpHex (unsigned char* buffer、int len);
uint8_t Version;
uint8_t AntennaGain;
uint8_t status;
uint32_t readTeste;
unsigned char str[MAX_LEN];
unsigned char cardID[CARD_LENG];
unsigned char RxData[MAX_LEN];
unsigned char TxData[MAX_LEN];
void InitConsole (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig (0、115200、16000000);
}
空 InitSSI(){
uint32_t junkAuxVar;
SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//SDA
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);//复位
GPIOPinConfigure (GPIO_PB4_SSI2CLK);
//GPIOPinConfigure (GPIO_PB5_SSI2FSS);
GPIOPinConfigure (GPIO_PB6_SSI2RX);
GPIOPinConfigure (GPIO_PB7_SSI2TX);
GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_7);
GPIOPinTypeGPIOOutput (chip_select_BASE、chip_select_PIN);//chipSelectPin
GPIOPinTypeGPIOOutput (NRSTPD_BASE、NRSTPD_PIN);//NRSTPD
SSIConfigSetExpClk (SSI2_base、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、4000000、 8);
SSIEnable (SSI2_base);
while (SSIDataGetNonBlocking (SSI2_base、&junkAuxVar));
UARTprintf ("SSI 已启用! SPI 模式! n 数据:8位。\n\n");
}
int main (void)
{
SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);//80MHz
InitConsole();
initLetds();
InitSSI();
unsigned char key[6]、i;
对于(I = 0;I < 6;I++)
KEY [i]= 0xFF;
GPIOPinWrite (CHIP_SELECT_BASE、CHIP_SELECT_PIN、0);
GPIOPinWrite (NRSTPD_BASE、NRSTPD_PIN、NRSTPD_PIN);
MFRC552_Init();
版本= MFRC552_ReadReg (版本 Reg);
AntennaGain = MFRC552_ReadReg (PICC_REQIDL)&(0x70);
UARTprintf ("版本:0x%x \n"、版本);
UARTprintf ("天线增益:0x%x \n"AntennaGain);
while (1)
{
status = MFRC552_request (PICC_REQIDL、str);
if (status == MI_OK)
{
UARTprintf ("Cartao 0x%0x Detectado! \n"、(str[0]<< 8)+ str[1]);//检测到卡
状态= MFRC552_Anticoll (str);
if (status == MI_OK)
{
memcpy (cardID、str、card_length);
UARTprintf ("ID:");
dumpHex ((unsigned char*) cardID、card_length);
if (cardID[0]= 0x36 || cardID[1]= 0xE2 || cardID[2]= 0x45 ||
cardID[3]= 0x43 || cardID[0]= 0xD2)
GPIOPinWrite (GPIO_PORTF_BASE、绿色 LED、绿色 LED);
其他
GPIOPinWrite (GPIO_PORTF_BASE、BlueLED、BlueLED);
strcpy (TxData、"1234567890");
状态= MFRC552_Auth (0x60、1、KEY、cardID);
if (status == MI_ERR)
{
UARTprintf ("FALHA NA AUTENTICACAO:0x%X\n"、MFRC552_ReadReg (ErrorReg));
GPIOPinWrite (GPIO_PORTF_BASE、redLED、redLED);
}
状态= MFRC552_WriteBlock (1、TxData);
if (status == MI_ERR)
{
UARTprintf ("FALHA NA 关键:0x%X\n"、MFRC552_ReadReg (ErrorReg));
GPIOPinWrite (GPIO_PORTF_BASE、redLED、redLED);
}
SysCtlDelay (SysCtlClockGet ()/6);//延迟
状态= MFRC552_Auth (0x60、1、KEY、cardID);
if (status == MI_ERR)
{
UARTprintf ("FALHA NA AUTENTICACAO:0x%X\n"、MFRC552_ReadReg (ErrorReg));
GPIOPinWrite (GPIO_PORTF_BASE、redLED、redLED);
}
状态= MFRC552_ReadBlock (1、RxData);
if (status == MI_ERR)
{
UARTprintf ("FALHA NA Leitura:0x%X\n"、MFRC552_ReadReg (ErrorReg));
GPIOPinWrite (GPIO_PORTF_BASE、redLED、redLED);
}
否则、如果(status == MI_OK)
dumpHex ((unsigned char*) RxData、10);
}
否则、如果(status == MI_ERR)
{
UARTprintf ("Colisao detectada!!!!!\n"、MFRC552_ReadReg (ErrorReg));
GPIOPinWrite (GPIO_PORTF_BASE、redLED、redLED);
}
SysCtlDelay (SysCtlClockGet ()/3);//延迟
GPIOPinWrite (GPIO_PORTF_BASE、0x0E、0);
UARTprintf ("\n\nAp近 端 o cartao / tag\n");
}
}
void initLets(){
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
}
空 dumpHex (无符号 char*缓冲器、int len){
int i;
for (i=0;i < len;i++)
UARTprintf ("0x%X"、buffer[i]);
UARTprintf ("\n\n");
}
MFRC552.h
/* 文件: MFRC522.h MFRC522 -用于与 Eelco Rouw 创建的基于廉价 MFRC522的 NFC 读/写器进行通信的库-主要基于 Stephen S. M.移植到 C 的 Grant Gibson (www.grantgibson.co.uk)和 Dr.Leong (WWW.B2CQSHOP.COM)的代码, 这些代码已发布到公共域 中*//* MFRC522和特定于卡的定义。 有关每个定义的作用、请参阅数据表。 */ #define MAX_LEN16 #define CARD_LENGTH 5 #define CHIP_SELECT_BASE GPIO_PORTB_BASE #define CHIP_SELECT_PIN GPIO_PIN_5 #define NRSTPD_BASE GPIO_PORTF_BASE #define NRSTPD_PIN GPIO_PIN_0 #define SSI_BASE SSI2_base //MF522 -命令 #define PCD_IDLE 0x00 #define PCD_Authent 0x0E #define PCD_Receive 0x08 #define PCD_Transmit 0x04 #define PCD_TRANSCEIVE 0x0C #define PCD_RESETPHASE 0x0F #define PCD_CALCCRC 0x03 //Mifare _one -命令 #define PICC_REQIDL 0x26 #define PICC_REQALL 0x52 #define PICC_ANTICOLL 0x93 #define PICC_SElECTTAG 0x93 #define PICC_AUTHENT1A 0x60 #define PICC_AUTHENT1B 0x61 #define PICC_READ 0x30 #define PICC_WRITE 0xA0 #define PICC_递减 0xC0 #define PICC_Increment 0xC1 #define PICC_RESTORE 0xC2 #define PICC_TRANSFRA传输 0xB0 #define PICC_HALT 0x50 /MF522 -状态 #define MI_OK 0 #define MI_NOTAGERR 1 #define MI_ERR 2 //MF522 -寄存器 //Page 0:命令和状态 #define 被保留00 0x00 #define CommandReg 0x01 #define 通信注册 0x02 #define DivlEnReg 0x03 #define CommIrqReg 0x04 #define DivIrqReg 0x05 #define 错误注册 0x06 #define 状态1注册 0x07 #define 状态2注册 0x08 #define FIFODataReg 0x09 #define FIFO LEVELReg 0x0A #define WaterLevelReg 0x0B #define ControlReg 0x0C #define 位帧注册 0x0D #define 准直器 0x0E #define 被保留01 0x0F //Page 1:命令 #define 被保留10. 0x10 #define ModeReg 0x11 #define TxModeReg 0x12 #define RxModeReg 0x13 #define TxControlReg 0x14 #define TxAutoReg 0x15 #define TxSelReg 0x16 #define RxSelReg 0x17 #define RxThresholdReg 0x18 #define 演示注册 0x19 #define 被保留11. 0x1A #define 被保留12. 0x1b #define MifareReg 0x1C #define 被保留13. 0x1D #define 被保留14. 0x1E #define 串行 SpeedReg 0x1f //Page 2:CFG #define 被保留20. 0x20 #define CRCResultRegM 0x21 #define CRCResultRegL 0x22 #define 被保留21. 0x23 #define ModWidthReg 0x24 #define 被保留22. 0x25 #define RFCfgReg 0x26 #define GsNReg 0x27 #define CWGsPReg0x28 #define ModGsPReg 0x29 #define TModeReg 0x2A #define 预分频器注册 0x2B #define TReloadRegH 0x2C #define TReloadRegL 0x2D #define 计数器值寄存器 0x2E #define 计数器值寄存器 0x2F //Page 3:测试寄存器 #define 被保留30. 0x30 #define 测试 Sel1Reg 0x31 #define 测试 Sel2Reg 0x32 #define 测试引脚 EnReg 0x33 #define TestPinValueReg 0x34 #define TestBusReg 0x35 #define AutoTestReg 0x36 #define 版本注册 0x37 #define AnalogTestReg 0x38 #define 测试 DAC1稳压器 0x39 #define 测试 DAC2Reg 0x3A #define 测试 ADCReg 0x3B #define 被保留31. 0x3C #define 被保留32. 0x3D #define 被保留33. 0x3E #define Reserved340x3F void MFRC552_WriteReg (unsigned char addr、unsigned char val); unsigned char MFRC552_ReadReg (unsigned char addr); void MFRC552_SetBitMask (unsigned char reg、unsigned char mask mask);void MFRC552_enchar Antenchar (unsigned tchar reg、unsigned tchar mask mask mask); void M552 );void MFRC552non_Reset_Ontenchar void MFRC552_Init (void); unsigned char MFRC552_request (unsigned char reqMode、unsigned char * TagType); unsigned char MFRC552_ToCard (unsigned char 命令、unsigned char * sendData、unsigned char sendLen、unsigned char * backData、unsigned int * backLen); unsigned MFRC552_Anticoll (unsigned char * serNum); void MFRC552_CalulateCRC (unsigned char * pIndata、unsigned char * pOutData); unsigned char MFRC552_SelectTag (unsigned char * serNum); ReadMFRC552_Auth (unsigned char * 、unsigned char a r *、unsigned char a r *、unsigned char a r *、unsigned char a r *、unsigned char a r *、unsigned char a r、unsigned char a r *、unsigned char a r、unsigned char a r *、unsigned char a r void MFRC552_halt (void);
MFRC552.c
#include
#include
/*
文件:MFRC522.h
MFRC522 -用于与基于 MFRC522的廉价 NFC 读/写器进行通信的库
由 Eelco Rouw 创建-主要基于 Grant Gibson (www.grantgibson.co.uk)和 Dr.Leong (WWW.B2CQSHOP.COM)的代码
由 Stephen S. M.移植到 C
发布到公共域
中*/
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "mrrrrrrflib/sec.h"
*
写入一个参数:rrrrrrrbyte-rev addressï¼›*写入一个数据:rrrrr.h *参数: 需要在
*中写入的值返回:null
*/
uint8_t SPI_transfer (uint8_t data)
{
uint32_t rxtxData;
rxtxData =数据;
SSIDataPut (SSI_base、(uint8_t) rxtxData);
while (SSIBusy (SSI_base));
SSIDataGet (SSI_base、&rxtxData);
返回(uint8_t) rxtxData;
}
void MFRC552_WriteReg (unsigned char addr、unsigned char val)
{
GPIOPinWrite (CHIP_SELECT_BASE、CHIP_SELECT_PIN、0);
SPI_transfer ((addr<<1)&0x7E);
SPI_transfer (val);
GPIOPinWrite (chip_select_BASE、chip_select_PIN、chip_select_PIN);
}
//*
函数:ReadReg
*说明:将字节数据读取到 MR RC522的一个寄存器
中*输入参数:Addr--register address
* return:return the read value
*/
unsigned char MFRC552_ReadReg (unsigned char addr)
{
unsigned char val;
GPIOPinWrite (CHIP_SELECT_BASE、CHIP_SELECT_PIN、0);
SPI_transfer (((addr<<1)&0x7E)| 0x80);
Val = SPI_transfer (0x00);
GPIOPinWrite (chip_select_base、chip_select_PIN、chip_select_PIN);
返回 val;
}
//
*函数:SetBitMask
*说明:设置 RC522寄存器位
*输入参数:reg-寄存器地址;mask--value
*返回:空
*/
void MFRC552_SetBitMask (unsigned char reg、unsigned char mask)
{
unsigned char tmp;
tmp = MFRC552_ReadReg (reg);
MFRC552_WriteReg (reg、tmp | MASK);//设置位掩码
}
//
*函数:ClearBitMask
*说明:清除 RC522寄存器位
*输入参数:reg-寄存器地址;mask--value
*返回:空
*/
void MFRC552_ClearBitMask (unsigned char reg、unsigned char mask mask)
{
unsigned char tmp;
tmp = MFRC552_ReadReg (reg);
MFRC552_WriteReg (reg、tmp &(~遮罩));//清除位掩码
}
//*
函数:AntennaOn
*说明:打开天线,每次打开或关闭天线都需要至少1ms 的延迟
*输入参数:空
*返回:空
*/
void MFRC552_AntennaOn (void)
{
unsigned char temp;
温度= MFRC552_ReadReg (TxControlReg);
如果(!(temp & 0x03))
{
MFRC552_SetBitMask (TxControlReg、0x03);
}
}
//
*函数:AntennaOff
*说明:关闭天线,每次打开或关闭天线都需要至少1ms 的延迟
*输入参数:空
*返回:空
*/
void MFRC552_AntennaOff (void)
{
MFRC552_ClearBitMask (TxControlReg、0x03);
}
//
*函数:复位
*说明:复位 RC522
*输入参数:空
*返回:空
*/
void MFRC552_Reset (void)
{
MFRC552_WriteReg (CommandReg、PCD_RESETPHASE);
}
//*
函数:init
*说明:初始化 RC522
*输入参数:空
*返回:空
*/
void MFRC552_Init (void)
{
GPIOPinWrite (NRSTPD_BASE、NRSTPD_PIN、NRSTPD_PIN);
MFRC552_Reset ();
//计时器:TPrescaler*TreloadVal/6.78MHz = 24ms
MFRC552_WriteReg (TModeReg、0x8D); //Tauto=1;f (定时器)= 6.78MHz/TPreScaler
MFRC552_WriteReg (TPrescalerReg、0x3E);//TModeReg [3.0.0]+ TPrescalerReg
MFRC552_WriteReg (TReloadRegL、30);
MFRC552_WriteReg (TReloadRegH、0);
MFRC552_WriteReg (TxAutoReg、0x40); //100%ASK
MFRC552_WriteReg (ModeReg、0x3D);
//ClearBitMask (Status2Reg、0x08); //MFCrypto1On=0
//WriteReg (RxSelReg、0x86); //RxWait = RxSelReg[5.0.0]
//WriteReg (RFCfgReg、0x7F); //RxGain = 48dB
MFRC552_AntennaOn();
}/*
函数:请求
*说明:搜索卡,读取卡类型
*输入参数:reqMode-search methods:
* TagType--return 卡类型
* 0x4400 = Mifare 超轻型
* 0x0400 = Mifare _one (S50)
* 0x0200 = Mifare _one (S70)
* 0x0800 = Mifar_Pro (X)
* 0x4403 = Mifare _DESFire
*返回:如果成功
*/
unsigned char MFRC552_request (unsigned char reqMode、unsigned char * TagType)
{、则返回 MI_OK
unsigned char status;
unsigned int backBits;
MFRC552_WriteReg (BitFramingReg、0x07); //TxLastLists =位帧注册[2..0]???
TagType[0]= reqMode;
状态= MFRC552_ToCard (PCD_TRANSCEIVE、TagType、1、TagType、&BackBits);
if ((status!= MI_OK)||(backBits!= 0x10))
{
状态= MI_ERR;
}
返回状态;
}
/*
函数:ToCard
*说明:RC522和 ISO14443之间的通信
*输入参数:COMMANT-MF522命令位
* sendData--通过 rc522
*将数据发送到卡 sendLen--发送数据长度
* BackData --从卡返回数据
* backLen--the length of return data
* return:return MI_OK if successful
*/
unsigned char MFRC552_ToCard (unsigned char 命令、unsigned char * sendData、unsigned char sendLen、unsigned char * backData、unsigned int * backLen)
{
unsigned char status = MI_ERR;
unsigned char irqEn = 0x00;
unsigned char waitIRq = 0x00;
unsigned char lastBits;
unsigned char n;
unsigned int i;
switch (命令)
{
案例 PCD_Authent:
{
irqEn = 0x12;
waitIRq = 0x10;
中断;
}
案例 PCD_TRANSCEIVE:
{
irqEn = 0x77;
waitIRq = 0x30;
中断;
}
默认值:
中断;
}
MFRC552_WriteReg (CommIEnReg、irqEn|0x80);
MFRC552_ClearBitMask (CommIrqReg、0x80);
MFRC552_SetBitMask (FIFOLevelReg、0x80);
MFRC552_WriteReg (CommandReg、PCD_IDLE);
对于(i=0;i < sendLen;i++)
{
MFRC552_WriteReg (FIFODataReg、sendData[i]);
}
MFRC552_WriteReg (CommandReg、命令);
if (命令=PCD_TRANSCEIVE)
{
MFRC552_SetBitMask (BitFramingReg、0x80); //StartSend=1,数据传输开始
}
I = 10000;
操作
{
N = MFRC552_ReadReg (CommIrqReg);
i--;
}
while ((i!=0)&&!(n&0x01)&&!(n&waitIRq);
MFRC552_ClearBitMask (BitFramingReg、0x80); //StartSend=0
如果(i!= 0)
{
if (!(MFRC552_ReadReg (ErrorReg)& 0x1B))//BufferOvfl Collerr CRCErr ProtectolErr
{
状态= MI_OK;
IF (n & irqEn & 0x01)
{
状态= MI_NOTAGERR; //?
?}
if (命令=PCD_TRANSCEIVE)
{
N = MFRC552_ReadReg (FIFOLevelReg);
LastBits = MFRC552_ReadReg (ControlReg)& 0x07;
IF (lastBits)
{
*backLen =(n-1)*8 + lastBits;
}
其他
{
*backLen =n*8;
}
如果(n = 0)
{
N = 1;
}
如果(n > MAX_LEN)
{
N = MAX_LEN;
}
对于(i=0;i