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.

[参考译文] LP-CC1352P7:用于发送和接收 IEEE 802.15.4帧的基本工程

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

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1242165/lp-cc1352p7-basic-project-to-transmit-and-receive-an-ieee-802-15-4-frame

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

我需要一个示例工程(或使用 CCS 创建一个工程)、以便能够传输和接收直接访问无线电内核的802.1.5.4帧。

无法从 SDK 和相关文档中获取适当的详细信息。

是否有人可以指导我完成此操作? 非常感谢!

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

    Karthik、您好、

    您可以使用专有射频示例作为起点(https://dev.ti.com/tirex/explore/node?node=A__AJq6yarL5-cu.k-KvHeZbA__com.ti.SIMPLELINK_CC13XX_CC26XX_SDK__BSEc4rl__LATEST )

    对于 IEEE 模式、我们在此处提供了文档: https://dev.ti.com/tirex/content/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/docs/proprietary-rf/proprietary-rf-users-guide/proprietary-rf-guide/ieee-rf-index-cc13xx_cc26xx.html 

    谢谢、

    M·H

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

    尊敬的 Marie、感谢您的回应。

    我确实演示了指向的示例。 我希望对源代码有更深入的了解。

    例如:我不明白此命令的定义位置:CMD_PROP_RX、以及还有哪些其他此类命令可用于编写自定义代码。

    谢谢

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

    此外、我希望将无线电配置为在特定 IEEE 802.15.4通道上发送和接收

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

    Karthik、您好、

    我建议您使用射频驱动程序。

    您可以在以下位置找到所有射频驱动器文档: https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/docs/rflib/html/index.html

    此处提供了 CMD_PROP 定义(单击每个命令了解详情): https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_10_00_98/docs/rflib/html/cc13x2__cc26x2_2driverlib_2rf__prop__cmd_8h.html 

    谢谢、

    M·H

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

    尊敬的 Marie:

    设法为 IEEE Rx 模式编写示例应用。

    对于 IEEE Tx 模式、无法找到用于配置通道编号的配置。

    下面是代码。代码在执行 RF_runCmd 函数时崩溃。

    void *mainThread (void *arg0)
    {

       RF_Params rfParams;
       rf_params_init (&rfParams);
       rfParams.NID = RF_STACK_ID_154;

       GPIO_setConfig (CONFIG_GPIO_GLED、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

       GPIO_WRITE (CONFIG_GPIO_GLED、CONFIG_GPIO_LED_OFF);

       rf_cmdIeeeTx_ieeee154p10_0.payloadLen = payload_length;
       rf_cmdIeeeTx_ieeee154p10_0.pPayload =数据包;
       rf_cmdIeeeTx_ieeee154p10_0.startTrigger.triggerType = trig_now;

       rfHandle = rf_open ((RF_Object *)&rfObject、&RF_prop_ieeee154p10_0、(RF_RadioSetup*)&RF_cmdRadioSetup_ieee154p10_0、&rfParams);

       rf_postCmd (rfHandle、(RF_Op*)和 rf_cmdfs_ieeee154p10_0、RF_PriorityNormal、NULL、0);

       //设置工作通道
       // RF_cmdIeeeTx_ieee154p10_0.channel = 11;

       while (1)
       {
           /*创建具有递增序列号和随机有效负载的数据包*/
           packet[0]=(uint8_t )(seqNumber >>8);
           packet[1]=(uint8_t)(seqNumber++);
           uint8_t i;
           对于(I = 2;I < PAYLOAD_LENGTH;I++)
           {
               packet[i]=rand();
           }

           /*发送数据包*/
           RF_EventMask terminationReason = RF_runCmd (rfHandle、(RF_Op*)&RF_cmdIeeeTx_ieeee154p10_0、RF_PriorityNormal、NULL、0);

           GPIO_TOGGLE (CONFIG_GPIO_GLED);

           /*关闭对讲机*/
           rf_yield (rfHandle);

           /* packet_interval us 的睡眠*/
           usleep (packet_interval);

       }

    谢谢

    卡尔蒂克

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

    Karthik、您好、

    对于通道、您需要更改 RF_cmdRadioSetup_ieeee154p10_0和 RF_cmdfs_ieee154p10_0的频率参数、并检查 SysConfig 作为参考生成的 ti_nRADIO_CONFIG.c。 您将必须在通道更改之间关闭/打开射频驱动器。

    如果使用 IEEE PHY、请使用 RF_runScheduleCmd 而不是 RF_runCmd。   https://e2e.ti.com/f/1/t/1002235 

    此致、
    瑞安

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

    您好、Ryan、

    这是结构。模型中没有频率参数、还是缺少了一些东西?

    // CMD_RADIO_SETUP_PA
    //预定义方案的无线电设置命令
    RFC_CMD_RADIO_SETUP_PA_t RF_cmdRadioSetup_ieee154p10_0 =
    {
       .commandNo = 0x0802、
       .status = 0x0000、
       .pNextOp = 0、
       .StartTime = 0x00000000、
       .startTrigger.triggerType = 0x0、
       .startTrigger.bEnaCmd = 0x0、
       .startTrigger.triggerNo = 0x0、
       .startTrigger.pastTrig = 0x0、
       .condition.rule = 0x1、
       .condition.nSkip = 0x0、
       .mode = 0x01、
       .loDivider = 0x00、
       .config.frontEndMode = 0x0、
       .config.biasMode = 0x1、
       .config.analogCfgMode = 0x0、
       .config.bNoFsPowerUp = 0x0、
       .config.bSynth窄 带= 0x0、
       .txPower = 0x762E、
       .pRegOverrides_ieeee154p10_0、
       .pRegOverrideTxStd = 0、
       .pRegOverrideTx20 = 0
    };

    以下结构有频率参数。 如何知道要为通道12、13或14等写入的值(802.15.4通道)

    // CMD_FS
    //频率合成器编程命令
    RFC_CMD_FS_t RF_cmdFS_ieeee154p10_0 =
    {
       .commandNo = 0x0803、
       .status = 0x0000、
       .pNextOp = 0、
       .StartTime = 0x00000000、
       .startTrigger.triggerType = 0x0、
       .startTrigger.bEnaCmd = 0x0、
       .startTrigger.triggerNo = 0x0、
       .startTrigger.pastTrig = 0x0、
       .condition.rule = 0x1、
       .condition.nSkip = 0x0、
       .frequency = 0x0965
       .fractFreq = 0x0000、
       .synthConf.bTxMode = 0x0、
       .synthConf.refFreq = 0x0、
       .__dummy0 = 0x00,
       .__dummy1 = 0x00,
       .__dummy2 = 0x00,
       .__dummy3 = 0x0000
    };

    谢谢

    卡尔蒂克

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

    我的初始回复不正确、频率仅适用于 RF_cmdfs_ieee154p10_0  、而不适用于 RF_RadioSetup_icmde154p10_0。  我已经澄清了我原来的帖子。 0x0965是通道11、您可以在从 IEEE 模块相应修改 Channel 时看到 SysConfig 的生成文件视图以观察不同的值。

    此致、
    瑞安

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

    谢谢 Ryan。 这有所帮助。

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

    e2e.ti.com/.../cc1352p4_2D00_4_5F00_tx_5F00_rx_5F00_test.zip

    您好、Ryan、请查看随附的内容。

    Tx 和 Rx 代码(使用两个 Lauchpad 板-一个是发送器、另一个是接收器)。

    每秒钟在通道11上发送一次数据。

    我可以看到发送器上的绿色 LED 每1秒切换一次。

    我看不到接收器上的红色 LED 切换。 在调试时、我没有看到控制切换到回调函数。

    请检查代码、并告诉我是否丢失了一些内容。

    谢谢

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

    Karthik、您好、

    请使用 Smart RF Studio 7 (每个接口一个 LaunchPad)测试 PropRF 代码、这意味着您应该测试具有 Smart RF Studio 接收模式的 rfPacketTx 项目和具有 Smart RF Studio 传输模式的 rfPacketRx。  基本 RX 和 TX SimpleLink Academy 实验中介绍了类似的方法。  然后、您可以确定发送器端或接收器端是否未按预期运行、之后您可以进一步确定是否存在任何不匹配的射频设置或是否 未完全遵循之前的迁移指令。

    此致、
    瑞安

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

    您好、Ryan、

    我使用 SmartRF (Tx 和 Rx)进行了测试、能够在接收器上看到数据包。

    固件 Tx 和 SmartRF Rx。 能够在一个通道上看到数据包(此处的示例是通道#11)。

    测试了数据包长度为30字节的固件 Tx 更改通道。 我无法在 SmartRF 接收器上看到适当的基于15.4的数据包。 奇怪的是、即使固件 Tx 已停止、它 SmartRF 也在通道14/通道20上捕获数据包。 已连接快照。

    您能解释一下这种现象吗?

    此外、如何确保 SmartRF Rx 在已配置通道上仅接收预期的数据包、而固件 Tx 在所有802.15.4通道上传输?

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

    此测试将确认数据包传输项目存在问题。  我建议您清理/重新构建项目、检查无线电设置、 考虑导入 新项目 并应用我们之前讨论的更改。  您观察到正在接收的数据包来自在同一通道上使用802.15.4网络数据包的其他附近器件、在 Smart RF Studio 内部无法将这些数据包过滤掉。

    此致、
    瑞安

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

    Ryan。

    我想知道它是否是发送器代码。 正如我所提到的,固件 Tx 能够发送数据包,并且我能够在 Smart RF 接收器(在通道#11上)上看到相同的数据包。

    问题是、当我在每次迭代时更改信道编号(以仿真信道跳频)并进行传输时、我无法看到在 SmartRF 接收器上正确捕获的数据包。

    仅供参考:附近没有802.1.5.4器件。 因此、我仍然想知道 Smart RF 是如何处理这些数据包的。

    附上了发送器代码。 请回顾并感谢您在 it.e2e.ti.com/.../rfPacketTx.zip 上的评论

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

    感谢您澄清此问题(即跳频)。

    • 在更改信道之前、应取消所有现有/排队的射频命令
    • RF_CancelCmd 和 RF_flushCmd 应足以中止任何射频活动
    • RF_PendCmd 将返回 RF_EventCmdCanceled、RF_EventCmdAborted 或 RF_EventCmdStopped、具体取决于调用取消/清除之前命令的状态。
    • 尝试在 FS 命令后添加较长的延迟、以使频率合成器最终确定更改

    之后可以使用 CMD_FS 命令更改通道。  为方便参考和了解更多具体细节、此处提供了 rflib API 的链接、其中包括RFCC26X2.hRF_driver。   以下是具有建议切换方法的相关 E2E 贴文:https://e2e.ti.com/f/1/t/1124734 

    此致、
    瑞安

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

    您好、Ryan、这些信息提供了帮助。 我可以通过手动切换通道和监控在 SmartRF 接收器上看到数据包。

    接收器进行验证。

    您可以帮助您如何在 CCS IDE 的控制台终端上输出接收到的数据包数据(同时调试代码)吗?

    谢谢

    卡尔蒂克

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

    我建议使用调试打印 SimpleLink Academy 实验 或 Display/UART2 TI 驱动程序 (请参见 DISPLAYuart2echorfDiagnostics 项目示例)。

    此致、
    瑞安

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

    包含以下头文件:#include  

    重新使用了教程中的代码片段:

    Display_Handle display;
    display = Display_open(Display_Type_HOST, NULL);
    


    编译抛出错误。 我还应该检查什么?

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

    您是否从 SysConfig 文件的 TI 驱动程序选项中添加了 Display 模块? 我 可以通过省略该内容来重建工程的行为、但使用 Display 模块重新构建可以解决该问题并完成构建。

    此致、
    瑞安

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

    编译就没问题。

    下面是初始化代码:

    DISPLAY_Handle DISPLAY;

    Display_Params   参数;

    // display = Display_open (Display_Type_host、NULL);

    Display = Display_open (Display_Type_UART、&params);

    CCS 控制台上不打印任何内容(在 SysConfig 中显示类型为主机)。

    CCS 终端上为 NONE @ 115200 Baud (当 SysConfig 中的显示类型为 UART 时)。

    还有其他需要交叉检查的东西吗?

    谢谢

    卡尔蒂克

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

    您是否将 SysConfig -> UART2模块的"Use Hardware"功能从"None"更改为"XDS110 UART"?  通过使用默认 LaunchPad 的 XDS110反向通道 UART 连接、该连接适用于我的系统。

    请注意、我将使用不同的 LaunchPad 版本(其中一个版本仅具有2.4GHz)、但 仍然使用 rfPacketTx 示例、因此概念适用。

    此致、
    瑞安

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

    这起作用了!

    谢谢

    卡尔蒂克

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

    您好、Ryan、

    看上去类似于 Display_printf 只能将数据从目标板发送到终端、并且还与 UART API 发生冲突。

    尝试 uart2echo.c 示例。 更改了输入缓冲器以容纳2个字节。 无法从终端看到任何字节。

    我还想在终端上键入字符以及要在目标板上读取的数据(双向通信)。

    请建议如何去做这件事。

    谢谢

    卡尔蒂克

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

    与显示屏相比、您正确地认为需要使用 UART TI 驱动程序进行双向通信。  此处是 TI 驱动程序运行时 API 的链接 、供进一步查看。

    尝试 uart2echo.c 示例。 更改了输入缓冲器以容纳2个字节。 无法看到来自终端的任何字节。

    您更改了什么输入缓冲器?  我建议您在尝试进行更改之前按预期使用默认示例。  您还应查看我链接的 TI 驱动程序文档中提供的示例。

    此致、
    瑞安

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

    默认示例工作正常。 这对我来说是不够的。 将必须编写我自己的 printf 函数以便在终端中输出/读取数据。

    我更改了"input"(uart2echo.c 示例中的字符类型变量)来保持两个字符、以查看是否 捕获了在终端上键入的任何内容。

    此外,无法查看 bytesRead 或 bytesWritten 变量的更新(在"Expressions"窗口中)。

    谢谢

    卡尔蒂克

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

    bytesRead 和 bytesWritten 初始化没有为多个字节定义、本质上您需要 使用数组。  请考虑研究 rfDiagnostics 示例的 UART 实现(双向)。

    此致、

    瑞安

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

    感谢您分享文档。 我不是在寻找命令实现。

    基于 UART 的简单传输、写入终端并从终端读取。

    例如、我尝试在终端上打印数据、结果成功了。 但是我仍然不明白 bytesWritten 参数。

    void uart_printf (const char *格式、...)
    {
       va_list 参数;
       va_start (args、格式);

       char 缓冲器[128];
       vsnprintf (buffer、sizeof (buffer)、format、args);

       va_end (args);

       uart_send_data ((const uint8_t *) buffer、strlen (buffer));

    void uart_send_data (const uint8_t * data、uint32_t len)
    {
       size_t bytesWritten = 0;
       UART2_WRITE (uart、data、len、&bytesWritten);//来自 TI 驱动程序的 UART API

    uart_printf ("整数值:%d\r\n"、value_int);
    uart_printf ("浮点值:%.2f\r\n"、value_float);

    同样、我需要一个函数来处理从终端读取的数据。 在这种情况下、需要特殊处理来处理用户输入、用户可以键入正确的数据并按"Enter"键、也可以键入错误内容、输入退格以更正、然后按"Enter"键。

    谢谢

    卡尔蒂克

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

    以下是适用于我的例程:

    以下函数可以从终端读取数据:

    void uart_read_data (void)
    {
       字符输入;
       size_t 字节 Read;
       size_t bytesWritten = 0;
       uint32_t status    = UART2_STATUS_SUCCESS;

       while (1)
       {
           字节 Read = 0;
           while (bytesRead =0)
           {
               状态= UART2_READ (UART、&INPUT、1、&bytesRead);

               如果(status!= UART2_STATUS_SUCCESS)
               {
                   /* UART2_READ()失败*/
                   while (1){}
               }
           }

           UART_Rx_BUFFER[i]=输入;

           如果(uart_rx_BUFFER[i] >0){
               //已接收字符
               如果(uart_rx_BUFFER[i]='\r'){
                   //回车(回车键)
                   UART_Rx_BUFFER[i]="\0";// null -终止缓冲区
                   uart_printf ("\r\n");//回显新行
                   中断;
               }
               否则为(uart_rx_BUFFER[i]="b"|| uart_rx_BUFFER[i]== 0x7F){
                   // Backspace 或 DEL 键
                   如果(I > 0){
                       I --;
                   }
               }
               否则为(i< uart_Buffer_size -1){
                   //正常字符
                   bytesWritten = 0;
                   while (bytesWritten =>= 0)
                   {
                       状态= UART2_WRITE (UART、&INPUT、1、&bytesWritten);

                       如果(status!= UART2_STATUS_SUCCESS)
                       {
                           /* UART2_WRITE ()失败*/
                           while (1){}
                       }
                   }
                   I++;
               }
           }


       }

    以下函数可输出打印到控制台:

    //通过 UART 发送数据的函数
    void uart_send_data (const uint8_t * data、uint32_t len)
    {
       size_t bytesWritten = 0;
       UART2_WRITE (uart、data、len、&bytesWritten);



    //Custom printf 函数、用于 UART 输出
    void uart_printf (const char *格式、...)
    {
       va_list 参数;
       va_start (args、格式);

       char buffer [128];//根据需要调整缓冲器大小
       vsnprintf (buffer、sizeof (buffer)、format、args);

       va_end (args);

       uart_send_data ((const uint8_t *) buffer、strlen (buffer));

    要测试的示例:

    int value_int = 42;
    float value_float = 3.14;

    /*创建一个处于默认读写模式阻塞的 UART */
       UART2_Params_init (&uartParams);
       uartParams.baudrate = 115200;

       UART = UART2_OPEN (CONFIG_UART2_0、&uartParams);

       如果(UART = NULL)
       {
           /* UART2_OPEN()失败*/
           while (1){}
       }

    uart_printf ("Hello、这是一个 UART printf 示例!\r\n");
    uart_printf ("整数值:%d\r\n"、value_int);
    uart_printf ("浮点值:%.2f\r\n"、value_float);
    while (1);