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 中似乎没有字节。

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1208620/cc1120-it-looks-like-there-is-no-byte-in-rxfifo

器件型号:CC1120

您好的体验。

我是一个 在如下图所示的环境中试用 CC1120的人。

CC1120模块充当 RX 并包含一个 MCU 和一个 CC1120芯片、该 CC1120芯片由 MCU 控制。

CC1120模块是制造的、不是商用产品。

BOOSTXL-CC1120-90用作 TX、是 TI 的商用产品。

BOOSTXL-CC1120-90具有 Smart RF 的互锁功能、并可通过 PC 中 SMART RF 的数据包 TX 以设置的载波频率发送数据包。

我以前曾提出过类似的问题(下面的链接)

链接: https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1206681/cc1120-i-have-a-problem-with-nothing-being-stored-in-the-rx-fifo/4555118#4555118

我知道在 CC1120模块上接收 TX 数据包需要执行以下步骤

1.复位 CC1120

2.写入配置寄存器

3.校准合成(如果未启用自动校准)

4、选通脉冲

5.等待接收包(接收包信号生效)

6.检查 FIFO 中是否有字节(如果进行了滤波,则接收到的数据包信号也将生效)。

7.读取  NUM_RXBYTES 寄存器指示的字节数。

基于这些内容、我编写了一个代码。

在主语句中运行的代码如下图所示。

主语句包含以下4个函数。

每个函数的内容如下所示。

1. Freq_Rx():用于设置 CC1120模块中 CC1120寄存器值的函数。 来测量眼图的张开度

2. ManualCalibration():校准合成函数。 通过重新填充到 cc112x_ease_link_rx.c 来生成

3. RX_Radio():RX FIFO,等等 此函数处理与 RX 相关的全部内容。 通过引用 cc112x_ease_link_rx.c 中的 runRx()函数生成

我认为 RX_Radio()函数有问题。

RX_Radio()函数如下所示。

首先、我打通了 SRX。

然后检查 RXFIFO 中是否有字节。 (如果0x06中的 IOCFG2寄存器值、我知道已在 RXFIFO 中勾选了 bye)

Af61该寄存器读取 NUM_RXBYTES 寄存器,如果该值不是0,则检查 RXFIFO 错误。(检查 marcstate 寄存器的值,0x1F = 0x11)

如果没有错误、则 RXFIFO 值存储在 rxbuffer 变量中、并对该值进行检查。

但是、当读取当前 NUM_RXBYTES 寄存器时、即使 BOOSTXL-CC1120-90正在发送数据包、也会继续重复、并且该值被确认为0。

我担心当 RXFIFO 中没有字节时我是执行代码的。

如果您能告诉我在我的过程中出了什么问题、我将不胜感激。

