I need interface the MFRC522 with nRF52833 using Zephyr RTOS.

Hai,

i try to MFRC522 rfid reader interface the nrf52833. 
1. I try the read version from reader but it's only show the 0xFF
2.I try to read the card id . it is not work.

I need solution for this. I attached the code below.

mfrc522.c file

#include <stdio.h>
#include "../src/mfrc522.h"

#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/sys/printk.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/spi.h>


#define PICC_TIMEOUT_5MS   0x09
#define PICC_TIMEOUT_10MS  0x13
#define PICC_TIMEOUT_15MS  0X1E


#define GPIO_CS 9

#define SPI1_NODE           DT_NODELABEL(spi1)
const struct device *spi1_dev = DEVICE_DT_GET(SPI1_NODE);


#define GPIO1_NODE        DT_NODELABEL(gpio0)
const struct device *gpio1_dev = DEVICE_DT_GET(GPIO1_NODE);


const struct spi_config spi_cfg = {
      .frequency =4000000U, 
      .operation =  SPI_WORD_SET(8) | SPI_TRANSFER_MSB | SPI_OP_MODE_GET(0), 
    .slave = 0,
};


int SPI_Init(void)
{
    if (!spi1_dev)
    {
        printk("Failed to get SPI device...\n");
        return -1;
    }

    if (!gpio1_dev)
    {
        printk("Failed to get GPIO device\n");
        return -1;
    }

    // Configure CS pin (Active Low)
    //gpio_pin_configure(gpio1_dev, GPIO_CS, GPIO_OUTPUT);
    gpio_pin_set(gpio1_dev, GPIO_CS, GPIO_OUTPUT_INACTIVE);  // Ensure CS is inactive at first
    gpio_pin_configure(gpio1_dev, GPIO_CS,1);
    printk("SPI Initialized.\n");
    return 0;
}


uint8_t TM_MFRC522_RdReg(uint8_t ucAddress) 
{

    uint8_t command = ((ucAddress << 1) & 0x7E) | 0x80;  // Read command
    uint8_t tx_data[1] = {command};                      // Send read command
    uint8_t rx_data[1] = {0};                            // Receive buffer

    struct spi_buf tx_buf = {
        .buf = tx_data,
        .len = 1,
    };

    struct spi_buf rx_buf = {
        .buf = rx_data,
        .len = 1,
    };

    struct spi_buf_set tx = {
        .buffers = &tx_buf,
        .count = 1,
    };

    struct spi_buf_set rx = {
        .buffers = &rx_buf,
        .count = 1,
    };

    gpio_pin_set(gpio1_dev, GPIO_CS, 0);  // Assert CS

    if (spi_transceive(spi1_dev, &spi_cfg, &tx, &rx) != 0) {
        printk("Error reading MFRC522 register\n");
        gpio_pin_set(gpio1_dev, GPIO_CS, 1);  // Deassert CS
        return 0;
    }

    gpio_pin_set(gpio1_dev, GPIO_CS,1);  // Deassert CS
    return rx_data[0];  // Return received byte

}


void TM_MFRC522_WrReg(uint8_t ucAddress, uint8_t ucValue) 

{
    uint8_t command = (ucAddress << 1) & 0x7E;  // Write command
    
    struct spi_buf tx_bufs[2] = {
        { .buf = &command, .len = 1 },
        { .buf = &ucValue, .len = 1 }
    };

    struct spi_buf_set tx_set = {
        .buffers = tx_bufs,
        .count = 2
    };

    gpio_pin_set(gpio1_dev, GPIO_CS, 0);  // Assert CS

    if (spi_write(spi1_dev, &spi_cfg, &tx_set) != 0) {
        printk("SPI transfer failed with error.\n");
    }

    gpio_pin_set(gpio1_dev, GPIO_CS, 1);  // Deassert CS
}




int TM_MFRC522_Init(void) {
    TM_MFRC522_Reset();

    // Initialize MFRC522 registers
    TM_MFRC522_WrReg(MFRC522_REG_T_MODE, 0x8D);
    TM_MFRC522_WrReg(MFRC522_REG_T_PRESCALER, 0x3E);
    TM_MFRC522_WrReg(MFRC522_REG_T_RELOAD_L, 0x09);
    TM_MFRC522_WrReg(MFRC522_REG_T_RELOAD_H, 0);

    TM_MFRC522_WrReg(MFRC522_REG_TX_AUTO, 0x40);
    TM_MFRC522_WrReg(MFRC522_REG_MODE, 0x3D);

    TM_MFRC522_WrReg(MFRC522_REG_RF_CFG, 0x70);

    TM_MFRC522_SetBitMask(MFRC522_REG_DIV1_EN, 0x80);  // Enable automatic handshaking

    TM_MFRC522_AntennaOn();  // Enable antenna

    printk("MFRC522 Initialized.\n");
    return 0;
}


