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.

[参考译文] TRF7970A:无法锁定块 ISO15693 RFID

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1375664/trf7970a-unable-to-lock-a-block-iso15693-rfid

器件型号:TRF7970A
主题中讨论的其他器件:MSP430G2553、、、 MSP430F2370

工具与软件:

您好!

我正在将 sloc297c 用于 MSP430G2553和 TRF7970a、并且我能够发送命令以写入/读取数据 ISO15693 RFID、但我找不到 lock a block RFID 函数 sloc297c。 我修改了写入单一块函数、以包括锁定块命令0x22、但它不起作用、并且我总是得到 NO_RESPONSE_RECEIVED。  

任何帮助都是非常感谢。

谢谢你

Le

uint8_t ISO15693_sendWriteSingleBlock (uint8_t ui8ReqFlag、uint8_t ui8BlockNumber、uint8_t ui8BlockSize、uint8_t * pui8BlockData)


uint8_t ui8Offset = 0;
uint8_t ui8Status = STATUS_FAIL;
uint8_t i、rxLength = 11;
uint8_t lock = false;
uint8_t buffer[32];


if ((ui8ReqFlag & 0x04)=0){//写入单个块命令代码
rxLength += ui8BlockSize;//为写入命令的数据长度添加4个字节
}
ui8ReqFlag = ui8ReqFlag | 0x20;//强制使用寻址的写入-强烈建议的做法
Buffer[ui8Offset++]= 0x8F;//复位 FIFO
Buffer[ui8Offset++]= 0x91;//随 CRC 发送
Buffer[ui8Offset++]= 0x3D;//连续写入
Buffer[ui8Offset++]=((rxLength & 0xF0)>> 0x04);//以字节为单位的数据包长度-发送字节长度的中高半字节
Buffer[ui8Offset++]=(rxLength << 0x04);//以字节为单位的数据包长度-发送字节长度的低半字节和不完整的半字节
Buffer[ui8Offset++]= ui8ReqFlag;// ISO15693标志
如果(ui8ReqFlag 和0x04){
Buffer[ui8Offset++]= 0x22;//写入锁定单块命令代码
}
否则{
Buffer[ui8Offset++]= 0x21;//写入单个块命令代码
}

对于(I = 0;I < ISO15693_ID_LENGTH;I++){
Buffer[ui8Offset++]= tagID[i];
}
Buffer[ui8Offset++]= ui8BlockNumber;//块编号(变量、对于 HF-I Plus 器件、可以转到0x3F;Pro 和 Standard、使用"错误"响应标志进行处理)

如果((ui8ReqFlag 和0x04)=0){
对于(i = 0;i < ui8BlockSize;i++){
Buffer[ui8Offset++]= pui8BlockData[i];//要写入标签的数据
}
}

Buffer[ui8Offset++]= 0;
Buffer[ui8Offset++]= 0;

TRF79xxA_resetIrqStatus ();

TRF79xxA_writeRaw (&Buffer[0]、rxLength + 5);//发出 Get System Information 命令

g_sTrfStatus = TRF79xxA_getTrfStatus ();

//进行特殊处理以涵盖 TI Tag-It HF-I ISO15693应答器的选项标志使用案例
if (g_sTrfStatus == trf_idle || g_sTrfStatus == TX_WAIT){
if (ui8ReqFlag & 0x40){//检查是否设置了选项标志
TRF79xxA_waitTxIRQ (20);// 10毫秒 TX 超时

g_sTrfStatus = TRF79xxA_getTrfStatus ();
if (g_sTrfStatus == TX_COMPLETE){// if transmit complete
MCU_delayMillisecond (20);// 10
TRF79xxA_sendDirectCommand (TRF79XXA_TRANSMIT_NEXT_SLOT_CMD);//发送帧结束标记
TRF79xxA_waitRxIRQ (30);// 30毫秒 RX 超时
}
else{//否则返回错误
Return ui8Status = STATUS_FAIL;
}
}
否则{
TRF79xxA_waitTxIRQ (10);// 10毫秒 TX 超时
TRF79xxA_waitRxIRQ (30);// 30毫秒 RX 超时
}
}
否则、如果(g_sTrfStatus == TX_COMPLETE){
if (ui8ReqFlag & 0x40){//检查是否设置了选项标志
mcu_delayMillisecond (10);
TRF79xxA_sendDirectCommand (TRF79XXA_TRANSMIT_NEXT_SLOT_CMD);//发送帧结束标记
}
TRF79xxA_waitRxIRQ (30);// 30毫秒 RX 超时
}
否则{
Return ui8Status = STATUS_FAIL;
}

