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.

[参考译文] CC1310:读取状态寄存器

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1069578/cc1310-read-status-register

部件号:CC1310
“线程”中讨论的其它部件:WMBUSCC1312R,TEST

您好,

我想读一个状态寄存器来获取有关接收到的 RF 数据包的一些信息。

我使用 CC1310 Launchpad 作为 WMBus 接收器,我有不同的 WMBus 发送器。 其中一些以 T 模式发送,另一些以 C 模式发送。 (我用其他软件和硬件验证了它。)

由于 https://www.ti.com/lit/an/swra522e/swra522e.pdf?ts=1638195288205&ref_url=https%253A%252F%252Fwww.google.com%252F 的第2.4点,应该可以 读取 VIA RF 接收 wMBus 数据包的格式。 我使用 TMR 来了解如何执行此操作并实施如下代码:

/* Check which mode packet had */
uint8_t wMBusMode = 0;
rfc_CMD_READ_RFREG_t readRegCmd =
    {
     .commandNo = CMD_READ_RFREG,
     .address = 0x5178,
     .value = 0
    };

RF_Stat status = RF_runImmediateCmd(rfHandle, (uint32_t*)&readRegCmd );

if (status == RF_StatCmdDoneSuccess ){
    wMBusMode = readRegCmd.value & 0x01;
    //wMBusMode = 0 means T-mode Packet, wMBusMode = 1 means C-Mode Packet
    }

但结果不正确。 因此,我大部分都得到1,我的发件人是以 T 模式还是 C 模式发送,这一点无关紧要。

该准则有什么问题吗? 我是否必须在查看下一个带有“RFQueue_nextEnde()”的条目之前或之后执行此操作?

此致