void TM_MFRC522_SetBitMask(uint8_t reg, uint8_t mask)
    {
    TM_MFRC522_WrReg(reg, TM_MFRC522_RdReg(reg) | mask);
    }

void TM_MFRC522_ClearBitMask(uint8_t reg, uint8_t mask)
    {
    TM_MFRC522_WrReg(reg, TM_MFRC522_RdReg(reg) & (~mask));
    }

void TM_MFRC522_AntennaOn(void)
{
    uint8_t temp;

    temp = TM_MFRC522_RdReg(MFRC522_REG_TX_CONTROL);
    if (!(temp & 0x03))
	TM_MFRC522_SetBitMask(MFRC522_REG_TX_CONTROL, 0x03);
}

void TM_MFRC522_AntennaOff(void)
    {
    TM_MFRC522_ClearBitMask(MFRC522_REG_TX_CONTROL, 0x03);
    }

void TM_MFRC522_Reset(void)
    {
    uint8_t temp;

    TM_MFRC522_WrReg(MFRC522_REG_COMMAND, PCD_RESETPHASE);

    do
	{
	temp = TM_MFRC522_RdReg(MFRC522_REG_COMMAND);
	temp &= 0x10;
	}
    while (temp);
    }

uint8_t MFRC522_ToCard(uint8_t command, uint8_t *sendData, uint8_t sendLen, uint8_t *backData, unsigned *backLen)
{
    uint8_t _status = MI_ERR;
    uint8_t irqEn = 0x00;
    uint8_t waitIRq = 0x00;
    uint8_t lastBits;
    uint8_t n;
    unsigned i;

    // Set up irqEn and waitIRq depending on the command
    switch (command)
    {
        case PCD_AUTHENT:
            irqEn = 0x12;  // Enable IRQ for authentication
            waitIRq = 0x10;  // Wait for authentication complete IRQ
            break;
        case PCD_TRANSCEIVE:
            irqEn = 0x77;  // Enable IRQ for transceive
            waitIRq = 0x30;  // Wait for TX and RX complete IRQ
            break;
        default:
            break;
    }

    // Write irqEn and enable IRQ
    TM_MFRC522_WrReg(MFRC522_REG_COMM_IE_N, irqEn | 0x80);  // Enable interrupts
    TM_MFRC522_ClearBitMask(MFRC522_REG_COMM_IRQ, 0x80);  // Clear the interrupt flags
    TM_MFRC522_SetBitMask(MFRC522_REG_FIFO_LEVEL, 0x80);  // Clear FIFO
    TM_MFRC522_WrReg(MFRC522_REG_COMMAND, PCD_IDLE);  // Set the command register to idle

    // Write sendData into FIFO
    for (i = 0; i < sendLen; i++)
    {
        TM_MFRC522_WrReg(MFRC522_REG_FIFO_DATA, sendData[i]);
    }

    // Issue the command
    TM_MFRC522_WrReg(MFRC522_REG_COMMAND, command);

    // If PCD_TRANSCEIVE command, set framing bit
    if (command == PCD_TRANSCEIVE)
    {
        TM_MFRC522_SetBitMask(MFRC522_REG_BIT_FRAMING, 0x80);  // Set the framing bit
    }

    // Wait for interrupt or timeout
    i = 0xFFFF;  // Timeout counter
    do
    {
        n = TM_MFRC522_RdReg(MFRC522_REG_COMM_IRQ);  // Read IRQ status
        i--;
    } while (i && !(n & 0x01) && !(n & waitIRq));  // Wait for interrupt or timeout

    TM_MFRC522_ClearBitMask(MFRC522_REG_BIT_FRAMING, 0x80);  // Clear framing bit

    if (i != 0)  // If no timeout occurred
    {
        // Check for errors in the process
        if (!(TM_MFRC522_RdReg(MFRC522_REG_ERROR) & 0x1B))
        {
            _status = MI_OK;  // No error occurred

            // If no tag found, return MI_NOTAGERR
            if (n & irqEn & 0x01)
            {
                _status = MI_NOTAGERR;
            }

            // Handle PCD_TRANSCEIVE command response
            if (command == PCD_TRANSCEIVE)
            {
                n = TM_MFRC522_RdReg(MFRC522_REG_FIFO_LEVEL);  // Get number of bytes in FIFO
                lastBits = TM_MFRC522_RdReg(MFRC522_REG_CONTROL) & 0x07;  // Get the remaining bits

                // Calculate back data length
                if (lastBits)
                {
                    *backLen = (n - 1) * 8 + lastBits;
                }
                else
                {
                    *backLen = n * 8;
                }

                if (n == 0)
                {
                    n = 1;
                }

                // Limit the number of bytes to read
                if (n > 16)
                {
                    n = 16;
                }

                // Read the data from FIFO into backData
                for (i = 0; i < n; i++)
                {
                    backData[i] = TM_MFRC522_RdReg(MFRC522_REG_FIFO_DATA);
                }

                // Null-terminate the backData for safety
                backData[i] = 0;
            }
        }
        else
        {
            // If an error occurred, set the status to MI_ERR
            _status = MI_ERR;
        }
    }

    return _status;
}

