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.

[参考译文] CC1120:指示达到了 RxFIFO 阈值的 GPIO 输出、但显示下降沿偶尔出现毛刺脉冲。

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1413552/cc1120-gpio-output-indicating-rxfifo-threshold-met-but-shows-an-occasional-glitch-on-falling-edge

器件型号:CC1120

工具与软件:

您好!
我需要使用 CC1120在可变数据包长度模式下发送大于128字节的数据包。

我已按如下方式设置 GPIO:

  • GPIO0配置为 GPIO0_CFG = 0x00。 上升沿中断设置标志"RxFifoThresholdExced"
  • GPIO2设置为 GPIO2_CFG = 0x06。 下降沿中断设置标志"RxTxEndOfPacket"

下面的代码适用于低于#define RX_FIFO_THRESHOLD_SIZE (设置为120)的数据包长度

我无法解决的问题是 CC1120 GPIO0线路上偶尔会出现毛刺脉冲。

下图显示了这些问题。  毛刺脉冲信号直接在 GPIO0输出上获取。

CC1120上的不同 GPIO 输出是否存在任何限制?
我已经在这上面呆了几天,我是不知道的想法。

下面:红色低电平表示远程 Tx 正在发送

这是 GPIO0低脉冲的特写

代码:

/**********************************************************************************************
 * Function: CC1120_ReceiveData
 * Purpose:  Receive a packet of FSK data. Manage FIFO to ensure no overflow occurs.
 * 			 Max Packet size is 255 bytes (less 2 if PKT_CFG1.APPEND_STATUS enabled)
 * Return:	 0 for timeout or no invalid CRC etc.
 * 			 1..255 indicating packet size
	//Setup GPIOx for rising edge interrupt on RXFIFO_THR.
 **********************************************************************************************/
u8 CC1120_ReceiveData(u8 *pData)
{

	u8 * pBuffer = pData;
	u8 length = 0;
	u8 BytesRemaining =0;
   u32 startTime = HAL_GetTick();  // Get the current system tick

	RxRssi = 0;
	RxLqi =0;
	RxCrcOK = 0;

   CC1120_Strobe(CC1120_SIDLE);
	
	// Reset RxFIFO IFF overflow, underflow
	if (CC1120_ReadRegister(MODEM_STATUS1) & (MOD_S1_RXFIFO_OVERFLOW | MOD_S1_RXFIFO_UNDERFLOW ))
	{
		CC1120_Strobe(CC1120_SIDLE);     // Must be in idle state
		CC1120_Strobe(CC1120_CMD_SFRX); 	// Flush RX FIFO. Places CC1120 into IDLE mode
		CC1120_Initialise();					// Reinit device
		Println("RxFIFO flushed", RED);
		RxFifoThresholdExceeded = FALSE;
		RxTxEndOfPacket = FALSE;
	}

	CC1120_ReadRegister(NUM_RXBYTES);	// ****** "NUM_RXBYTES or RX_LAST should be read before strobing SRX" *******
	CC1120_Strobe(CC1120_CMD_SRX);   	// Put into RX mode

	while(1)		// Now receive the data
	{
		 // Case 1: FIFO threshold is exceeded (set by rising edge on GPIO0. GPIO0_CFG = 0)
		if (RxFifoThresholdExceeded )		// Flag set by RISING edge from CC1120 GPIO1 - Set as GPIO0_CFG = 0
		{
			RxFifoThresholdExceeded = FALSE;
			
			// If the length byte hasn't been received yet, read the packet length
         if (!length)										
			{
				length = CC1120_ReadRegister(CC1120_FIFO);  // Read packet length (Fist byte in packet)
				BytesRemaining = length;	// length byte doesn't include the first byte in VPM
			}

			CC1120_ReadBurst(CC1120_FIFO, pData, RX_FIFO_THRESHOLD_SIZE);  // Read the RxFIFO contents
			BytesRemaining -= RX_FIFO_THRESHOLD_SIZE;
			pData += RX_FIFO_THRESHOLD_SIZE;

		}

		// Case 2: End of packet detected (set by falling edge on GPIO2 - Set as GPIO2_CFG = 6)
		else if (RxTxEndOfPacket)	
		{
			RxTxEndOfPacket = FALSE;
			if (!length)	// Extract length.. DON'T include with data
			{
				length = CC1120_ReadRegister(CC1120_FIFO);  // Read packet length from FIFO
				BytesRemaining = length;	// length byte doesn't include the first byte in VPM
			}

			// Process data from the two status bytes appended to the data
			RxRssi =CC1120_ReadRegister(CC1120_FIFO);  // Read remaining contents
			RxLqi  =CC1120_ReadRegister(CC1120_FIFO);  // Read remaining contents
			RxCrcOK = RxLqi & 0x80;
			RxLqi  &= 0x7F;		// Keep 7 LSbits

			if (!RxCrcOK)		// MSBit is CRC
				length =0;		// Indicates a bad CRC == packet no good
			break;	// We're done!
		}

		if ((HAL_GetTick() - startTime) >= CC1120_RX_TIMEOUT_1S)
		{
			length = 0;	// Timeout
			break;
		}
	}
	while(1);

   return length;
}

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

    如果您接收到一个数据包、例如125字节长、FIFO 阈值为120、当 RX FIFO 中有120字节时、GPIO0将有效。

    这将使代码开始读取 RXFIFO、因为 RxFifoThresholdExceeded (但由于您在 while 循环中进行读取、因此时序将随数据包而变化)

    一旦您从 FIFO 读取了第一个字节、该信号就会被取消置位、但如果 通过无线方式接收到下一个字节、在开始读取 FIFO 的其余部分之前、该信号将再次置位、这样当您继续读取时、该信号就会取消置位。

    我想、有时您只会在超过阈值的数据包中看到这种情况、而并非总是如此、因为您在 while 循环中执行所有操作、与您在 GPIO0的上升沿中断中执行 FIFO 读取相比、FIFO 读取将在不同的时间发生。

    Siri

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

    感谢您的快速响应。 这正是问题所在。 我在逻辑分析仪上看到 SPI 上的信号读数后、一切都变得非常清晰。:-)

    干杯!