SB

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

    您何时阅读此注册表?

    通常,您会在数据包的开头读取此寄存器(当您收到足够的字节来查找长度信息时,无论您接收到哪种模式

    在您的代码中,您应该这样做:

    void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
        if (e & RF_EventNDataWritten)
        {
            
            if (!lengthWritten)
            {
                // Do only first time you get the interrupt
                lengthWritten = true;
    
                RF_runImmediateCmd(rfHandle, (uint32_t*)&RF_cmdReadRfReg);
    
                if (RF_cmdReadRfReg.value == 1)
                {
                    // C-mode
                    // Read the length from the position where the length field for C mode packets are found
                    payloadLength = .....
                    
                    // Set the proper length
                    RF_cmdPropSetLen.rxLen = .....
                    RF_runImmediateCmd(rfHandle, (uint32_t*)&RF_cmdPropSetLen);
                }
                else
                {
                    // T-mode
                    // Read the length from the position where the length field for T mode packets are found
                    payloadLength = .....
                    
                    // Set the proper length
                    RF_cmdPropSetLen.rxLen = .....
                    RF_runImmediateCmd(rfHandle, (uint32_t*)&RF_cmdPropSetLen);
                }
            }
        }
    
        if (e & RF_EventLastCmdDone)
        {
            .
            .
            .
            .
    
            currentReadEntry->status = DATA_ENTRY_PENDING;
            currentReadEntry = (rfc_dataEntryPartial_t*)currentReadEntry->pNextEntry;
            dataQueue.pCurrEntry = (uint8_t*)currentReadEntry;
            Semaphore_post(rxSemaphoreHandle);
        }
    }
    

    其中

    // CMD_PROP_SET_LEN
    rfc_CMD_PROP_SET_LEN_t RF_cmdPropSetLen =
    {
       .commandNo = 0x3401,
       .rxLen = 0x0000,
    };
    
    rfc_CMD_READ_RFREG_t RF_cmdReadRfReg =
    {
         .commandNo  = 0x0601,
         .address = 0x51E4,
         .value = 0,
    };

    如果您在数据包的开头不知道数据包是 C 模式还是 T 模式,则您将无法正确设置长度,并且无法正确接收数据包。 很可能您随后会遇到错误情况,缓冲区溢出等

    如果 RX 因错误而终止,不确定您是否会从此寄存器接收正确的信息。

    西里

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

    你好,Siri,

    感谢您的快速反应。

    您可以在此处将0x51E4用作 RF_cmdReadRfReg 中的地址。 CC1310的正确地址是什么? 因为在 swra522e 中,我看到地址是0x5178。

    此致

    SB

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

    很抱歉。 我的代码片段用于 CC1312R。 对于 CC1310,应使用0x5178。

    下表显示了 CT 模式补丁从 CC1310到 CC1312的状态和配置寄存器映射:

    西里

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

    在我的软件中,我不使用部分读取,我使用 RF_EventRxEntryDone 执行 Rx 命令和回调。 它可以工作,我收到 wMBus 数据包,可以进一步解释数据。

    我只想检查数据包的模式,以获取有关发件人的更多信息。 当已到达 RF_EventRxEntryOne 事件时,是否仍可以读取寄存器?

    巴西

    SB

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

    是的,可以。 我使用 SmartRF Studio 将 CC1312R 用作发射器,并使用 CC1310作为接收器的修改后的 rfPacketRX 示例测试了这一点。 SmartRF Studio 传输 C 和 T 模式数据包(不是 wmbus 数据包格式,而是 wmbus PHY (同步字,编码等))

    接收器使用固定的数据包长度,没有使用任何 CRC 检查,但在每个接收到的数据包后,接收器正确报告了 C 或 T 模式:

    西里

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

    你好,Siri,

    非常感谢你的帮助。 我像你们一样树立了一个榜样,效果很好。

    但在我的情况下,我使用 RFC_CMD_PROP_RX_ADV_t,因为我需要接收超过255字节的数据包。

    它是否还可以与 advanced_RX 命令配合使用? 因为当我在您的示例中只将 RX 更改为 ADVANCED _RX 和 MAX_LENGTH 时,此模式检测不再正常工作。 当您使用高级 RX 命令测试时,它是否起作用?

    如果是,您可以与我共享高级 RX 命令的 SmartRF_settings 吗?

    此致

    SB

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

    虽然 CMD_PROP_RX 可以执行固定或可变数据包长度模式,并且限制1字节长度字段,但高级命令 最多支持2字节长度。 但是,它不支持固定数据包长度模式,因此您不能对对讲机进行编程,以每次接收500字节等数据。

    如果要使用此模式,需要将 maxPktLen 设置为无限或未知长度,然后在应用程序确定收到完整数据包后,需要手动取消正在进行的 RX 操作。

    可能是将其设置为无限制,会迫使您实际使用部分读取条目。 我从未尝试过这种方法。

    我建议您使用应用说明中描述的方法,使用部分读取条目。

    西里

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

    你好,Siri,谢谢你的回答。 也许我对我的上一篇文章不清楚。

    我有一个正在运行的示例,它通过 CMD_PROP_RX_ADV 接收 wMBus 数据包,并且工作正常。 我使用固定的 maxPktLen,但我不手动取消 RX 操作。 我有不同的 wMBus 发件人,他们发送的数据包长度不同,但这些数据包永远不会超过(255+CRC)字节。

    我只是想添加此模式检测以获取有关数据包模式的信息,将其另存为该电报的信息。 从 CMD_PROP_RX 切换到 CMD_PROP_RX_ADV 后,wMBus 模式标识的射频寄存器读数不再正常工作。 但我唯一改变的是 RX 命令(和 maxPktLength 为大于255的固定值,但这不是这里的原因)。

    可能我错过了代码或 CMD_PROP_RX_ADV 配置的更改,以启用 WMBus 模式标识的射频寄存器的读取,或者我错过了只有 CMD_PROP_RX 才能进行此模式检测的信息。

    您是否知道为什么 CMD_PROP_RX_ADV 不能使用读取射频寄存器进行模式检测的任何原因,或者是否需要对此进行进一步更改?

    此致

    SB

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

    你(们)好

    我没有考虑将报头设置为0以获得固定数据包长度。 很抱歉。

    我可以看到与您相同的东西,但我也可以通过普通 RX 命令看到这一点。

    如果我传输 C 模式数据包,对讲机将始终将其检测为 C 模式,而不管使用哪个命令。

    对于 T 模式数据包,对讲机似乎只是报告它,因为 T 模式是您实际接收6个中的3个编码数据。

    我测试了以下内容:

    CMD_PROP_RX 和固定数据包长度为50

    如果我发送的字节超过50字节且编码正确,则所有数据包都将报告为 T 模式数据包

    如果我只发送30字节的数据包,那么如果报告数据包为 C 或 T 模式,则看起来是随机的。

    使用高级命令时,我也会看到这种情况。 我测试了数据包长度设置为150的数据包,因为我无法使用 SmartRF Studio 发送超过255字节的长数据包。 超过100字节的数据包(所有接收到的数据都正确编码)被报告为 T 模式,较短的数据包似乎是随机的。

    我想,如果您实际实施了正确的 wmbus 数据包接收,这是可以的。 然后,您可以在同步后立即确定它是 C 模式还是 T 模式,以便能够正确配置 Set_LEN 命令。

    巴西

    Siiri