uint8_t MFRC522_Request(uint8_t reqMode, uint8_t *TagType)
{
    uint8_t _status;
    unsigned backBits;

    printk("Sending request...\n");
    
    TM_MFRC522_WrReg(MFRC522_REG_BIT_FRAMING, 0x07);

    TagType[0] = reqMode;
    _status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);

    if (_status != MI_OK) 
    {
        printk("Request failed!\n");
    } 
    else 
    {
        printk("Request succeeded. Back bits: %u\n", backBits);
    }

    if ((_status != MI_OK) || (backBits != 0x10)) 
    {
        printk("MI_ERR\n");
        _status = MI_ERR;
    }

    return _status;
}


uint8_t MFRC522_isCard(uint8_t *TagType) {
    if (MFRC522_Request(PICC_REQA, TagType) == MI_OK) {
        printk("Card detected!\n");
        return 1;
    } else {
        printk("No card detected.\n");
        return 0;
    }
}

		
TM_MFRC522_STS_T TM_MFRC522_Anticoll(uint8_t *serNum) {
    TM_MFRC522_STS_T status;
    uint8_t i;
    uint8_t serNumCheck = 0;
    uint16_t unLen;

    TM_MFRC522_ClearBitMask(MFRC522_REG_STATUS2, 0x08);
    TM_MFRC522_WrReg(MFRC522_REG_BIT_FRAMING, 0x00);
    TM_MFRC522_SetBitMask(MFRC522_REG_COLL, 0x80);

    serNum[0] = PICC_ANTICOLL;
    serNum[1] = 0x20;  // NVB

    status = TM_MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);

    if (status == MI_OK) {
        for (i = 0; i < 4; i++) {
            serNumCheck ^= serNum[i];
        }

        if (serNumCheck != serNum[i]) {
            status = MI_ERR;
        }
    }

    TM_MFRC522_SetBitMask(MFRC522_REG_COLL, 0x80);
    return status;
}
TM_MFRC522_STS_T TM_MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen)
{
    TM_MFRC522_STS_T status = MI_ERR;
    uint8_t irqEn = 0x00;
		uint8_t waitFor = 0x00;
    uint8_t lastBits;
    uint8_t regValue;
    uint16_t i;
    
    switch (command)
    {
        case PCD_AUTHENT:
            irqEn = 0x13;
						waitFor = 0x10;
        //    irqEn = 0x12; (original setting)
            break;
        case PCD_TRANSCEIVE:
            /* TxIRq(b6), RxIRq(b5), IdleIRq(b4),
               HiAlerIRq(b3), LoAlertIRq(b2), ErrIRq(b1), TimerIRq(b0) */
            /* wait response from PICC or 5 ms timeout */
            irqEn = 0x21;
						waitFor = 0x30;
            break;
        default:
            break;
    }
    /* IRQ pin is inverted with respect to the Status1Reg register’s IRq bit */
    TM_MFRC522_WrReg(MFRC522_REG_COMM_IE_N, irqEn | 0x80);

    /* Clear marked bits in ComIrqReg register */
    TM_MFRC522_ClearBitMask(MFRC522_REG_COMM_IRQ, 0x80);
		
		TM_MFRC522_WrReg(MFRC522_REG_COMMAND,PCD_IDLE);

    /* Flush FIFO contents */
    TM_MFRC522_SetBitMask(MFRC522_REG_FIFO_LEVEL, 0x80);

    /* Cancel current comand execution */
    TM_MFRC522_WrReg(MFRC522_REG_COMMAND, PCD_IDLE);

    /* Write data to FIFO */
    for (i = 0; i < sendLen; i++) {   
        TM_MFRC522_WrReg(MFRC522_REG_FIFO_DATA, sendData[i]);    
    }

    /* Execute PCD_TRANSCEIVE command */
    TM_MFRC522_WrReg(MFRC522_REG_COMMAND, command);
    
    if (command == PCD_TRANSCEIVE) {    
        /* Start frame transmission */
        TM_MFRC522_SetBitMask(MFRC522_REG_BIT_FRAMING, 0x80);
    }   
			
		i = 1000;
    /* Wait response from PICC or internal timer 5 ms timeout happened */
    do
		{
			
    regValue = TM_MFRC522_RdReg(MFRC522_REG_COMM_IRQ);
		i--;
		}while ((i!=0) && !(regValue&0x01) && !(regValue&waitFor));
		
		
    /* Set StartSend=0 */
    TM_MFRC522_ClearBitMask(MFRC522_REG_BIT_FRAMING, 0x80);

    /* Check if internal timer timeout */
    if (!(regValue &0x01))
    {
        if(i!=0)
				{
        if (!(TM_MFRC522_RdReg(MFRC522_REG_ERROR) & 0x1B))
        {
            status = MI_OK;
            
            if (command == PCD_TRANSCEIVE)
            {
                /* Check the number of bytes stored in FIFO */
                regValue = TM_MFRC522_RdReg(MFRC522_REG_FIFO_LEVEL);
                
                /* Check valid bit number of last byte */
                lastBits = TM_MFRC522_RdReg(MFRC522_REG_CONTROL) & 0x07;
                if (lastBits)
                    *backLen = (regValue - 1) * 8 + lastBits;   
                else
                    *backLen = regValue * 8;

                if (regValue == 0)
                    regValue = 1;    
                if (regValue > MFRC522_MAX_LEN)
                    regValue = MFRC522_MAX_LEN;   

                /* Read received data in FIFO */
                for (i = 0; i < regValue; i++)
                    backData[i] = TM_MFRC522_RdReg(MFRC522_REG_FIFO_DATA);    
            }
        }
        else
				{status = MI_ERR;}
    }

}
		TM_MFRC522_SetBitMask(MFRC522_REG_CONTROL,0x80);
		TM_MFRC522_WrReg(MFRC522_REG_COMMAND,PCD_IDLE);
    return status;
}
		

