<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>I am trying to communicate with NRF52832 on MRFC522 vscode. My Write and Read functions are not working</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/108235/i-am-trying-to-communicate-with-nrf52832-on-mrfc522-vscode-my-write-and-read-functions-are-not-working</link><description>Below I have my read and write functions. Are my SPI configuration settings correct? I want to read the RFID card ID value.</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Thu, 13 Feb 2025 03:21:55 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/108235/i-am-trying-to-communicate-with-nrf52832-on-mrfc522-vscode-my-write-and-read-functions-are-not-working" /><item><title>RE: I am trying to communicate with NRF52832 on MRFC522 vscode. My Write and Read functions are not working</title><link>https://devzone.nordicsemi.com/thread/522755?ContentTypeID=1</link><pubDate>Thu, 13 Feb 2025 03:21:55 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a268d334-1ee4-43c1-95a3-fd02a15a537c</guid><dc:creator>akaza-2349</dc:creator><description>&lt;p&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;Dear damar&lt;/span&gt;&lt;/p&gt;
&lt;p data-start="0" data-end="104"&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;Thank you for providing the sample. I was able to read the UID of the card based on what you provided.&lt;/span&gt;&lt;/p&gt;
&lt;p data-start="106" data-end="182"&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;My current issue is that I cannot read the data in the blocks of the card.&lt;/span&gt;&lt;/p&gt;
&lt;p data-start="184" data-end="226" data-is-last-node=""&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;&lt;strong data-start="184" data-end="197"&gt;Hardware:&lt;/strong&gt; nRF52DK, MFRC522, MIFARE 1K.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;Function &lt;strong&gt;Read data on Block 6&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style="background-color:#ffffff;color:#cccccc;font-family:Consolas, &amp;#39;Courier New&amp;#39;, monospace;font-size:14px;font-weight:normal;line-height:19px;white-space:pre;"&gt;
&lt;div&gt;
&lt;div style="background-color:#ffffff;color:#cccccc;font-family:Consolas, &amp;#39;Courier New&amp;#39;, monospace;font-size:14px;font-weight:normal;line-height:19px;white-space:pre;"&gt;
&lt;div&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;&lt;pre class="ui-code" data-mode="text"&gt;void ReadBlock6(uint8_t *cardUID)
{
    uint8_t defaultKeyA[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    uint8_t buffer[16] = {0};
    printf(&amp;quot;cardUID: %02X-%02x-%02x-%02x \n&amp;quot;, cardUID[0], cardUID[1], cardUID[2], cardUID[3]);
    if (TM_MFRC522_Auth(PICC_AUTHENT1A, 6, defaultKeyA, cardUID) == MI_OK)
    {
        TM_MFRC522_ReadBlock(6, buffer);
    }
    else
    {
        printf(&amp;quot;[ERROR] Khong the doc block 6 do loi authen\n&amp;quot;);
    }
}
uint8_t TM_MFRC522_Auth(uint8_t authMode, uint8_t blockAddr, uint8_t *sectorKey, uint8_t *cardUID)
{
    uint8_t buff[12];

    buff[0] = authMode;  // Loại x&amp;#225;c thực (PICC_AUTHENT1A hoặc PICC_AUTHENT1B)
    buff[1] = blockAddr; // Block cần x&amp;#225;c thực

    // Copy key 6 byte
    for (uint8_t i = 0; i &amp;lt; 6; i++)
    {
        buff[i + 2] = sectorKey[i];
    }

    // Copy UID (4 byte)
    for (uint8_t i = 0; i &amp;lt; 4; i++)
    {
        buff[i + 8] = cardUID[i];
    }

    // Gửi lệnh đến thẻ
    uint8_t status = 1;
    printk(&amp;quot;buff: %X-%X-%X-%X-%X-%X-%X-%X-%X-%X-%X-%X\n&amp;quot;, buff[0], buff[1], buff[2], buff[3], 
        buff[4], buff[5], buff[6], buff[7], buff[8], buff[9], buff[10], buff[11]);
    status = TM_MFRC522_ToCard(PCD_AUTHENT, buff, 12, NULL, NULL);
    printk(&amp;quot;Authen status: %d\n&amp;quot;, status);
    if (status != MI_OK)
    {
        printf(&amp;quot;[ERROR] Authen that bai block %d\n&amp;quot;, blockAddr);
    }
    else
    {
        printf(&amp;quot;[INFO] Authen thanh cong block %d\n&amp;quot;, blockAddr);
    }

    return status;
}

TM_MFRC522_STS_T TM_MFRC522_ReadBlock(uint8_t blockAddr, uint8_t *buffer)
{
    TM_MFRC522_STS_T status;
    uint8_t sendData[2];
    uint16_t recvLen;

    printf(&amp;quot;[INFO] Dang doc du lieu tu block: %d\n&amp;quot;, blockAddr);

    sendData[0] = PICC_READ; // Lenh doc block
    sendData[1] = 6;         // Dia chi block can doc

    printf(&amp;quot;[DEBUG] Gui lenh doc: 0x%02X 0x%02X\n&amp;quot;, sendData[0], sendData[1]);

    // Gui lenh doc block den the
    status = TM_MFRC522_ToCard(PCD_TRANSCEIVE, sendData, 2, buffer, &amp;amp;recvLen);

    if (status != MI_OK)
    {
        printf(&amp;quot;[ERROR] Khong the doc block %d!\n&amp;quot;, blockAddr);
        return MI_ERR;
    }

    if (recvLen != (MFRC522_MAX_LEN + 2))
    {
        printf(&amp;quot;[ERROR] So byte nhan duoc khong dung! Nhan: %d, Ky vong: %d\n&amp;quot;, recvLen, MFRC522_MAX_LEN + 2);
        return MI_ERR;
    }

    printf(&amp;quot;[INFO] Du lieu tu block %d: &amp;quot;, blockAddr);
    for (int i = 0; i &amp;lt; MFRC522_MAX_LEN; i++)
    {
        printf(&amp;quot;%02X &amp;quot;, buffer[i]);
    }
    printf(&amp;quot;\n&amp;quot;);

    return MI_OK;
}&lt;/pre&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;Log:&lt;br /&gt;&lt;img style="max-height:240px;max-width:320px;" alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1739417045711v1.png" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="background-color:#ffffff;color:#cccccc;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I am trying to communicate with NRF52832 on MRFC522 vscode. My Write and Read functions are not working</title><link>https://devzone.nordicsemi.com/thread/470124?ContentTypeID=1</link><pubDate>Wed, 21 Feb 2024 22:08:26 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9eed7b1a-3c7a-415e-b87b-017b2a9fbbd2</guid><dc:creator>Ekmekci</dc:creator><description>&lt;p&gt;Good job Dear Merve :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I am trying to communicate with NRF52832 on MRFC522 vscode. My Write and Read functions are not working</title><link>https://devzone.nordicsemi.com/thread/469964?ContentTypeID=1</link><pubDate>Wed, 21 Feb 2024 08:55:20 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:089df475-36c5-4ca1-b101-44de0ba6526e</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Great to hear! And thank you for sharing, in case anyone else encounters similar issues with this sensor.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I am trying to communicate with NRF52832 on MRFC522 vscode. My Write and Read functions are not working</title><link>https://devzone.nordicsemi.com/thread/469934?ContentTypeID=1</link><pubDate>Wed, 21 Feb 2024 06:19:54 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c29629a4-0f27-4dd3-b485-1a8023a549b2</guid><dc:creator>damar</dc:creator><description>&lt;p&gt;Hello everyone,&amp;nbsp;I fixed it. I shared the code that works on mfrc522, nrf52832 and zephyr. Those who want can examine it. thanks.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mervedamar/MFRC522-NRF52"&gt;github.com/.../MFRC522-NRF52&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I am trying to communicate with NRF52832 on MRFC522 vscode. My Write and Read functions are not working</title><link>https://devzone.nordicsemi.com/thread/468632?ContentTypeID=1</link><pubDate>Tue, 13 Feb 2024 13:31:29 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:cf2c45f1-0875-426b-885a-7f33b79f1d98</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t have the SPI device that you are trying to interface (MRFC522), but have you tried to analyze the SPI pins using a logic analyzer? Do you see any data on the lines? And does the MRFC522 send any data back on the MISO line?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I am trying to communicate with NRF52832 on MRFC522 vscode. My Write and Read functions are not working</title><link>https://devzone.nordicsemi.com/thread/468505?ContentTypeID=1</link><pubDate>Tue, 13 Feb 2024 05:31:03 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:1ab0eb6e-5f5d-48c6-8462-ae441b64e73d</guid><dc:creator>damar</dc:creator><description>&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;
#include &amp;lt;zephyr/drivers/gpio.h&amp;gt;
#include &amp;lt;zephyr/drivers/spi.h&amp;gt;


#define PICC_TIMEOUT_5MS    0x09
#define PICC_TIMEOUT_10MS   0x13
#define PICC_TIMEOUT_15MS   0x1E




    struct spi_buf_set tx_bufs;
    struct spi_buf_set rx_bufs;
	struct spi_buf txb;
	struct spi_buf rxb;



#define GPIO DT_NODELABEL(gpio0)
#define GPIO_CS 28
const struct device *gpio1_dev = DEVICE_DT_GET(GPIO);

const struct device *spi_dev = DEVICE_DT_GET(DT_NODELABEL(spi1)) ;

struct spi_config spi_cfg ;
struct spi_cs_control chip;


void SPI_Init(void)
{
  
 	if (!device_is_ready(spi_dev)) {
        /* Device is not ready to use */
		printk(&amp;quot;\r\nStop device not ready\r\n&amp;quot;);
	}
    
    chip.gpio.dt_flags = GPIO_ACTIVE_LOW;
    chip.gpio.pin = 28;
    chip.delay = 2;
	
    spi_cfg.frequency = 4000000;
    spi_cfg.operation = SPI_WORD_SET(8) | SPI_TRANSFER_MSB |
				 SPI_MODE_CPOL | SPI_MODE_CPHA;
    spi_cfg.slave = 0;


 
}



void TM_MFRC522_WrReg(uint8_t ucAddress, uint8_t ucValue)
    {

      
    struct spi_buf_set tx_bufs;
	struct spi_buf txb[2];
    
    uint8_t command;
    command = ucAddress;

    txb[0].buf = &amp;amp;command;
	txb[0].len = 1;
    txb[1].buf = &amp;amp;ucValue;
	txb[1].len = 1;

	tx_bufs.buffers = (const struct spi_buf *)&amp;amp;txb;
	tx_bufs.count = 2;

	spi_transceive(spi_dev,&amp;amp;spi_cfg,&amp;amp;tx_bufs,&amp;amp;rx_bufs);

	}

    

uint8_t TM_MFRC522_RdReg(uint8_t ucAddress)
    {	
  

     uint16_t command = 0x80 | ucAddress;

    txb.buf = &amp;amp;command;
	txb.len = 1;
    tx_bufs.buffers = (const struct spi_buf *)&amp;amp;txb;
	tx_bufs.count = 1;

    rxb.buf = NULL;
	rxb.len = 1;
    rx_bufs.buffers = (const struct spi_buf *)&amp;amp;rxb;
	rx_bufs.count = 1;


	spi_transceive(spi_dev,&amp;amp;spi_cfg,&amp;amp;tx_bufs,&amp;amp;rx_bufs);

return *(uint8_t *)rx_bufs.buffers-&amp;gt;buf;
  
}

void TM_MFRC522_Init(void)
    {

    TM_MFRC522_Reset();

    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);

    TM_MFRC522_AntennaOn();


    }