g_sTrfStatus = TRF79xxA_getTrfStatus ();
if (g_sTrfStatus == RX_COMPLETE){// if data has been received.
if (ShareBuffer.array.buffer[0]== 0x00){//确认响应标志字节中的"无错误"
ui8Status = STATUS_SUCCESS;//已收到响应
}
else{//响应字节中返回了错误
ui8Status = STATUS_FAIL;
}
}
else{//无响应
ui8Status = STATUS_FAIL;
}

返回 ui8Status;
}

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

    您好!

     请参阅此应用手册 使用 TRF7970A 的 NFC/HF RFID 读/写器(修订版 B) 、其中软件配套资料包含用于锁定 T5标签上的块的驱动程序。  

     

    很抱歉、 还请注意、 此产品已缩减为首先参考我们的现有文档和配套资料。 如需支持、请查看该主题页面右下角的"类似主题"部分。 另外、请查阅 产品网页的"技术文档"部分中的现有配套资料 以及 常见问题解答文档。 或者、您可以使用您选择的搜索引擎来查找相关的 E2E 主题。 借助这些资源、我们相信可以解决您的问题。

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

    尊敬的 Charles:

    感谢您提供的信息和建议。 很遗憾、由于项目时间限制、我们无法更改以使用您在上面提到的不同应用手册、  

    是否可以将 RFID 块锁定到应用手册 sloc297c 的代码中?

    非常感谢您的帮助。

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

    你(们)好

     您可以参考我参考的应用手册、并遵循它如何在块上实现锁定、并根据当前代码对其进行添加/修改。  

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

    你(们)好

     您可以参考我参考的应用手册、并遵循它如何在块上实现锁定并将其添加到当前代码中。  

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

    尊敬的 Charles:

    谢谢你,我会试一下,让你知道。

    Le

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

    尊敬的 Charles:

    是 sloa227b 吗?

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

    您好!

     是的、这是 sloa227。  https://www.ti.com/lit/pdf/sloa227

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

    尊敬的 Charles:

    在 sloa227中很难/很难遵循代码。  

    有一点我不明白、我们还针对不同项目使用了另一个应用手册(别记住应用手册名称)、它用于 MSP430F2370和 TRF7970a、锁 A 块运行良好。 我使用该应用手册中的相同命令根据上述代码实现到 sloc297c 应用手册工程中、但它始终返回 NO_RECEIVE_RESPONSE。  

    谢谢你

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

    尊敬的 Le:

     我不是该产品的专家。 我不知道在这种情况下出了什么问题。 您的标签是否支持锁定块? 存储器格式是否可能不同? 我发现此应用手册介绍了如何使用 ISO15693命令、包括发出锁定命令。  https://www.ti.com/lit/pdf/sloa141

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

    Charles

    是的、标签支持锁定数据。 我们正在使用这个标签的其他项目,如上所述,它运行良好。  

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

    请提供帮助。

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

    您好!

     您可以查看此帖子吗? 我希望它对您有所帮助。  

    https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/619581/trf7970a-lock-kill-process-of-trf7970a?tisearch=e2e-sitesearch&keymatch=trf7970a%2525252525252520lock#

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

    尊敬的 Le:

     我找到这个函数来锁定块。 希望您能根据需要加以利用和调整。  

    //*****************************************************************************
    //
    //! ISO15693_sendLockBlock - Issue the Lock Block command
    //! for ISO15693 tags.
    //!
    //! \param ui8ReqFlag are the request flags for ISO15693 commands.
    //! \param ui8BlockNumber is the block number to write data to.
    //! \param ui8BlockSize is the tag block size.
    //! \param pui8BlockData is the data to be written.
    //!
    //! Function issues an addressed Lock Block with the specified request
    //! flags as well as the address flag. 
    //!
    //! The function will always add the address flag to the command as a good
    //! practice to avoid locking other ISO15693 tags in the vicinity.
    //!
    //! \return ui8Status returns either STATUS_SUCCESS or STATUS_FAIL to
    //! indicate if the Lock Block was successful or not.
    //
    //*****************************************************************************
    
    uint8_t ISO15693_sendLockBlock(uint8_t ui8ReqFlag, uint8_t ui8BlockNumber)
    {
    	uint8_t ui8Offset = 0;
    	uint8_t ui8Status = STATUS_FAIL;
    
    	ui8ReqFlag = ui8ReqFlag | 0x20; 		// Mandatory use of addressed writes - highly recommended practice
    
    	g_pui8TrfBuffer[ui8Offset++] = 0x8F;		// Reset FIFO
    	g_pui8TrfBuffer[ui8Offset++] = 0x91;		// Send with CRC
    	g_pui8TrfBuffer[ui8Offset++] = 0x3D;		// Write Continuous
    	g_pui8TrfBuffer[ui8Offset++] = 0x00;	// Length of packet in bytes - upper and middle nibbles of transmit byte length
    	g_pui8TrfBuffer[ui8Offset++] = 0xB0;			// Length of packet in bytes - lower and broken nibbles of transmit byte length
    	g_pui8TrfBuffer[ui8Offset++] = ui8ReqFlag;	// ISO15693 flags
    	g_pui8TrfBuffer[ui8Offset++] = 0x22;			// Lock Block command code
    	g_pui8TrfBuffer[ui8Offset++] = g_pui8Iso15693UId[0];	// Tag UID
    	g_pui8TrfBuffer[ui8Offset++] = g_pui8Iso15693UId[1];	// Tag UID
    	g_pui8TrfBuffer[ui8Offset++] = g_pui8Iso15693UId[2];	// Tag UID
    	g_pui8TrfBuffer[ui8Offset++] = g_pui8Iso15693UId[3];	// Tag UID
    	g_pui8TrfBuffer[ui8Offset++] = g_pui8Iso15693UId[4];	// Tag UID
    	g_pui8TrfBuffer[ui8Offset++] = g_pui8Iso15693UId[5];	// Tag UID
    	g_pui8TrfBuffer[ui8Offset++] = g_pui8Iso15693UId[6];	// Tag UID
    	g_pui8TrfBuffer[ui8Offset++] = g_pui8Iso15693UId[7];	// Tag UID
    	g_pui8TrfBuffer[ui8Offset++] = ui8BlockNumber;		// Block # (variable, for HF-I Plus device can go to 0x3F, Pro and Standard handled with "error" response flags)
    
    	TRF79xxA_writeRaw(&g_pui8TrfBuffer[0], ui8Offset);		// Issue the Get System Information command
    
    	g_sTrfStatus = TRF79xxA_getTrfStatus();
    
    	// Special handling to cover option flag use case for TI Tag-It HF-I ISO15693 transponders
    	if (g_sTrfStatus == TRF_IDLE || g_sTrfStatus == TX_WAIT)
    	{
    		// Check if the option flag is set
    		if (ui8ReqFlag & 0x40)
    		{
    			TRF79xxA_waitTxIRQ(10);	// 10 millisecond TX timeout
    
    			g_sTrfStatus = TRF79xxA_getTrfStatus();
    
    			if (g_sTrfStatus == TX_COMPLETE)	// If transmit is complete
    			{
    				MCU_delayMillisecond(10);
    				TRF79xxA_sendDirectCommand(TRF79XXA_TRANSMIT_NEXT_SLOT_CMD);		// Send out End of Frame marker
    				TRF79xxA_waitRxIRQ(30);				// 30 millisecond RX timeout
    			}
    			else								// Otherwise return an error
    			{
    				return ui8Status = STATUS_FAIL;
    			}
    		}
    		else
    		{
    			TRF79xxA_waitTxIRQ(10);	// 10 millisecond TX timeout
    			TRF79xxA_waitRxIRQ(30);	// 30 millisecond RX timeout
    		}
    	}
    	else if (g_sTrfStatus == TX_COMPLETE)
    	{
    		// Check if the option flag is set
    		if (ui8ReqFlag & 0x40)
    		{
    			MCU_delayMillisecond(10);
    			TRF79xxA_sendDirectCommand(TRF79XXA_TRANSMIT_NEXT_SLOT_CMD);		// Send out End of Frame marker
    		}
    
    		TRF79xxA_waitRxIRQ(30);				// 30 millisecond RX timeout
    	}
    	else
    	{
    		return ui8Status = STATUS_FAIL;
    	}
    
    	g_sTrfStatus = TRF79xxA_getTrfStatus();
    
    	if (g_sTrfStatus == RX_COMPLETE)		// If data has been received
    	{
    		if (g_pui8TrfBuffer[0] == 0x00)		// Confirm "no error" in response flags byte
    		{
    			// Response received
    			ui8Status = STATUS_SUCCESS;
    		}
    		else		// An error has been sent back in the response byte
    		{
    			ui8Status = STATUS_FAIL;
    		}
    	}
    	else
    	{
    		// No response
    		ui8Status = STATUS_FAIL;
    	}
    
    	return ui8Status;
    }

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

    Charles

    非常感谢。 对我来说很有用。

    Le