This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/EK-TM4C123GXL:将 MFRC552库从 C++更改为 C

Guru**** 1142300 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/757952/ccs-ek-tm4c123gxl-mfrc552-library-from-c-to-c

器件型号: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 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stephen、

    TI 拥有自己的 NFC/RFID 读/写器器件、因此我们不会为 NXP 解决方案提供支持。

    如果您想读取 NFC/RFID 标签、请查看我们的 TI 设计 :www.ti.com/.../TIDM-TM4C129XNFC
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stephen、

    尽管您指出我之前的回复未能解决您的问题、但您未提供有关原因的反馈、请澄清原因或允许我们关闭此主题。 谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您建议我寻找 TI 产品、但:
    1) 1)我已经有一个 RFID 模块。 为什么要购买另一个而不是使用我拥有的那一个、这是非常受欢迎的?
    2) 2) TI 产品(我拥有的 TM4C123GXL 除外)超出了我的预算(我住在巴西)。 此处的进口税费不友好)、因此现在不能选择购买。
    我坚信我的问题是编码(将代码从 C++移动到 C)、而不是与产品本身完全相关。

    但我非常感谢您的建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stephen、

    我不是说产品本身存在问题。

    但是、请记住、帮助解决以竞争对手产品为中心的问题也不会让我们受益、因为竞争对手产品与我们自己的器件直接竞争。

    如果问题与 TivaWare 或 TM4C 的 SPI 功能有关、我们绝对会为其提供支持、因为这些问题是我们的 TM4C MCU 器件所特有的。

    但是、您需要的是调试移植的 C 库、该库处理竞争对手器件的通信、而该查询不再是特定于 TI 器件的问题。 这是这里问题的核心。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、我完全同意这一论点、我想没有什么可做的。 谢谢您的支持、先生。