请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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