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.

[参考译文] CC1350:UART 中的 CC1350射频数据包数据打印

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1137626/cc1350-cc1350-rf-packet-data-print-in-uart

器件型号:CC1350
主题中讨论的其他器件: CC1312RCC1352RCC1310

各位专家:

目前我正在使用 CC1350、我想在 UART 中打印射频数据包数据、然后 我想使用静态 UART 写入函数将所有任务中的数据写入 UART。 请指导我完成此任务。

此致

Surya

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

    您好 Surya、

    我不确定我是否完全理解您要做的事情。 您能否提供有关您尝试使用 UART 实现哪些目标以及遇到哪些困难的更多详细信息? 因此、我可以更好地帮助您。  

    此致、

    高斯图

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

    您好

    感谢快速响应、我希望通过 UART 打印射频数据包数据、然后如果我创建任何其他任务、如中断计数器、我希望静态使用相同的 UART 打印功能。 希望您能理解我的问题。

    此致

    Surya

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

    您是否打算将其用于调试? 如果是、请记住、打印到 UART 所需的时间最短为1 - 2ms、并且可以轻松地阻止其他任务。  

    在最新的 SDK 中可能有一个更好的示例、但您可以使用此处发布的 zip 文件中显示的概念: https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/636545/rtos-launchxl-cc1310-cc1310-transmit-and-receive-to-rf-from-spi-or-uart 、这意味着您将一个任务用于所有打印、数据将传递给此任务。  

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

    是的、您是对的、我在这里附上了我的示例代码供您参考、这里我使用了 Display_printf 函数、但这不起作用、这就是我想要使用 UART 写入函数的原因

    /*
    *版权所有(c) 2017-2019、德州仪器(TI)公司
    *保留所有权利。
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    **源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    **二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    **德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *以及任何明示或暗示的保证、包括但不限于:
    *特定适销性和适用性的隐含保证
    *不承认目的。 在任何情况下、版权所有者不得或
    *派遣国应对任何直接、间接、偶然、特殊、
    *典型或必然的损害(包括但不限于
    *采购替代货物或服务;丧失使用、数据或利润;
    *或业务中断)、无论原因是什么以及任何责任理论、
    *无论是合同、严格责任还是侵权行为(包括疏忽或)
    *否则)因使用本软件而以任何方式产生、
    *即使被告知可能会发生此类损坏。
    *
    /*
    *==== nvsinternal.c ====
    *

    #include
    #include
    #include

    /*驱动程序头文件*/
    #include
    #include

    /*驱动程序头文件*/
    #include

    /*示例/板头文件*/
    #include "Board.h"

    #define footer ======================================================================================== "

    放置在 RAM 中的/*缓冲器,用于保存从非易失性存储器读取的字节。 *
    静态字符缓冲区[64];
    int 计数= 0;
    /*
    *某些器件的闪存写入大小最小为4字节(1个字)。 尝试
    *写入不是4个数据量的倍数将失败。 该数组是
    *向上舍入(4的下一个倍数)以满足此要求。 请参阅 NVS
    *驱动程序文档以了解更多详细信息。
    *
    静态常量字符签名[52]=
    {"SimpleLink SDK 非易失性存储(NVS)示例"};

    /*
    *==== gpioButtonFxn0 ===
    * Board_GPIO_BUTTON0上 GPIO 中断的回调函数。
    *
    void gpioButtonFxn0 (uint_least8_t 索引)

    Display_Params 参数;
    Display_Params_init (&params);
    params.lineClearMode = display_clear_both;
    Display_Handle displayHandle = Display_open (Display_Type_UART、params);
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Board_GPIO_LED0);
    count++;
    display_printf (displayHandle、0、0、"key1=%d"、count);
    display_close (displayHandle);

    /*
    *==== gpioButtonFxn1 =========
    * Board_GPIO_Button1上 GPIO 中断的回调函数。
    *并非所有电路板都使用此功能。
    *
    void gpioButtonFxn1 (uint_least8_t 索引)

    Display_Params 参数;
    Display_Params_init (&params);
    params.lineClearMode = display_clear_both;
    Display_Handle displayHandle = Display_open (Display_Type_UART、params);
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Board_GPIO_LED1);
    count++;
    display_printf (displayHandle、0、0、"key2=%d"、count);
    display_close (displayHandle);

    /*
    *==== mainThread ====
    *
    void * mainThread (void * arg0)

    NVS_Handle nvsHandle;
    NVS_Attrs 区域 Attrs;
    NVS_Params nvsParams;

    Display_Handle displayHandle;

    /*调用驱动程序初始化函数*/
    GPIO_init();

    /*配置 LED 和按钮引脚*/
    GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    GPIO_setConfig (Board_GPIO_LED1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    GPIO_setConfig (Board_GPIO_BUTTON0、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);

    /*打开用户 LED */
    GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);

    /*安装按钮回调*/
    GPIO_setCallback (Board_GPIO_BUTTON0、gpioButtonFxn0);

    /*启用中断*/
    GPIO_enableInt (Board_GPIO_BUTTON0);

    /*
    *如果您的器件有多个输入引脚可用、则会中断
    将在 Board_GPIO_Button1上启用*。
    *
    if (Board_GPIO_BUTTON0!= Board_GPIO_Button1){
    /*配置 Button1引脚*/
    GPIO_setConfig (Board_GPIO_Button1、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);

    /*安装按钮回调*/
    GPIO_setCallback (Board_GPIO_Button1、gpioButtonFxn1);
    GPIO_enableInt (Board_GPIO_Button1);

    display_init();
    NVS_init();

    DisplayHandle = Display_open (Display_Type_UART、NULL);
    if (displayHandle == NULL){
    /* Display_open()失败*/
    while (1);

    NVS_PARAMS_INIT (_nvsParams);
    nvsHandle = NVS_OPEN (Board_NVSIONNAL、_nvsParams);

    if (nvsHandle == NULL){
    display_printf (displayHandle、0、0、"NVS_open () failed.");

    返回(空);

    display_printf (displayHandle、0、0、"\n");

    /*
    *这将填充具有特定属性的 NVS_Attrs 结构
    *连接到 NVS_Handle、例如区域基地址、区域大小、
    和扇区大小。
    *
    NVS_getAttrs (nvsHandle、&regionAttrs);

    /*显示 NVS 区域属性*/
    Display_printf (displayHandle、0、0、"区域基址:0x%x"、
    区域 Attrs.regionBase);
    Display_printf (displayHandle、0、0、"扇区大小:0x%x"、
    regionAttrs.sectorSize);
    Display_printf (displayHandle、0、0、"区域大小:0x%x\n"、
    regionAttrs.regionSize);


    /*
    *将"sizeof (signature)"字节从 NVS 区域基地址复制到中
    *缓冲区。 偏移量为0表示区域基地址的偏移量。
    *因此,字节从 regionAttrs.regionBase 复制。
    *
    NVS_READ (nvsHandle、0、(void *) buffer、sizeof (signature));

    /*
    *确定 NVS 区域是否包含签名字符串。
    *将字符串与复制到缓冲区中的内容进行比较。
    *
    if (strcmp ((char *) buffer、(char *) signature)==0){

    /*将签名直接从 NVS 区域写入 UART 控制台。 *
    Display_printf (displayHandle、0、0、"%s"、regionAttrs.regionBase);
    Display_printf (displayHandle、0、0、"擦除闪存扇区...");

    /*擦除整个闪存扇区。 *
    NVS_ERASE (nvsHandle、0、regionAttrs.sectorSize);

    否则{

    /*在 NVS 区域未找到签名。 *
    display_printf (displayHandle、0、0、"正在将签名写入闪存...");

    /*将签名写入内存。 之前擦除闪存扇区
    执行写入操作。 这由指定
    * NVS_WRITE_ERASE。
    *
    NVS_WRITE (nvsHandle、0、(void *) signature、sizeof (signature)、
    NVS_WRITE_ERASE | NVS_WRITE_POST_VERIFY);

    display_printf (displayHandle、0、0、"复位器件。");
    Display_printf (displayHandle、0、0、页脚);
    display_close (displayHandle);

    返回(空);

    此致

    Surya

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

    Display_printf 使用 UART。  

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

    可以、但在上面的代码中断正常工作、但该计数值不会打印到 UART。

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

    您好 Surya、

    您 应该检查  Display_open()返回的 displayHandle 是否有效且不为 NULL。 如果您尝试 使用 NULL 句柄进行打印、Display_printf 将不会向 UART 线打印任何内容。

    如果不允许打开第二个显示实例(因为您的 mainThread 中已有一个打开的显示实例)、则可能会收到 NULL 句柄。

    此致、

    高斯图

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

    您好

    好的、请告诉我我需要对我的代码进行哪些更改。

    此致

    Surya

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

    您好

    抱歉、在我的代码中、主任务数据已成功打印在 UART 中、但该数据不能用于按钮回调(gpioButtonFxn0)函数。

    此致

    Surya

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

    如上所述、请尝试在您的两个中断处理程序中验证返回 的 displayHandle 是否与 NULL 不同。 您可能会收到 NULL、因为您同时打开多个 Display UART 实例(mainThread 中的第一个实例和中断处理程序中的另一个实例)、这是不允许的。

    如果您收到 NULL 句柄、那么上面的情形就是您的示例所发生的情况。  

    您可以将 displayHandle 变量移动到 mainThread 外部、并将其作为 mainThread 和中断的全局变量使用。 但是、由于与中断处理程序相关的延迟、强烈建议不要通过 UART 打印、这可能会导致任务被阻止很长时间。 我建议您遵循由 GhostOf 链接的示例、并使用单独的线程来执行所有 UART 打印。

    此致、

    高斯图

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

    您好

    好的、我同意您关于中断处理程序中使用的打印的建议、现在我只是测试 printf 函数是否在其他任务中工作。

    然后我已经检查 建议的代码、该代码仅在 RFpacket 接收函数上具有 UART 打印函数、在这里、我正在尝试创建一个函数、如 serialprint(("hello=%d"、count)或  serialprint(("任务确定")、这将使用任何线程主线程或创建的子线程。

    此致

    Surya

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

    Surya:侧面有一个问题:您为什么要使用 CC1350? 如果您计划仅使用一个频带、请查看 CC1310/CC1312R。 如果您想包含 BLE、请使用 CC1352R 等来获得足够的存储器来运行两个堆栈。  

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

    您好

    感谢您的澄清、我们将来会有一个 OTA 计划、因此我们将 CC1350用于 我们 的项目、这将使 CC1350变得非常熟悉。

    此致

    Surya

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

    您好 Surya、

    您的状态是否有任何更新? 如果您需要进一步的帮助、或者我是否可以关闭线程、请告诉我。  

    此致、

    高斯图

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

    您好 

    感谢您的回复、我已停止使用 cc1350进行开发、现在我购买了 cc1312 Launchpad 进行开发、我需要您提供以下要求的建议。

    1. 我希望读取中断计数并将该计数存储在同时读取的 NVS 中、
    2. 通过射频数据包发送该计数和 ADC 值
    3. 将 ADC 值和中断计数打印到 UART

    在这里,我如何做到这一点,哪一个例子适合这项工作。

    这些数据根据射频器件希望关断的其他时间间隔进行传输。

    可以选择更改频率以避免数据冲突。

    此致

    Surya

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

    您好 Surya、  

    很抱歉我的答复很晚。  

    -如果您在应用中使用射频,我建议您从 rfPacketTx 和 rxPacketTx 这两个示例开始。 熟悉它们的工作原理、然后您可以在其中集成 UART 和 NVS 功能。 要开始使用 UART2和 NVS 驱动程序、我建议您查看 uart2echo/uart2callback 和 nvsinternal/nvsexternal 示例、这些示例应有助于您了解如何通过 TI 驱动程序与两个外设进行交互。  

    -如果您希望 在运行时在同一频带内进行小幅频率调整,则可以使用 CMD_FS 频率进行此操作( rfPacket 示例中的 RF_cmdFs.frequency)->有关主题 的更多详细信息,请访问 https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/897167/cc1312r-frequency-change-related-questions 。  

    如果您希望在频率上实现更大的跳转、我认为您必须关闭射频内核并使用不同的中心频率发出新的设置命令(rfPacket 示例中的 RF_cmdPropRadioDivSetup.centerFreq)。

    此致、

    高斯图

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

    您好

    感谢您的回复、我将进行检查并告知我们。

    此致

    Surya

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

    当然是 Surya。 如果问题得到解决或您有更多问题、请更新主题。

    此致、

    高斯图