void TM_MFRC522_CalculateCRC(uint8_t *pIndata, uint8_t len, uint8_t *pOutData)
    {
    uint8_t i, n;

    TM_MFRC522_ClearBitMask(MFRC522_REG_DIV_IRQ, 0x04);

    TM_MFRC522_SetBitMask(MFRC522_REG_FIFO_LEVEL, 0x80);

    for (i = 0; i < len; i++)
	{
	TM_MFRC522_WrReg(MFRC522_REG_FIFO_DATA, *(pIndata + i));
	}
    TM_MFRC522_WrReg(MFRC522_REG_COMMAND, PCD_CALCCRC);

    i = 0xFF;
    do
	{
	n = TM_MFRC522_RdReg(MFRC522_REG_DIV_IRQ);
	i--;
	}
    while ((i != 0) && !(n & 0x04));

    pOutData[0] = TM_MFRC522_RdReg(MFRC522_REG_CRC_RESULT_L);
    pOutData[1] = TM_MFRC522_RdReg(MFRC522_REG_CRC_RESULT_M);
    }


void TM_MFRC522_Halt(void)
    {

    unsigned unLen;
    uint8_t buff[4];

    buff[0] = PICC_HALT;
    buff[1] = 0;
    TM_MFRC522_CalculateCRC(buff, 2, &buff[2]);

    if (MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &unLen) != MI_NOTAGERR)
	{
	printf("Halt command error. \n");
	}

    }

		