/* A function to initialize SPI Instance */



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) &amp;amp; (~mask));
    }

void TM_MFRC522_AntennaOn(void)
    {
    uint8_t temp;

    temp = TM_MFRC522_RdReg(MFRC522_REG_TX_CONTROL);
    if (!(temp &amp;amp; 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 &amp;amp;= 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;

    switch (command)
	{
    case PCD_AUTHENT:
	{
	irqEn = 0x12;
	waitIRq = 0x10;
	break;
	}
    case PCD_TRANSCEIVE:
	{
	irqEn = 0x77;
	waitIRq = 0x30;
	break;
	}
    default:
	break;
	}

    TM_MFRC522_WrReg(MFRC522_REG_COMM_IE_N, irqEn | 0x80);
    TM_MFRC522_ClearBitMask(MFRC522_REG_COMM_IRQ, 0x80);
    TM_MFRC522_SetBitMask(MFRC522_REG_FIFO_LEVEL, 0x80);
    TM_MFRC522_WrReg(MFRC522_REG_COMMAND, PCD_IDLE);

    for (i = 0; i &amp;lt; sendLen; i++)
	{
	TM_MFRC522_WrReg(MFRC522_REG_FIFO_DATA, sendData[i]);
	}

    TM_MFRC522_WrReg(MFRC522_REG_COMMAND, command);

    if (command == PCD_TRANSCEIVE)
	{
	TM_MFRC522_SetBitMask(MFRC522_REG_BIT_FRAMING, 0x80);
	}

    i = 0xFFFF;
    do
	{

	n = TM_MFRC522_RdReg(MFRC522_REG_COMM_IRQ);
	i--;
	}
    while (i &amp;amp;&amp;amp; !(n &amp;amp; 0x01) &amp;amp;&amp;amp; !(n &amp;amp; waitIRq));

    TM_MFRC522_ClearBitMask(MFRC522_REG_BIT_FRAMING, 0x80);

    if (i != 0)
	{
	if (!(TM_MFRC522_RdReg(MFRC522_REG_ERROR) &amp;amp; 0x1B))
	    {
	    _status = MI_OK;
	    if (n &amp;amp; irqEn &amp;amp; 0x01)
		{
		_status = MI_NOTAGERR;
		}

	    if (command == PCD_TRANSCEIVE)
		{
		n = TM_MFRC522_RdReg(MFRC522_REG_FIFO_LEVEL);
		lastBits = TM_MFRC522_RdReg(MFRC522_REG_CONTROL) &amp;amp; 0x07;
		if (lastBits)
		    {
		    *backLen = (n - 1) * 8 + lastBits;
		    }
		else
		    {
		    *backLen = n * 8;
		    }

		if (n == 0)
		    {
		    n = 1;
		    }

		if (n &amp;gt; 16)
		    {
		    n = 16;
		    }

		for (i = 0; i &amp;lt; n; i++)
		    {
		    backData[i] = TM_MFRC522_RdReg(MFRC522_REG_FIFO_DATA);
		    }

		backData[i] = 0;
		}
	    }
	else
	    {
	    _status = MI_ERR;
	    }

	}

    return _status;
    }

uint8_t MFRC522_Request(uint8_t reqMode, uint8_t *TagType)
    {
    uint8_t _status;
    unsigned backBits;

    TM_MFRC522_WrReg(MFRC522_REG_BIT_FRAMING, 0x07);

    TagType[0] = reqMode;
    _status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &amp;amp;backBits);

    if ((_status != MI_OK) || (backBits != 0x10))
	{
	_status = MI_ERR;
	}

    return _status;
    }

uint8_t MFRC522_isCard(uint8_t *TagType)
    {
    if (MFRC522_Request(PICC_REQA, TagType) == MI_OK)

	return 1;
    else
	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);		//TxLastBists = BitFramingReg[2..0]
		TM_MFRC522_SetBitMask(MFRC522_REG_COLL,0x80);
	
    /* ANTICOLLISION command with NVB does not specify 40 valid bits (NVB not to 0x70) */
    /* Note: &amp;quot;NVB=0x20&amp;quot; defines that the PCD will transmit no part of UID CLn, and it forces all
             PICCs in the field to respond with their complete UID CLn. */
    serNum[0] = PICC_ANTICOLL;
    serNum[1] = 0x20;   // NVB
    status = TM_MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &amp;amp;unLen);

    if (status == MI_OK) {
        /* Check card serial number */
        for (i = 0; i &amp;lt; 4; i++) { 
					serNumCheck ^= serNum[i];					
        }
        
        /* BCC: UID CLn checkbyte and is calculated
           as exclusive-or over the 4 previous bytes */
        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 &amp;lt; 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) &amp;amp;&amp;amp; !(regValue&amp;amp;0x01) &amp;amp;&amp;amp; !(regValue&amp;amp;waitFor));
		
		
    /* Set StartSend=0 */
    TM_MFRC522_ClearBitMask(MFRC522_REG_BIT_FRAMING, 0x80);

    /* Check if internal timer timeout */
    if (!(regValue &amp;amp;0x01))
    {
        if(i!=0)
				{
        if (!(TM_MFRC522_RdReg(MFRC522_REG_ERROR) &amp;amp; 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) &amp;amp; 0x07;
                if (lastBits)
                    *backLen = (regValue - 1) * 8 + lastBits;   
                else
                    *backLen = regValue * 8;

                if (regValue == 0)
                    regValue = 1;    
                if (regValue &amp;gt; MFRC522_MAX_LEN)
                    regValue = MFRC522_MAX_LEN;   

                /* Read received data in FIFO */
                for (i = 0; i &amp;lt; 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 &amp;lt; 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) &amp;amp;&amp;amp; !(n &amp;amp; 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, &amp;amp;buff[2]);

    if (MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &amp;amp;unLen) != MI_NOTAGERR)
	{
	printf(&amp;quot;Halt command error. \n&amp;quot;);
	}

    }

		
		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)
	status = TM_MFRC522_Anticoll(id);
    else
	status = MI_ERR;
		
    return status;
		
    }
		
		
		