感谢您阅读这篇长帖子、任何建议都将对我大有帮助。

                                                                -由 Kim 提供-

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

    我想您误解了规范。

    您不应读回寄存器 IOCFG2

    如果已将寄存器 IOCFG2编程为0x06、它将始终为0x06。

    将寄存器编程为该值意味着 GPIO2信号(在引脚上输出)将是接收到数据包的信号。 这是您需要检查的信号(您需要查找此引脚上的下降沿中断(必须连接到 MCU 上的输入)

    我已简化了我之前链接到的代码:

    // Initialize MCU and peripherals
    initMCU();
    
    // Write radio registers
    registerConfig();
    
    uint8 rxBuffer[128] = {0};
    uint8 rxBytes;
    uint8 marcState;
    
    // Connect ISR function to GPIO2
    ioPinIntRegister(IO_PIN_PORT_1, GPIO2, &radioRxISR);
    
    // Interrupt on falling edge
    ioPinIntTypeSet(IO_PIN_PORT_1, GPIO2, IO_PIN_FALLING_EDGE);
    
    // Clear ISR flag
    ioPinIntClear(IO_PIN_PORT_1, GPIO2);
    
    // Enable interrupt
    ioPinIntEnable(IO_PIN_PORT_1, GPIO2);
    
    // Calibrate radio according to errata
    manualCalibration();
    
    // Set radio in RX
    trxSpiCmdStrobe(CC112X_SRX);
        
    while(1)
    {
        // Wait for falling edge interrupt on GPIO2 (IOCFG2 = 0x06)
        while(packetSemaphore != ISR_ACTION_REQUIRED);
    
        // Read number of bytes in RX FIFO
        cc112xSpiReadReg(CC112X_NUM_RXBYTES, &rxBytes, 1);
    
        // Check that we have bytes in FIFO
        if(rxBytes != 0)
        {
            // Read MARCSTATE to check for RX FIFO error
            cc112xSpiReadReg(CC112X_MARCSTATE, &marcState, 1);
    
            // Mask out MARCSTATE bits and check if we have a RX FIFO error
            if((marcState & 0x1F) == RX_FIFO_ERROR)
            {
                // Flush RX FIFO
                trxSpiCmdStrobe(CC112X_SFRX);
            }
            else
            {
                // Read n bytes from RX FIFO
                cc112xSpiReadRxFifo(rxBuffer, rxBytes);
    
                // Check CRC
                if(rxBuffer[rxBytes - 1] & 0x80)
                {
                    // Update packet counter
                    packetCounter++;
                }
            }
        }
    
        // Reset packet semaphore
        packetSemaphore = ISR_IDLE;
    
        // Set radio back in RX
        trxSpiCmdStrobe(CC112X_SRX);
    }
    
    

    当 GPIO2上有下降沿中断时、表示已接收到数据包、可以读取 NUM_RXBYTES、MARCSTATE、然后读取 FIFO。

    在 SPI 上、当我发送0x05、0x01、0x02、0x03、0x04时看起来就像这样、 来自 SmartRF Studio 的 X05

    NUM_RXBYTES 为8、表示 FIFO 中有8个字节(长度字节、5个有效载荷字节、2个状态字节)

    MARCSTATES 表示无线电处于空闲状态(0x41)

    FIFO 中的8个字节是  

    长度:0x05

    有效载荷:0x010x020x03、0x04、0x05

    状态:0x27、0x82

    Siri.

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

    很抱歉这么晚才回复。

    我想您给出了最佳答案并让我理解。

    根据您的回答构建代码需要我花了一段时间。

    下面是我创建的代码。

    
    

    由于执行代码、人们认识到 GPIO2变为低电平。

    但是、即使 BOOSTXL-CC1120-90正在发送数据包、NUM_RXBYTES 的值从0不会变化、只有 SRX 继续选通。

    我试图根据你告诉我的情况自行解决它,但我不能确定问题是什么。

    非常感谢您的帮助。

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

    我不知道它是否会有帮助,但我根据下面的图片结构编码它。

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

    我仍不确定您的代码是否正确。

    每次 GPIO 引脚为低电平时、都会在代码中读取 NUM_RXBYTES。

    该引脚在大多数时间都处于低电平(除非您当前正在接收数据包)。

    您应该做的是将该引脚连接到下降沿中断、当该中断发生时、您应该继续执行代码读取 NUM_RXBYTES。

    如果您只是检查 GPIO 是否为0、则在选通 RX 和实际接收数据之间始终是此值、因此您将多次读取 NUM_RXBYTES = 0。

    您首先应该检查(使用逻辑分析仪或示波器) GPIO 引脚是否在发送数据包时变为高电平、然后变为低电平。 如果未接收、则表示对讲机无法接收任何数据。

    与您的发送器相比、这可能与硬件相关、或设置错误。

    如果您可以看到 GPIO 引脚变为高电平、然后再次变为低电平、但 RX FIFO 中仍然没有数据、则表示数据包已被丢弃。

    这可能是由地址过滤、数据包长度过滤或 CRC 过滤造成的。

    请在开始时监控 GPIOx 线路(IOCFGx =0x06)(当对讲机处于 RX 状态且正在传输时)、并确认该信号在您传输时是否变为高电平和低电平。

    Siri.

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

    谢谢,现在我可以看到我的代码中有什么问题.

    我想您已经告诉了我足够多的方法来实现它、因此我还没有实施 Rx、但我会继续尝试。 真的非常感谢。

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

    然后、我将关闭该主题、如果您有更多问题、可以再次打开该主题。

    Siri.

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

    非常感谢。 我会在得到结果时通知您