uint8_t TM_MFRC522_Check(uint8_t *id)
{
    uint8_t status;
    uint8_t cardtype[3];

    status = MFRC522_Request(PICC_REQA, cardtype);
    if (status == MI_OK)
    {
    printk("success..!\n");
	status = TM_MFRC522_Anticoll(id);
    }
    else
    {

    printk("not success..!\n");
	status = MI_ERR;
    }	
    return status;
		
}


mfrc522.h

#include <zephyr/device.h>
#include <zephyr/sys/printk.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/spi.h>


/* MFRC522 status */
typedef enum {
    MI_OK = 0,
    MI_NOTAGERR,
    MI_ERR
} TM_MFRC522_STS_T;

/* MFRC522 commands */
#define PCD_IDLE						0x00   // No action; Cancel the current command
#define PCD_AUTHENT						0x0E   // Authentication Key
#define PCD_RECEIVE						0x08   // Receive Data
#define PCD_TRANSMIT					0x04   // Transmit data
#define PCD_TRANSCEIVE					0x0C   // Transmit and receive data,
#define PCD_RESETPHASE					0x0F   // Reset
#define PCD_CALCCRC						0x03   // CRC Calculate

/* Mifare One card command word */
#define PICC_REQA						0x26   // find the antenna area does not enter hibernation
#define PICC_WAKEUP						0x52   // find all the cards antenna area
#define PICC_ANTICOLL					0x93   // anti-collision
#define PICC_SElECTTAG					0x93   // election card
#define PICC_AUTHENT1A					0x60   // authentication key A
#define PICC_AUTHENT1B					0x61   // authentication key B
#define PICC_READ						0x30   // Read Block
#define PICC_WRITE						0xA0   // write block
#define PICC_DECREMENT					0xC0   // debit
#define PICC_INCREMENT					0xC1   // recharge
#define PICC_RESTORE					0xC2   // transfer block data to the buffer
#define PICC_TRANSFER					0xB0   // save the data in the buffer
#define PICC_HALT						0x50   // Sleep

/* MFRC522 Registers */
/* Page 0: Command and Status */
#define MFRC522_REG_RESERVED00			0x00    
#define MFRC522_REG_COMMAND				0x01    
#define MFRC522_REG_COMM_IE_N			0x02    
#define MFRC522_REG_DIV1_EN				0x03    
#define MFRC522_REG_COMM_IRQ			0x04    
#define MFRC522_REG_DIV_IRQ				0x05
#define MFRC522_REG_ERROR				0x06    
#define MFRC522_REG_STATUS1				0x07    
#define MFRC522_REG_STATUS2				0x08    
#define MFRC522_REG_FIFO_DATA			0x09
#define MFRC522_REG_FIFO_LEVEL			0x0A
#define MFRC522_REG_WATER_LEVEL			0x0B
#define MFRC522_REG_CONTROL				0x0C
#define MFRC522_REG_BIT_FRAMING			0x0D
#define MFRC522_REG_COLL				0x0E
#define MFRC522_REG_RESERVED01			0x0F


/* Page 1: Command */
#define MFRC522_REG_RESERVED10			0x10
#define MFRC522_REG_MODE				0x11
#define MFRC522_REG_TX_MODE				0x12
#define MFRC522_REG_RX_MODE				0x13
#define MFRC522_REG_TX_CONTROL			0x14
#define MFRC522_REG_TX_AUTO				0x15
#define MFRC522_REG_TX_SELL				0x16
#define MFRC522_REG_RX_SELL				0x17
#define MFRC522_REG_RX_THRESHOLD		0x18
#define MFRC522_REG_DEMOD				0x19
#define MFRC522_REG_RESERVED11			0x1A
#define MFRC522_REG_RESERVED12			0x1B
#define MFRC522_REG_MIFARE				0x1C
#define MFRC522_REG_RESERVED13			0x1D
#define MFRC522_REG_RESERVED14			0x1E
#define MFRC522_REG_SERIALSPEED			0x1F


