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.

[参考译文] CC1352P7:仅 Rx 标头、无有效载荷且具有高级专有射频命令

Guru**** 2392095 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1527308/cc1352p7-rx-only-header-and-no-payload-w-advanced-proprietary-rf-commands

器件型号:CC1352P7
主题:SysConfig 中讨论的其他器件

工具/软件:

设计目标:

我尝试创建一个基于 915MHz 的 PHY 和 LL、它使用 16 位地址过滤和 CRC 校验、可能支持大有效载荷。

设置:

频率:915MHz
符号速率:100kbps
偏差:50kHz
RX 滤波器 BW:195.9kHz
白化:动态 IEEE 801.44g 兼容白化剂和 16/32 位 CRC
SYNC 字:16 位:0x55AC
前导码:1 字节、 在前导码和同步字中发送不同的第一个前导码位

请参阅以下代码。

问题:

1、当用 RF_cmdPropTxAdv 传输我的数据包并聆听 RF_cmdPropRxAdv 时 、我只接收另一侧的标头信息:`0F D6 为`Ω、之后没有任何内容。
我期望在 RFQueue 中看到的是`0F D6 BE AB CD EF 01 23 45 AA BB CC DD EE FF`

当我使用标头配置设置(如更改长度和地址定位)时、数据包会被过滤掉、因为它与地址不匹配。

我可以确定 TX 器件根据我的能量跟踪曲线仅传输 3 个字节以上的数据。

2. 在给定配置的情况下、我期望我的 RF_cmdPropRxAdv 在接收到第一个数据包后继续接收数据包、但它只接收一个数据包并停止给出回调。

