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.

[参考译文] TRF7962A:TRF7960A 的示例代码

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1116665/trf7962a-example-code-of-trf7960a

器件型号:TRF7962A
主题中讨论的其他器件: TRF7964ATRF7970A

您好!

我正在研究一个项目、以实现基于 trf7962A 芯片的 ISO15693标签读取和写入数据。 我的硬件板与 TRF7960EVM (sloc251)的示例代码相匹配。 我已将示例代码下载到电路板中。 当我使用 从 TI 网站下载的 TRF7960EVMGUI 测试15693的库存读写时、此功能运行良好。 那么、现在我要学习该示例代码。

我在学习时发现了一些奇怪的问题。 我在 第11行添加了一行代码"iso_control[0]= iso_control;"、因为我认为如果没有设置任何值、缓冲区"iso_control[4]将是随机的。 不可理解  的是、当我添加这行代码时、读写操作停止工作。 删除它、它再次运行良好。  我仔细检查 后发现没有错误。  

为什么添加此代码后它不起作用?  需要帮助。

以下是代码的一部分:

u08_t
HostRequestCommand(u08_t *pbuf, u08_t length, u08_t broken_bits, u08_t no_crc)
{
	u08_t	index = 0, j = 0;

	u08_t	iso_control[4];
	u16_t	tx_timeout = 1, rx_timeout = 1;
	
	tx_timeout = length / 10 + 3;
	iso_control[0] = ISO_CONTROL;      // i add this
	Trf796xReadSingle(iso_control, 1);
	iso_control[0] &= 0x1F;
	if(iso_control[0] < 8)															// ISO15693
	{
		tx_timeout = tx_timeout * 1;												//ORIGINAL VALUE = 4
		rx_timeout = rx_timeout * 1;
		
		if((iso_control[0] < 2) || (iso_control[0] == 3) || (iso_control[0] == 4)) // low bit rate
        {
			tx_timeout = tx_timeout * 4;										//ORIGINAL VALUE = 4
			rx_timeout = rx_timeout * 4;
		}
		
		if(iso_control[0] % 2 == 1)													// 1 out of 256
		{
			tx_timeout = tx_timeout * 8;											//ORIGINAL VALUE = 8
			rx_timeout = rx_timeout * 1;											//ORIGINALLY NOT PRESENT
		}
	}

	rxtx_state = length; 					// rxtx_state extern variable is the main transmit counter

	*pbuf = 0x8f;
	if(no_crc == 1)
	{	
		*(pbuf + 1) = 0x90;					// buffer setup for FIFO writing WITHOUT CRC
	}
	else
	{	
		*(pbuf + 1) = 0x91;					// buffer setup for FIFO writing WITH CRC
	}
	*(pbuf + 2) = 0x3d;
	*(pbuf + 3) = rxtx_state >> 4;
	*(pbuf + 4) = (rxtx_state << 4) | broken_bits;

	if(length > 12)
	{	
		length = 12;
	}

	if(length == 0x00 && broken_bits != 0x00)
	{	
		length = 1;
		rxtx_state = 1;
	}

	Trf796xRawWrite(pbuf, length + 5);		// send the request using RAW writing

	// Write 12 bytes the first time you write to FIFO
	IRQ_CLR;								// PORT2 interrupt flag clear
	IRQ_ON;

	rxtx_state = rxtx_state - 12;
	index = 17;

	i_reg = 0x01;

	while(rxtx_state > 0)
	{	
		irq_flag = 0x00;
		while(irq_flag == 0x00)				// wait for interrupt
		{
		}
		if(rxtx_state > 9)					// the number of unsent bytes is in the rxtx_state extern
		{	
			length = 10;					// count variable has to be 10 : 9 bytes for FIFO and 1 address
		}
		else if(rxtx_state < 1)
		{	
			break;							// return from interrupt if all bytes have been sent to FIFO
		}
		else
		{	
			length = rxtx_state + 1; 		// all data has been sent out
		}									// if

		buf[index - 1] = FIFO;				// writes 9 or less bytes to FIFO for transmitting
		Trf796xWriteCont(&buf[index - 1], length);
		rxtx_state = rxtx_state - 9;		// write 9 bytes to FIFO
		index = index + 9;
	}

	rxtx_state = 1;							// the response will be stored in buf[1] upwards
	
	j = 0;
	while((i_reg == 0x01) && (j <= tx_timeout))
	{
		COUNT_VALUE = COUNT_1ms * 2;		// for TIMEOUT
		START_COUNTER;						// start timer up mode
		irq_flag = 0x00;
		while(irq_flag == 0x00)
		{
		}
		j++;
	}
	
	i_reg = 1;

	if( (((buf[5] & BIT6) == BIT6) && ((buf[6] == 0x21) || (buf[6] == 0x22)|| (buf[6] == 0x23)|| (buf[6] == 0x24) ||
		(buf[6] == 0x27)|| (buf[6] == 0x28) || (buf[6] == 0x29)|| (buf[6] == 0x2A)))
		|| (buf[5] == 0x00 && ((buf[6] & 0xF0) == 0x20 || (buf[6] & 0xF0) == 0x30 || (buf[6] & 0xF0) == 0x40))
	  )
	{	
		McuDelayMillisecond(30);					 //originally 20mSec, 100mSec seems to much
		Trf796xReset();                            //took out to see if low data rate RMB could improve
		McuDelayMillisecond(30);	
		Trf796xTransmitNextSlot();
	}  
	
	j = 0;
	while((i_reg == 0x01) && (j <= rx_timeout))
	{
		COUNT_VALUE = COUNT_1ms * 14;		// for TIMEOUT original value 14
		START_COUNTER;						// start timer up mode
		irq_flag = 0x00;
		while(irq_flag == 0x00)
        {
        }
		j++;
	}

	...
	
	}

