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.

[参考译文] RTOS/LAUNCHXL-CC1310:在 easyLinkTx 中添加新按钮

Guru**** 2393725 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/646984/rtos-launchxl-cc1310-adding-new-button-in-the-easylinktx

器件型号:LAUNCHXL-CC1310
主题中讨论的其他器件:SimpliciTI

工具/软件:TI-RTOS

你好

我参考了以下主题  

这部分有帮助。 我添加了两个新按钮、就像按钮2和3一样。 但是、当我按下两个按钮时、我的数据包没有被设置。 我认为这与处于导通模式的内部上拉电阻有关。 我尝试了 pin-setOutputEnable 和 setOutputValue、但遇到了许多错误。 我的新按钮2和3分别设置为 dio 29和 dio 30。 我在 board.h 和 launchxl.h 中定义了它们

该代码适用于按钮0和按钮1。 请帮助我了解如何初始化 dio 29和30以发送数据包。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请在突出显示您在 easyLinkTx 示例中添加/更改的代码的位置发布您的代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:Shubhankar
    #define EMR_STOP CC1310_LAUNCHXL_PIN_BTN3
    
    #define ON_OFF CC1310_LAUNCHXL_PIN_BTN4
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Shubhankar ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BTN3和 BTN4分别定义为 IOID29和 IOID30
    
    PIN_Config pinTable[]={
    BOARD_PIN_LED1 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
    BOARD_PIN_LED2 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
    PIN_TERMINATE
    };
    
    
    //关断唤醒
    /*唤醒按钮引脚表* PIN_Config
    ButtonTableWakeUp[]={
    // Board_PIN_BUTTON0 | PIN_INPUT_EN | PIN_PULLUP | PINCC26XX_WAKEUP_NEGEDGE、
    // Board_PIN_BUTTON1 | PIN_INPUT_EN | PIN_PULLUP | PINCC26XX_WAKEUP_NEGEDGE、
    
    EMR_STOP | PIN_INPUT_EN | PIN_GPIO_HIGH | PIN_PULLUP | PINCC26XX_WAKEUP_NEGEDGE、
    ON_OFF | PIN_INPUT_EN | PIN_GPIO_HIGH| PIN_PULLUP | PINCC26XX_WAKEUP_NEGEDGE、
    PIN_TERMINATE /*终止列表*/
    };
    
    
    if ((PIN_getInputValue (EMR_STOP))=0){
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、1);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、0);
    对于(I = 2;I < RFEASINKTXPAYLOAD_LENGTH;I++)
    {
    txPacket.PAYLOAD[i]= 0x01;
    }
    //将 Tx 绝对时间设置为当前时间+ 100ms
    txPacket.absTime = EasyLink_getAbsTime ()+ EasyLink_ms_TO_RadioTime (1);
    sendPacketTrigger = 1;
    }
    
    
    如果(PIN_getInputValue (ON_OFF)=0){
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、0);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、1);
    对于(I = 2;I < RFEASINKTXPAYLOAD_LENGTH;I++)
    {
    txPacket.PAYLOAD[i]= 0x02;
    }
    //将 Tx 绝对时间设置为当前时间+ 100ms
    txPacket.absTime = EasyLink_getAbsTime ()+ EasyLink_ms_TO_RadioTime (1);
    sendPacketTrigger = 1;
    } 

    因此、我有两个外部按钮、即 ON_OFF 和 EMR_STOP。 这些设置为上拉。 但是、当我开始调试时、如果不检查条件 EMR_STOP/ON_OFF=0 (按下按钮)、则环路进入并打开绿色 LED、同时按下按钮、不会发送数据包。

    低功耗模式工作正常。 我尝试使用板载 btn1和 btn2进行检查、它正在工作。

    EMR_STOP 和 ON_OFF 已定义为 Launchpad 上的引脚29和30。 因为它们也是模拟引脚、这会成为一个问题吗? 我尝试更改为引脚10、12、但它仍然不起作用。 我对 pin.h 文件有疑问、该文件中针对引脚进行了所有设置、作为输入/输出。

    谢谢 ter!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么要将引脚设置为 PINCC26XX_WAKEUP_NEGEDGE? 使用 PIN_IRQ_NEGEDGE 和一个在按下按钮时运行的回调函数、而不是轮询引脚。 PIN_IRQ_NEGEDGE 用于 SDK 中的一些示例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    感谢您的回复。 我将把它更改为"Interrupt Request"。 但是 PIN_IRQ_NEGEDGE 定义为 PIN_GEN|(0x5<<16)
    这是否意味着它只应用于 Dios 5到16? 引脚29和30应该没有问题、因为它们支持模拟功能、我将其用于数字用途、对吧?

    此外、我如何以及在何处定义回调函数? 是否会像上述情况那样使用简单的 if 循环?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我相信 PIN_GEN|(0x5<<16)正在设置 IOCFG 寄存器中的启用中断位。

    如果您查看同名示例中的 rfPacketErrorRate.c 文件、您会在回调中找到一个示例。 无论采用何种方法、都应实现某种去抖。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    感谢您提出这一点。 在 rfPacketErrorRate.c 中、我看到使用去抖实现了按钮回调 f'n、那么我是否应该使用回调函数替换从第27行到第50行的整个代码? 此外、我之前发现代码进入 IF 环路时、甚至没有使用外部按钮 EMR_STOP 和 ON_OFF 检查按钮按压事件、但使用板载按钮可以正常工作。

    IRQ_NEGEDGE 和去抖如何影响变化?

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

    您好、

    我的按钮工作正常、接收器也在接收数据包。 但是、我要求发送器处于睡眠模式(~7uA)、而不是通过按钮按压进行传输

    我要在此处附上我的代码。 当我取消注释 Power_SHUTDOWN (0、0)时、尝试将我的代码放置在 Else 环路等中。相同的旧问题是引脚被绕过且 LED 亮起。 您能否为相同的解决方案提出建议?

    void txDoneCb (EasyLink_Status 状态)
    {
    
    Semaphore_post (txDoneSem);
    }
    #endif //RFEASINKTX_异 步
    
    
    
    
    静态空 buttonCallbackFunction (PIN_Handle handle、PIN_ID pinId)
    {
    //uint8_t txBurstSize = 0;
    uint8_t cntr = 0;
    #ifdef RFEASINKTX_异 步
    /*为异步创建一个信号量*/
    Semaphore_Params 参数;
    ERROR_Block EB;
    
    /* Init 参数*/
    Semaphore_Params_init (&params);
    ERROR_INIT (&EB);
    
    /*创建信标实例*/
    txDoneSem = Semaphore_create (0、&params、&EB);
    #endif //TX_异 步
    
    EasyLink_init (EasyLink_Phy_Custom);
    
    /*将输出功率设置为12dBm */
    EasyLink_setRfPwr (10);
    
    while (1){
    // while (cntr <1){
    
    
    EasyLink_TxPacket txPacket ={{0}、0、0、{0}};
    txPacket.PAYLOAD[0]=(uint8_t)(seqNumber >> 8);
    txPacket.PAYLOAD[1]=(uint8_t)(seqNumber++);
    
    
    txPacket.len = RFEASINKTXPAYLOAD_LENGTH;
    txPacket.dstAddr[0]= 0xAA;
    uint8_t I、sendPacketTrigger = 0;
    
    /*简单去抖逻辑,仅在按钮仍被按下(低电平)时切换*/
    // CPUdelay ((uint32_t)((48000000/3)*0.050f));
    int mypin = PIN_getInputValue (PIN_ID (29));
    如果(mypin =0)
    {
    CPUdelay ((uint32_t)((48000000/3)*0.050f));
    // if (mypin=1)
    //{
    // menu_notifyButtonPressed (button_navigate);
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、1);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、0);
    对于(I = 2;I < RFEASINKTXPAYLOAD_LENGTH;I++)
    {
    txPacket.PAYLOAD[i]= 0x01;
    }
    //将 Tx 绝对时间设置为当前时间+ 100ms
    txPacket.absTime = EasyLink_getAbsTime ()+ EasyLink_ms_TO_RadioTime (1);
    sendPacketTrigger = 1;
    }
    
    否则、如果(PIN_getInputValue (Board_PIN_Button1)=0)
    {
    CPUdelay ((uint32_t)((48000000/3)*0.050f));
    // menu_notifyButtonPressed (button_Select);
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、0);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、1);
    对于(I = 2;I < RFEASINKTXPAYLOAD_LENGTH;I++)
    {
    txPacket.PAYLOAD[i]= 0x02;
    }
    //将 Tx 绝对时间设置为当前时间+ 100ms
    txPacket.absTime = EasyLink_getAbsTime ()+ EasyLink_ms_TO_RadioTime (1);
    sendPacketTrigger = 1;
    }
    否则{
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、0);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、0);
    sendPacketTrigger = 0;
    CNTR++;
    
    }
    
    if (sendPacketTrigger = 1)
    {
    EasyLink_transmit异 步(&txPacket、txDoneCb);
    //等待300ms 以完成 Tx
    if (semaphore_pend (txDoneSem、(30000 / Clock_tickPeriod))= false)
    {
    // TX 超时,中止
    if (EasyLink_abort ()=EasyLink_Status_Success)
    {
    
    Semaphore_pend (txDoneSem、BIOS_wait_forever);
    }
    }
    sendPacketTrigger = 0;
    CNTR = 0;
    
    }
    
    
    
    CNTR = 0;
    // Power_shutdown (0、0);
    //将 DIO 配置为从关断状态唤醒
    PINCC26XX_setWakeup (ButtonTableWakeUp);
    
    //进入关断状态
    //Power_shutdown (0、0);
    
    //不应出现在此处,因为关断将重置。
    // while (1);
    
    //}
    }
    }
    
    void txTask_init (PIN_Handle inPinHandle){
    pinHandle = inPinHandle;
    
    Task_Params_init (&txTaskParams);
    TxTaskParams.STACKSIZE = RFEASYS LINKTX_TASK_STACK_SIZE;
    txTaskParams.priority = RFEASINKTX_TASK_priority;
    txTaskParams.stack =&txTaskStack;
    txTaskParams.arg0 =(UINT) 1000000;
    
    // Task_construction (&txTask、rfEasyLinkTxFnx、&txTaskParams、NULL);
    Task_construction (&txTask、buttonCallbackFunction、&txTaskParams、NULL);
    }
    
    
    /*
    === main ====
    */
    int main (void)
    {
    /*调用驱动程序初始化函数。 *
    Board_initGeneral();
    
    /*打开 LED 引脚*/
    pinHandle = PIN_OPEN (&pinState、pinTable);
    if (!pinHandle){
    System_abort ("初始化板 LED 引脚时出错");
    }
    
    /*清除 LED 引脚*/
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、0);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、0);
    
    txTask_init (pinHandle);
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 由 Shubhankar 添加
    PIN_Status = PIN_registerIntCb (buttonPinHandle、&buttonCallbackFunction);
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:Shubhankar
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您要关断、则在再次唤醒时很可能必须重新配置引脚。 请参阅此处的引脚关断示例、了解这是如何实现的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    请详细说明一下。 我关闭了 launchpad 上的外部闪存 、但在睡眠中仍能获得大约4mA 的电流。

    能否在 EasyLink 中的单独文件夹中添加 pinShutdown.c、删除冗余部件并使其正常工作?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我怀疑我需要从不同的角度来看待这个问题(自己编写一些代码)您希望这两个按钮到底做什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、ter

    我在 rfEasyLinkTx 项目的单独文件夹中连接了 pinShutdown.c

    按下后、两个按钮只需分别发送数据包"01"和"02"、控制器应处于关断模式、以最大限度地降低电池消耗。

    这是一行中的应用程序。 按钮工作正常。 我在 Rx 侧获取数据包。 但是、该器件未处于睡眠状态(6mA、未打线时)

    谢谢

    Shubhankar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    忘记提问:我假设您在没有连接调试器的情况下检查功耗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    很抱歉、我单击了"解决错误"

    是的、所有器件都已断开连接、包括 LED 跳线、以最大程度地降低功耗。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我想说的是、我的问题仍然没有解决。 这是个错误:P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、昨天没时间看。 此时、代码在第一次按下按钮后关闭、但第二次不转至 TX。 我必须进行更多的调试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../rfEasyLinkTx.c

    附加的代码发送一个数据包并在关断状态下关闭。 在此代码中、按钮没有任何去抖逻辑、它应该有一些可以避免在按下按钮后发送多个数据包。 该代码不包含按钮的任何回调函数、因为唯一发生的情况是插入随机数据包并在关断时再次下降。

    请注意、包含一个关闭外部闪存的函数、因为如果不这样做、闪存将消耗~8uA 的电流

     

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

    嗨、ter

    非常感谢您提供此代码。 它与我引用的示例中的示例有何不同(在该线程的开头)。 您将按钮声明为磁极、不应该是 PIN_IRQ? 我使用的是两个外部按钮、而不是 LaunchPad 按钮

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

    嗨、ter

    我想知道我必须将按钮按压和抖动逻辑保持在什么位置。 这些按钮应分别发送数据包01和02、因为它们在 Rx 侧执行不同的 f'ns

    /*
    === rfEasyLinkTx.c ===
    */
    /*标准 C 库*/
    #include 
    
    /* XDCtools 头文件*/
    #include 
    #include 
    #include 
    
    /* BIOS 头文件*/
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /* TI-RTOS 头文件*/
    #include 
    #include 
    #include 
    #include 
    
    
    #include DeviceFamily_constructPath (inc/hw_prcm.h)
    #include DeviceFamily_constructPath (driverlib/sys_ctrl.h)
    
    
    
    /* Board Header 文件*/
    #include
    
    
    "EasyLink/link.h"
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:Shubhankar
    #define EMR_STOP CC1310_LAUNCHXL_PIN_BTN3
    
    #define ON_OFF CC1310_LAUNCHXL_PIN_BTN4
    
    #define EMR 01
    #define ONOFF 02
    
    
    PIN_Handle buttonPinHandle;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:Shubhankar
    
    #define RFEASINKTX_ASYSYNC
    
    #define RFEASINKTX_TASK_STACK_SIZE 1024
    #define RFEASINKTX_TASK_PRIORITY 2
    
    #define RFEASINKTX_BURST_SIZE 10
    #define RFEASINKTXPAYLOAD_LENGTH 30
    
    Task_Structt txTask;//非静态,因此可以在 ROV 中看到*/
    静态 Task_Params txTaskParams;
    静态 uint8_t txTaskStack[RFEASYLINKTX_TASK_STACK_SIZE];
    
    //引脚驱动程序句柄*/
    静态 PIN_Handle pinHandle;
    静态 PIN_STATE pinState;
    
    // PIN_ID*引
    
    
    
    
    脚 ID *针对活动的 PIN_ID*引脚配置*引脚*引脚 ID:*引脚 ID:
    *-所有 LED 板 LED 均熄灭。
    */
    PIN_Config pinTable[]={
    BOARD_PIN_LED1 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
    BOARD_PIN_LED2 | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、
    PIN_TERMINATE
    };
    
    
    //关断唤醒
    /*唤醒按钮引脚表*/
    PIN_Config ButtonTableWakeUp[]={
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Shubhankar 的所有更改
    // Board_PIN_BUTTON0 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE、 //之前是 PINCC26XX_WAKEUP_NEGEDGE,
    // Board_PIN_BUTTON0 | PIN_INPUT_EN | PIN_PULLUP | PINCC26XX_WAKEUP_NEGEDGE、
    EMR_STOP | PIN_INPUT_EN | PIN_GPIO_LOW | PIN_PULLUP | PIN_IRQ_NEGEDGE、
    ON_OFF | PIN_INPUT_EN | PIN_GPIO_LOW| PIN_PULLUP | PIN_IRQ_NEGEDGE、
    PIN_TERMINATE
    /*终止列表*/
    };
    
    
    静态 uint16_t seqNumber;
    
    #ifdef RFEASHLINKTX_异 步
    静态信标_handle txDoneSem;
    #endif //RFEASHLINKTX_异 步
    
    #ifdef RFEASHLINKTX_异 步
    空 txDoneCb (EasyLink_Status status)
    {
    if (status =EasyLink_Status_Success)
    {
    /*切换 LED1以指示 TX */
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、!PIN_getOutputValue (Board_PIN_LED1));
    }
    否则、如果(status =EasyLink_Status_Aborted)
    {
    /*切换 LED2以指示命令中止*/
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、!PIN_getOutputValue (Board_PIN_LED2));
    }
    其他
    {
    /*切换 LED1和 LED2以指示错误*/
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、!PIN_getOutputValue (Board_PIN_LED1));
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、!PIN_getOutputValue (Board_PIN_LED2));
    }
    
    Semaphore_post (txDoneSem);
    }
    #endif //RFEASINKTX_异 步
    
    
    静态空 rfEasyLinkTxFnx (UArg0、UArg arg1)
    {
    
    uint8_t txBurstSize = 0;
    
    #ifdef RFEASINKTX_异 步
    /*为异步创建一个信号量*/
    Semaphore_Params 参数;
    ERROR_Block EB;
    
    /* Init 参数*/
    Semaphore_Params_init (&params);
    ERROR_INIT (&EB);
    
    /*创建信标实例*/
    txDoneSem = Semaphore_create (0、&params、&EB);
    #endif //TX_异 步
    
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、1);
    EasyLink_init (EasyLink_Phy_Custom);
    
    
    /*如果要使用默认频率以外的频率,请使用
    *以下 API:
    EasyLink_setFrequency (868000000);
    *
    EasyLink_setFrequency (434000000);
    /*将输出功率设置为12dBm */
    EasyLink_setRfPwr (12);
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 核心代码从此处开始
    EasyLink_TxPacket txPacket ={{0}、0、0、{0}};
    /*创建具有递增序列号和随机有效载荷的数据包*/
    txPacket.PAYLOAD[0]=(uint8_t)(seqNumber >> 8);
    txPacket.PAYLOAD[1]=(uint8_t)(seqNumber++);
    uint8_t i;
    txPacket.len = RFEASINKTXPAYLOAD_LENGTH;
    txPacket.dstAddr[0]= 0xAA;
    
    while (1){
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// EMR_STOP 按钮
    CPUdelay ((uint32_t)((48000000/3)*0.050f));
    
    if (PIN_getInputValue (PIN_ID (29))=0)
    {
    CPUdelay (uint32_t)((48000000/3 *0.050f));//////////////////////////////////////////////////////////////////////////////////////////////////// 进行去抖
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、1);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、0);
    对于(I = 2;I < RFEASINKTXPAYLOAD_LENGTH;I++)
    {
    txPacket.PAYLOAD[i]= EMR;
    }
    
    // txPacket.len = RFEASINKTXPAYLOAD_LENGTH;
    // txPacket.dstAddr[0]= 0xAA;
    txPacket.absTime = EasyLink_getAbsTime ()+ EasyLink_ms_TO_RadioTime (1);
    }
    
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ON_OFF 开关
    
    否则、如果(PIN_getInputValue (PIN_ID (30))=0)
    {
    CPUdelay ((uint32_t)((48000000/3)*0.050f));////////////////////////////////////////////////////////////////////////////// 反跳逻辑
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、0);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、1);
    对于(I = 2;I < RFEASINKTXPAYLOAD_LENGTH;I++)
    {
    txPacket.PAYLOAD[i]= ONOFF;
    }
    
    
    txPacket.absTime = EasyLink_getAbsTime ()+ EasyLink_ms_TO_RadioTime (1);
    }
    
    /*添加大于500ms 的 Tx 延迟、以便中止启动并制动突发*/
    //if (txBurstSize++>= RFEASINKTX_BURST_SIZE)
    //{
    /*将 Tx 绝对时间设置为当前时间+ 1s */
    // txPacket.absTime = EasyLink_getAbsTime ()+ EasyLink_ms_TO_RadioTime (1);////////////////////// 将无线电时间从1000更改为1
    // txBurstSize = 0;
    //}
    /*否则请在100ms 内将下一个突发数据包设置为 Tx */
    //否则
    //{
    /*将 Tx 绝对时间设置为当前时间+ 100ms */
    // txPacket.absTime = EasyLink_getAbsTime ()+ EasyLink_ms_TO_RadioTime (100);
    //}
    
    EasyLink_transmit异 步(&txPacket、txDoneCb);
    /*等待300ms 以使 Tx 完成*/
    if (semaphore_pend (txDoneSem、(30000 / Clock_tickPeriod))= false)
    {
    /* TX 超时、中止*/
    if (EasyLink_abort ()=EasyLink_Status_Success)
    {
    /*
    *中止将导致调用 txDoneCb 和 txDoneSem
    *要发布、因此我们必须使用 txDoneSem
    *
    Semaphore_pend (txDoneSem、BIOS_wait_forever);
    }
    }
    PINCC26XX_setWakeup (ButtonTableWakeUp);
    /*转到 SHUTDOWN */
    
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、0);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、0);
    
    POWER_SHUTDOWN (0、0);
    }
    }
    
    void txTask_init (PIN_Handle inPinHandle){
    pinHandle = inPinHandle;
    
    Task_Params_init (&txTaskParams);
    TxTaskParams.STACKSIZE = RFEASYS LINKTX_TASK_STACK_SIZE;
    txTaskParams.priority = RFEASINKTX_TASK_priority;
    txTaskParams.stack =&txTaskStack;
    txTaskParams.arg0 =(UINT) 1000000;
    
    Task_construction (&txTask、rfEasyLinkTxFnx、&txTaskParams、NULL);
    }
    
    
    //
    *=== main ====
    */
    int main (void)
    {
    /*调用驱动程序初始化函数。 */
    Board_initGeneral();
    
    Board_shutDownExtFlash ();
    
    /*打开 LED 引脚*/
    pinHandle = PIN_OPEN (&pinState、pinTable);
    assert_isTrue (pinHandle!= NULL、NULL);
    
    
    /*清除 LED 引脚*/
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、0);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、0);
    
    txTask_init (pinHandle);
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 由 Shubhankar 添加
    // PIN_Status = PIN_registerIntCb (buttonPinHandle、&taskFxn);
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 作者:Shubhankar
    
    // main_app();
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    }
    

    我将代码移动到这里、然后移动到这里、以适合按钮操作。 此外、正如您之前建议的那样、我将这两个按钮用作 IRQ_negedge。 您的代码仅发送一个数据包、因此我将整个数据放入 while (1)中

    但是、在我的代码中、当按下两个按钮中的任何一个时、数据包不再发送。 请在这里帮助我!

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

    e2e.ti.com/.../0383.rfEasyLinkTx.cI对此进行了详细介绍,从关断状态执行两个按钮有点棘手,因为芯片在从关断状态唤醒后从 main()的第一行启动代码。 我唯一要工作的方法是在代码中尽快对 IOS 进行采样。 在这里、我以中间的延迟对输入进行了10次采样、以检查输入是否仍然被按下。  

    代码不可靠、因为如果按太长时间、代码会进入某种状态。 应添加一些错误处理。   

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

    您好、ter

    非常感谢您提供的代码。 但是、它根本没有将数据包发送到接收器。 只需按一下按钮->发送数据包->关机模式,您能帮我解决吗? 只需使用一个按钮即可。 我稍后将介绍这两个按钮。

    我昨天还想将 rfEasyLinkTx 导入到 pinShutdown 项目中并尝试使用该应用。 "iswakingfromShutdown"部分可以包括 EasyLink 传输的数据包。 我可以消除以某种方式将控制器关断的情况。 但我遇到了很多错误。

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

    你(们)好

    我再次检查了您说过的代码、并为我将在应用中使用的外部按钮(而不是 LaunchPad 按钮)添加了代码

    但是、问题在于即使在按下按钮后、代码也不会进入 IF 循环、因此它不会传输数据包。 也不调用 power_shutdown API。 但是、我在去抖逻辑中实现了延迟、运气不好。 不会进入循环

    在下面附上我的代码段。

    if (PIN_getInputValue (EMR_STOP)=0)
    {
    CPUdelay ((uint32_t)((48000000/3)*0.050f));
    EasyLink_transmit异 步(&txPacket、txDoneCb);
    
    
    /*等待300ms 以使 Tx 完成*/
    if (semaphore_pend (txDoneSem、(30000 / Clock_tickPeriod))= false)
    {
    /* TX 超时、中止*/
    if (EasyLink_abort ()=EasyLink_Status_Success)
    {
    /*
    *中止将导致调用 txDoneCb 和 txDoneSem
    *要发布、因此我们必须使用 txDoneSem
    *
    Semaphore_pend (txDoneSem、BIOS_wait_forever);
    }
    }
    /*转到 SHUTDOWN */
    
    PIN_setOutputValue (pinHandle、Board_PIN_LED1、0);
    PIN_setOutputValue (pinHandle、Board_PIN_LED2、0);
    
    POWER_SHUTDOWN (0、0);
    
    } 


    此外、代码必须重复运行、即控制器应处于关断状态、并等待下一个按钮点击。