e2e.ti.com/.../proj_5F00_main.ce2e.ti.com/.../chained_2D00_rf_2D00_cmd.syscfg.txt

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

    尊敬的 Marciano:

    在代码实现之前、您是否在 SmartRF Studio 7 中测试了 CMD_PROP_RX_ADV/CMD_PROP_TX_ADV 配置? 您在那里观察到了什么?

    TX 端似乎是正确的,如屏幕截图所示,但它会很有趣,看看你收到了什么..

    此致、

    Arthur

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

    尊敬的 Arthur:

    我尝试按照您的建议、在 SmartRF Studio 7 版本 2.32.0 中测试 CMD_PROP_RX_ADV/CMD_PROP_TX_ADV 配置。

    但是、我遇到了一个持续存在的问题、即 SmartRF Studio 7 即使在成功安装和系统重新启动后、也会反复提示安装 SimpleLink 无线 MCU 的“无线电测试库“。 SmartRF 测试环境无法在 Windows 10 PC 上正确启动。 附加屏幕截图以供参考。 问题可能是什么?请注意、我还包括了系统环境的对讲机测试库文件夹路径以防万一。  


    请您就我一直观察到的特定事件模式提供指导:

    第一次回叫: RF_EventRxOk | RF_EventCmdDone (0x810000)

    第二回调: RF_EventLastCmdDone | RF_EventCmdError (0x400002)

    接收并正确解析第一个数据包标头 (length=12、地址=0xBED6)、但 CMD_PROP_RX_ADV 在单个数据包后终止 brepeatOk=1 和 brepeatNok=1  配置。

    这是高级 RX 命令的预期行为、还是表示存在配置问题?

    此致、
    Sharan

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

    您好 Sharan、

    这很奇怪、因为屏幕截图似乎表明可以按预期检测到器件。 如果您以管理员身份启动它、也会发生这种情况吗?

    在事件模式中、有必要了解  RF_EventCmdError 时 CMD_PROP_RX_ADV 的状态是什么:


     专有无线电操作状态代码

    此致、

    Arthur

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

    首先、无法使用 SmartRF Studio 对此进行测试(从默认值更改完整的数据包格式也需要更改固件本身)

    下面是一些用于传输您给出的数据包的测试代码、还有一些 用于说明如何正确接收此数据包的代码。

    我已将数据包中的第一个字节从 0x0F 更改为 0x0E、因为长度字节应规定长度之后有多少个字节(不应包含自身)

    我使用 rfPacketRX 和 rfPacketTX 示例作为起点、更改了必要的参数(SysConfig 中的数据速率,偏差,同步字,前导码和白)、其余参数在代码中进行了修改:

    TX:

    #define SIZE_OF_LENGHT_FIELD    1
    #define PAYLOAD_LENGTH          14
    
    #define PACKET_INTERVAL         500000  // Set packet interval to 500000 us or 500 ms
    
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    
    static uint8_t packet[SIZE_OF_LENGHT_FIELD + PAYLOAD_LENGTH] = {0x0E, 0xD6, 0xBE, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        RF_cmdPropTxAdv.pktLen = PAYLOAD_LENGTH + 1; // For the advanced TX command, pktLen must cover length + payload
        RF_cmdPropTxAdv.pPkt = packet;
        RF_cmdPropTxAdv.startTrigger.triggerType = TRIG_NOW;
        RF_cmdPropTxAdv.condition.rule = 1;
        RF_cmdPropTxAdv.pktConf.bUseCrc = 1;
        RF_cmdPropTxAdv.numHdrBits = 24;
        RF_cmdPropTxAdv.pktConf.bCrcIncHdr = 0x1;
    
        // Request access to the radio
        rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    
        // Set the frequency
        RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    
        while(1)
        {
            // Send packet
            RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, NULL, 0);
    
            // Power down the radio
            RF_yield(rfHandle);
    
            // Sleep for PACKET_INTERVAL us
            usleep(PACKET_INTERVAL);
        }
    }

    接收:

    #define DATA_ENTRY_HEADER_SIZE 8    // Constant header size of a Generic Data Entry
    #define NUM_DATA_ENTRIES       2    // NOTE: Only two data entries supported at the moment
    
    #define CRC                     0   // 2 if .rxConf.bIncludeCrc = 0x1, 0 otherwise
    #define RSSI                    0   // 1 if .rxConf.bAppendRssi = 0x1, 0 otherwise
    #define TIMESTAMP               0   // 4 if .rxConf.bAppendTimestamp = 0x1, 0 otherwise
    #define STATUS                  0   // 1 if .rxConf.bAppendStatus = 0x1, 0 otherwise
    
    #define NUM_APPENDED_BYTES      1 + CRC + RSSI + TIMESTAMP + STATUS // The length is 1 byte
    
    #define MAX_LENGTH              0x0E // Max length byte the radio will accept
                                         // Must be less than 256 if SIZE_OF_LENGHT_FIELD = 1
    
    static void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e);
    
    static RF_Object rfObject;
    static RF_Handle rfHandle;
    
    /* Buffer which contains all Data Entries for receiving data.
     * Pragmas are needed to make sure this buffer is 4 byte aligned (requirement from the RF Core) */
    #if defined(__TI_COMPILER_VERSION__)
    #pragma DATA_ALIGN (rxDataEntryBuffer, 4);
    static uint8_t
    rxDataEntryBuffer[RF_QUEUE_DATA_ENTRY_BUFFER_SIZE(NUM_DATA_ENTRIES,
                                                      MAX_LENGTH,
                                                      NUM_APPENDED_BYTES)];
    #elif defined(__IAR_SYSTEMS_ICC__)
    #pragma data_alignment = 4
    static uint8_t
    rxDataEntryBuffer[RF_QUEUE_DATA_ENTRY_BUFFER_SIZE(NUM_DATA_ENTRIES,
                                                      MAX_LENGTH,
                                                      NUM_APPENDED_BYTES)];
    #elif defined(__GNUC__)
    static uint8_t
    rxDataEntryBuffer[RF_QUEUE_DATA_ENTRY_BUFFER_SIZE(NUM_DATA_ENTRIES,
                                                      MAX_LENGTH,
                                                      NUM_APPENDED_BYTES)]
                                                      __attribute__((aligned(4)));
    #else
    #error This compiler is not supported.
    #endif
    
    // Receive dataQueue for RF Core to fill in data
    dataQueue_t dataQueue;
    rfc_dataEntryGeneral_t* currentDataEntry;
    uint16_t packetLength;
    uint8_t* packetDataPointer;
    rfc_propRxOutput_t rxStatistics;
    
    uint8_t packet[MAX_LENGTH + NUM_APPENDED_BYTES - 1]; // Length is stored separately
    
    uint16_t AddressList[] = {0xBED6, 0xAAAA, 0xBBBB, 0xAABB, 0xBBAA};
    
    void *mainThread(void *arg0)
    {
        RF_Params rfParams;
        RF_Params_init(&rfParams);
    
        GPIO_setConfig(CONFIG_GPIO_RLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_write(CONFIG_GPIO_RLED, CONFIG_GPIO_LED_OFF);
    
        if( RFQueue_defineQueue(&dataQueue,
                                rxDataEntryBuffer,
                                sizeof(rxDataEntryBuffer),
                                NUM_DATA_ENTRIES,
                                MAX_LENGTH + NUM_APPENDED_BYTES))
        {
            // Failed to allocate space for all data entries
            while(1);
        }
    
        // Modify CMD_PROP_RX command for application needs
        // Set the Data Entity queue for received data
        RF_cmdPropRxAdv.pQueue = &dataQueue;
        // Discard ignored packets from Rx queue
        RF_cmdPropRxAdv.rxConf.bAutoFlushIgnored = 1;
        // Discard packets with CRC error from Rx queue
        RF_cmdPropRxAdv.rxConf.bAutoFlushCrcErr = 1;
        // Implement packet length filtering to avoid PROP_ERROR_RXBUF
        RF_cmdPropRxAdv.maxPktLen = MAX_LENGTH;
        RF_cmdPropRxAdv.pktConf.bRepeatOk = 1;
        RF_cmdPropRxAdv.pktConf.bRepeatNok = 1;
        RF_cmdPropRxAdv.pOutput = (uint8_t*)&rxStatistics;
    
        RF_cmdPropRxAdv.condition.rule = 1;
        RF_cmdPropRxAdv.pktConf.bUseCrc = 0x1;
        RF_cmdPropRxAdv.rxConf.bIncludeHdr = 0x1;
        RF_cmdPropRxAdv.endTrigger.triggerType = 0x1;
    
        RF_cmdPropRxAdv.pktConf.bCrcIncHdr = 0x1;
    
        RF_cmdPropRxAdv.hdrConf.numHdrBits = 24;
        RF_cmdPropRxAdv.hdrConf.numLenBits = 8;
        RF_cmdPropRxAdv.hdrConf.lenPos = 0;
        RF_cmdPropRxAdv.lenOffset = -2;
    
        RF_cmdPropRxAdv.rxConf.bIncludeCrc = 0x0;
        RF_cmdPropRxAdv.rxConf.bAppendRssi = 0x0;
        RF_cmdPropRxAdv.rxConf.bAppendTimestamp = 0x0;
        RF_cmdPropRxAdv.rxConf.bAppendStatus = 0x0;
    
        RF_cmdPropRxAdv.addrConf.addrType = 1;  // Address in header
        RF_cmdPropRxAdv.addrConf.addrSize = 16; // size of address (in bits)
        RF_cmdPropRxAdv.addrConf.addrPos = 8;
        RF_cmdPropRxAdv.addrConf.numAddr = 5;   // Number of addresses in address list
        RF_cmdPropRxAdv.pAddr = (uint8_t*)&AddressList;
    
        // Request access to the radio
        rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams);
    
        // Set the frequency
        RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0);
    
        RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropRxAdv, RF_PriorityNormal, &callback, RF_EventRxEntryDone);
    
        while(1);
    }
    
    void callback(RF_Handle h, RF_CmdHandle ch, RF_EventMask e)
    {
        if (e & RF_EventRxEntryDone)
        {
            // Toggle pin to indicate RX
            GPIO_toggle(CONFIG_GPIO_RLED);
    
            // Get current unhandled data entry
            currentDataEntry = RFQueue_getDataEntry();
    
            packetLength      = (uint16_t)(*(uint8_t*)(&currentDataEntry->data));
            packetDataPointer = (uint8_t*)(&currentDataEntry->data + 1);
    
            // Copy the payload + the status byte to the packet variable
            memcpy(packet, packetDataPointer, (packetLength + NUM_APPENDED_BYTES - 1));
    
            RFQueue_nextEntry();
        }
    }

    Siri

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

    我无法重现您的问题。

    我运行了您的 RX 和 TX 代码、一切都按预期运行。

    为方便起见、我附上了完整的代码示例(该示例基于最新 SDK 中的 rfPacketRX/TX 示例、我使用了 CCS 12.8.0)  

    e2e.ti.com/.../2211.demo.zip

    Siri

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

    您好、

    我比较了 syscfg 文件、看起来好像您使用的是最新的 SDK - simplelink_cc13xx_cc26xx_sdk@8.30.01.01?

      



    这是主要的区别、我们一直在尝试较旧的 SDK 7_41。

    您建议尝试使用新的 SDK 吗?

    此致、
    Sharan

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

    尊敬的 Siri:

    我使用 SDK 8.30 进行了验证、可以正常工作!

    现在、我想继续讨论我们的原始问题、即让链式命令正常工作。

    您是否有任何可能有所帮助的指针或示例参考?

    此致、
    Sharan





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

    不确定您要创建哪个链、或者看到了哪些问题、但以下示例可用作实现链的参考。

    rfListenBeforetalk

    BR

    Siri