此致

Xubo

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

    我添加的代码位于第10行。

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

    您好 Xubo、

    我想我们都假设这个代码的目的是读取地址0x01处的 ISO 控制寄存器、这适合位掩码。 我同意、不对其进行初始化是没有意义的、这将导致地址0x00。 我不知道它为什么这么做。

    所有 TRF79xxEVM 相关固件都是已知的错误、因此官方不再支持。 请随时继续使用旧代码、但 TI 无法支持调试这种过时的固件。

    此外、TI 还建议  在新设计中采用 TRF7964A 或 TRF7970A。

    此致、

    Andreas。

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

     您好、Andreas、

    感谢您的回复。  

       考虑您的响应后、我们决定尝试使用 TI 推荐的 TRF7964A 或 TRF7970A。

    您能给我发送一些 TRF7964A 或 TRF7970A 的示例代码和相应的硬件设计吗? 因此 ,作为参考,我们可以测试有关 ISO15693的功能并设计我们的产品 。

    此致、

    徐宝。

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

    您好 Xubo、

    我很高兴看到您对 TRF7964A 和 TRF7970A 器件感兴趣。 如果您打算仅设计 ISO15693阅读器/编写器、那么 TRF7964A 就足够了。 这两个 IC 彼此完全兼容、TRF7964A 只是具有一个精简的功能集。 这两个 IC 之间的差异在《TRF7970A 和 TRF7964A 器件的常见问题解答》(修订版 B)"文档。 第1.3章列出了可用的示例代码和评估硬件。

    TRF7964A 产品页面的技术文档部分提供了更多技术文章和应用手册

    如果您有其他问题、请告诉我。

    此致、

    Andreas。

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

     您好、Andreas、

    非常感谢你的帮助。

    根据  具体情况、我将在 TRF7964A 或 TRF7970A 上尝试。

    此致、

    徐宝。

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

    徐宝

    我现在要关闭这个线程。 如果在器件评估过程中出现任何问题、您可以打开新主题。

    谢谢、此致、

    Andreas。