&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I am trying to communicate with NRF52832 on MRFC522 vscode. My Write and Read functions are not working</title><link>https://devzone.nordicsemi.com/thread/468504?ContentTypeID=1</link><pubDate>Tue, 13 Feb 2024 05:30:19 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:99a1c9a3-9d47-4dfe-be1f-8d316b7d26f5</guid><dc:creator>damar</dc:creator><description>&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;

/* Pins Definition for lis3dsh */
#define SPI_SS_PIN   28  // pin to be connected to cs(chip select pin)
#define SPI_SCK_PIN  31  // pin to be connected to clock pin (scl)
#define SPI_MISO_PIN 29  // pin to be connected to MISO 
#define SPI_MOSI_PIN 30  // pin to be connected to MOSI


#define    SPIFlash_CS_LOW    nrf_gpio_pin_clear(SPI_SS_PIN)   // a simple function call to clear the cs pin
#define    SPIFlash_CS_HIGH   nrf_gpio_pin_set(SPI_SS_PIN)     //a simple function call to set the cs pin 



/* 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

/*---------------------------------------------------------------------------------------------------------*/
/* Function declaration                                                                                    */
/*---------------------------------------------------------------------------------------------------------*/
//void MFRC522_Halt();
void SPI_Init(void); 
void 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);
#endif
&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I am trying to communicate with NRF52832 on MRFC522 vscode. My Write and Read functions are not working</title><link>https://devzone.nordicsemi.com/thread/468429?ContentTypeID=1</link><pubDate>Mon, 12 Feb 2024 14:38:37 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b30d8d96-97e1-4003-84ee-4d85df067c95</guid><dc:creator>damar</dc:creator><description>&lt;p&gt;do you have any suggestions?&amp;nbsp;Are my spi configuration settings correct?&amp;nbsp;Are my read and write functions correct?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>