/* Page 2: Configuration */
#define MFRC522_REG_RESERVED20			0x20  
#define MFRC522_REG_CRC_RESULT_M		0x21
#define MFRC522_REG_CRC_RESULT_L		0x22
#define MFRC522_REG_RESERVED21			0x23
#define MFRC522_REG_MOD_WIDTH			0x24
#define MFRC522_REG_RESERVED22			0x25
#define MFRC522_REG_RF_CFG				0x26
#define MFRC522_REG_GS_N				0x27
#define MFRC522_REG_CWGS_PREG			0x28
#define MFRC522_REG__MODGS_PREG			0x29
#define MFRC522_REG_T_MODE				0x2A
#define MFRC522_REG_T_PRESCALER			0x2B
#define MFRC522_REG_T_RELOAD_H			0x2C
#define MFRC522_REG_T_RELOAD_L			0x2D
#define MFRC522_REG_T_COUNTER_VALUE_H	0x2E
#define MFRC522_REG_T_COUNTER_VALUE_L	0x2F


/* Page 3:TestRegister */
#define MFRC522_REG_RESERVED30			0x30
#define MFRC522_REG_TEST_SEL1			0x31
#define MFRC522_REG_TEST_SEL2			0x32
#define MFRC522_REG_TEST_PIN_EN			0x33
#define MFRC522_REG_TEST_PIN_VALUE		0x34
#define MFRC522_REG_TEST_BUS			0x35
#define MFRC522_REG_AUTO_TEST			0x36
#define MFRC522_REG_VERSION				0x37
#define MFRC522_REG_ANALOG_TEST			0x38
#define MFRC522_REG_TEST_ADC1			0x39  
#define MFRC522_REG_TEST_ADC2			0x3A   
#define MFRC522_REG_TEST_ADC0			0x3B   
#define MFRC522_REG_RESERVED31			0x3C   
#define MFRC522_REG_RESERVED32			0x3D
#define MFRC522_REG_RESERVED33			0x3E   
#define MFRC522_REG_RESERVED34			0x3F


#define MFRC522_DUMMY					0x00
#define MFRC522_MAX_LEN					16

void TM_MFRC522_Halt(void);
int SPI_Init(void);
int TM_MFRC522_Init(void);
uint8_t TM_MFRC522_RdReg(uint8_t ucAddress);
void TM_MFRC522_WrReg(uint8_t ucAddress, uint8_t ucValue);
void TM_MFRC522_SetBitMask(uint8_t reg, uint8_t mask);
void TM_MFRC522_ClearBitMask(uint8_t reg, uint8_t mask);
void TM_MFRC522_AntennaOn(void);
void TM_MFRC522_AntennaOff(void);
void TM_MFRC522_Reset(void);
uint8_t MFRC522_ToCard(uint8_t command, uint8_t *sendData, uint8_t sendLen, uint8_t *backData,unsigned *backLen);
uint8_t MFRC522_isCard(uint8_t *TagType ) ;
TM_MFRC522_STS_T TM_MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen);
TM_MFRC522_STS_T TM_MFRC522_Anticoll(uint8_t* serNum);
void TM_MFRC522_CalculateCRC(uint8_t*  pIndata, uint8_t len, uint8_t* pOutData);
void TM_MFRC522_Halt(void);
uint8_t TM_MFRC522_Check(uint8_t *id);
uint8_t MFRC522_Request(uint8_t reqMode, uint8_t *TagType);

main.c file 

#include <zephyr/drivers/gpio.h>

#include <zephyr/drivers/SPi.h>
#include "../src/mfrc522.h"



/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)
uint8_t ID[5];
/*
 * A build error on this line means your board is unsupported.
 * See the sample documentation for information on how to fix this.
 */
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

int main(void)
{
	int ret;
    SPI_Init();
    TM_MFRC522_Init();
	if (!gpio_is_ready_dt(&led)) {
		return 0;
	}

	ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
	if (ret < 0) {
		return 0;
	}
    uint8_t version = TM_MFRC522_RdReg(0x37);  // Version register
    printk("MFRC522 Version: 0x%02X\n", version);
	

    if ((TM_MFRC522_Check(ID) == MI_OK))
	{
		gpio_pin_toggle_dt(&led);
        printk(" [%02x%02x%02x%02x%02x]\n\r\n", ID[0], ID[1], ID[2], ID[3], ID[4]);
	}
	
	
	return 0;
}

Output : 

*** Booting nRF Connect SDK v2.7.0-5cb85570ca43 ***
*** Using Zephyr OS v3.6.99-100befc70c74 ***
SPI Initialized.
MFRC522 Initialized.
MFRC522 Version: 0xFF
Sending request...
Request failed!
MI_ERR
not success..!

Related