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.

[参考译文] SIMPLELINK-CC13X0-SDK:SIMPLELINK-CC13X0-SDK

Guru**** 2540720 points
Other Parts Discussed in Thread: TMP116, CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/680465/simplelink-cc13x0-sdk-simplelink-cc13x0-sdk

器件型号:SIMPLELINK-CC13X0-SDK
主题中讨论的其他器件:TMP116SYSBIOSCC1310

我在使用具有3V 的 CC1310F64 4x4mm 类型芯片时遇到了射频通信问题,该芯片与连接,在该芯片上开发并加载的代码与传感器一起工作(存在 SDA 和 SCL 信号),但 emmersion 射频不工作, 对于接收、我使用 Smart RFstudio 7 -请参阅随附的代码 n°1。

在插入 i2c 量表和 TMP 116之前、射频工作正常并发送数据-请参阅随附的代码#2。

提前感谢您的帮助。

e2e.ti.com/.../4062.TMP116_2D00_i2c_2D00_CC1310F64_2D00_4X4mm_2D00_1.txt

e2e.ti.com/.../7776.TMP116_2D00_I2C_2D00_CC1310F64_2D00_4x4mm_2D00_2.txt

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

    我看到您在回调函数中初始化 I2C 和 TMP116。 请注意、回调函数应轻量级、最好用于设置标志或发布信标。 回调中的繁重处理将导致意外行为(如您看到的行为)。 此外、您认为调用此回调函数的频率如何? 如果不止一次、您将多次调用所有初始化代码。

    请将初始化代码移出回调。 还应考虑创建一个单独的任务并布置该任务以在回调中进行处理、而不是在回调中进行所有处理。

    您可能还需要考虑参加 TIRTOS 培训讲座 training.ti.com/ti-rtos-workshop-series

    此致、
    Prashanth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢你的答复
    您能告诉我如何操作,请?,我尝试了,但我无法传输。 提前感谢您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Abdelkader、

    这是一个大学项目吗? 我们建议您尝试将其视为一种学习体验。 请浏览 TI RTOS 培训材料。

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

    感谢您的回答和建议、

    是的、我是一名学生。

    我尝试找到解决此问题的方法、但我尚未到达、无法通过射频传输温度数据。

    实际上、我移动了传感器初始化参数、但当我添加温度的读取部分时、射频不起作用。 携带时,我测试了通过射频发送探测参数,包括地址 MAC、电池状态....

    此外、我测试了微控制器和 tmp116传感器之间的通信、有一个 i2c 通信(SDA、SCL)。

    请参阅随附的代码。

    e2e.ti.com/.../Sonde29042018.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Abdelkader、
    我从代码中看到您正在回调函数中构建 Tx 任务。 这是不可取的。 回调函数应被视为 ISR 例程、具有极小的处理能力、例如设置标志或发布信标。 是否可以将 task_construct_out 移出回调并重试。 此外、在 rfEasyLinkTxFnx 中添加一个信标、并在回调 sendorTask_AlertCB 中发布该信标。
    此致、
    Prashanth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../Sonde08052018.zipThank您的回复;

    我在我的定制 PCB 上测试了射频部件、该部件也适用于温度传感器的部件、但在集成这两个代码时、我在访问名为 temp 的全局变量时遇到了问题、后者由线程修改并由任务读取。 如以下代码所示:

    ------------------------------------------------------------------ 代码------------------

    /*

    * ==== rfEasyLinkTx.c ===

    *

    /* XDCtools 头文件*/

    /* POSIX 头文件*/

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    /* BIOS 头文件*/

    #include

    #include

    #include

    #include

    #include

    #include

    /* TI-RTOS 头文件*/

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    /*板头文件*/

    #include "Board.h"

    /* EasyLink API 头文件*/

    #include "EasyLink/EasyLink.h"

    #include "sc/scif.h"

    #include "version.h"

    #include "../sonde_gw_FW/sys_intf.h"

    #include

    #include

    #define RFEASINKTX_TASK_STACK_SIZE  1024

    #define RFEASINKTX_TASK_PRIORITY   2.

    #define RFEASINKTX_BURST_SIZE     1

    /*以字节为单位的栈大小*/

    //#define THREADSTACKSIZE  768

    Task_Structt txTask;//不是静态的,因此可以在 ROV 中看到*/

    静态 Task_Params txTaskParams;

    静态 uint8_t txTaskStack[RFEASINKTX_TASK_STACK_SIZE];

    Task_StructsensorTask;//不是静态的,因此可以在 ROV 中看到*/

    静态 Task_Params sensorTaskParams;

    静态 uint8_t sensorTaskStack[RFEASINKTX_TASK_STACK_SIZE];

    #define SAMPLE_TIME  1/*    以秒为单位*/

    #define THREADSTACKSIZE  768

    #define TMP_TASK_STACK_SIZE 768

    TMP116_handle tmp116Handle =空;

    I2C_Handle  i2cHandle  = NULL;

    SEM_t tmp116Sem;

    sem t datatmp;

    浮点温度;

    int16_t datatosend;

    volatile uint16_t sampleTime;

    静态 PIN_STATE 引脚状态;

    静态 PIN_Handle PIN_Handle;

    typedef 结构{

      uint8_t  原因;

      int16_t   temp_deg_FRAC_8;

      uint8_t  bat_20mV;

    } opto_sonde_data_t;

    //const int OPTOSONDE_BARD_TEMP_SENSOR_THRESHOLD = 1500 * 1000;// 1.5V

    //#define OPTOSONDE_DEMO_MODE 1.

    PIN_Config pinTable[]={

      PIN_ID (8)| PIN_INPUT_EN | PIN_PULLUP | PIN_迟滞、

      PIN_TERMINATE

    };

    /******* I2***** /

    void tmp116Callback (uint_least8_t 索引)

      SEM_post (&tmp116Sem);

    void *tmp116AlertTask (void *Arga)

      uint16_t 数据;

      while (1){

        /*在信标上挂起、tmp116Sem */

        if (0 =SEM_WAIT (&tmp116Sem)){

          /*读取状态寄存器、复位 ALERT 引脚*/

          TMP116_readStatus (tmp116Handle、&data);

          /*检查物体温度高标志*/

          IF (DATA & TMP116_STAT_ALR_HI){

          }

          /*检查物体温度低标志*/

          IF (DATA & TMP116_STAT_ALR_LO){

          }

        }

      }

    /******* /

    void sleepAndReset (uint32_t sleep_time_s){

      //启用按钮中断唤醒

      PIN_setInterrupt (PIN_Handle、PIN_ID (8)| PIN_IRQ_NEGEDGE);

      uint32_t s = sleep_time_s;

      while (秒> 0)

      {

        uint32_t SLEEP_s =秒> 2000? 2000:秒;

        Task_sleep ((sleep_s * 1000u * 1000)/ Clock_tickPeriod);

        secs --sleep_s;

      }

      SysCtrlSystemReset();

    静态空 rfEasyLinkTxFnx (UArg0、UArgarg1)

      opto_sonde_data_t* optosonde_data =(opto_sonde_data_t*) arg0;

      EasyLink_init (EasyLink_Phy_Custom);

      /*

      *如果您希望使用默认频率以外的频率、请使用

      *以下 API:

      * EasyLink_setFrequency (868000000);

      *

      /*将输出功率设置为12dBm */

    //  EasyLink_setRfPwr (12);

      EasyLink_setRfPwr (10);

      EasyLink_TxPacket txPacket;

      //填充数据包数据

      uint8_t PAYLOAD_ptr = 0;

      //有效载荷版本

      txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(0x0);

      // src MAC

      EasyLink_getIeeAddr (&txPackage.PAYLOAD[PAYLOAD_PTR]);

      PAYLOAD_PTR += 8;

      //复制数据

      txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->原因);

      txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->temp_deg_FRAC_8 >> 8);

      txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->temp_deg_FRAC_8);

      txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->bat_20mV);

      //固件版本

      memcpy (&txPacket.PAYLOAD[PAYLOAD_PTR]、&version_hash、sizeof (version_hash));

      PAYLOAD_PTR += sizeof (version_hash);

      txPacket.len = PAYLOAD_PTR;

      txPacket.absTime = 0;

      txPacket.dstAddr[0]= OPTOSONDE_ADDR;

      EasyLink_Status 结果= EasyLink_transmit (&txPacket);

      if (结果=EasyLink_Status_Success)

      {

        /*切换 LED1以指示 TX */

    //           PIN_setOutputValue (pinHandle、Board_PIN_LED1、!PIN_getOutputValue (Board_PIN_LED1));

      }

      其他

      {

        /*切换 LED1和 LED2以指示错误*/

    //           PIN_setOutputValue (pinHandle、Board_PIN_LED1、!PIN_getOutputValue (Board_PIN_LED1));

    //           PIN_setOutputValue (pinHandle、Board_PIN_LED2、!PIN_getOutputValue (Board_PIN_LED2));

      }

      //防止按钮重置过载

      if (optosonde_data->reason = optosonde_reason_button){

        Task_sleep (1000000 / Clock_tickPeriod);

      }

      //将 RTC 设置为休眠状态

    #ifdef OPTOSONDE_DEMO_MODE

      uint32_t SLEEP_TIME_s = 30;

    #Elif OPTOSONDE_VITICODE

      uint32_t SLEEP_TIME_s = 10 * 60;

    其他

      uint32_t SLEEP_TIME_s = 1 * 60;

    #endif

      sleepAndReset (SLEEP_TIME_s);

    void * mainThread (void * Arga)

      I2C_Handle   i2cHandle;

      I2C_Params   i2cParams;

      内部       REC;

      pthread_t alertTask;

      pthread_attr_t   pAttrs;

      sampleTime = sample_time;

      TMP116_Params tmp116Params;

      /*调用驱动程序初始化函数*/

      //GPIO_init();

      I2C_init();

      TMP116_init();

      /*创建 I2C 以供使用*/

      I2C_Params_init (&i2cParams);

      i2cParams.bitrate = I2C_400kHz;

      i2cHandle = I2C_open (Board_I2C_TMP、&i2cParams);

      if (i2cHandle == NULL){

        while (1);

      }

      否则{

      }

      if (0!= SEM_INIT (&tmp116Sem、0、0))

      {

        /* SEM_INIT()失败*/

        while (1);

      }

      pthread_attr_init (&pAttrs);

      pthread_attr_setstacksize (&pAttrs、TMP_task_stack_size);

      retc = pthread_create (alertTask、&pAttrs、tmp116AlertTask、NULL);

      如果(retc!= 0){

        /* pthread_create()失败*/

        while (1);

      }

      /*将 tmp116Params 结构初始化为默认值*/

      TMP116_Params_init (&tmp116Params);

      /*警报事件回叫*/

      tmp116Params.callback = tmp116Callback (&T);

      /*使用自定义参数打开 TMP116传感器*/

      tmp116Handle = TMP116_open (Board_TMP007_ROOMTEMP、i2cHandle、&tmp116Params);

      /*检查打开是否成功*/

      if (tmp116Handle == NULL){

       while (1);

      }

      /*允许传感器硬件完成其第一次转换*/

      睡眠(2);

      /*获取摄氏温度*

      if (!TMP116_getTemp (tmp116Handle、TMP116_Celsius、&temp)){

        //Display_print0 (display、0、0、"TMP116 sensor read failed");

      }

      /*开始无限任务循环*/

      while (1){

        if (0=sem 等待(&datatmp)){

          }

        if (!TMP116_getTemp (tmp116Handle、TMP116_Celsius、&temp)){

        }

          datatosend =(uint16_t)(temp *100);

          SEM_post (&datatmp);

        睡眠(sampleTime);

      }

    void maini2C (void)

     pthread_t      线程;

     pthread_attr_t   pAttrs;

     struct sched_param primParam;

     内部         REC;

     内部         detachState;

      /*调用驱动程序初始化函数*/

      /*设置优先级和堆栈大小属性*/

      pthread_attr_init (&pAttrs);

      priParam.sched_priority = 1;

      detachState = pthread_create_detached;

      retc = pthread_attr_setdetachstate (&pAttrs、detachState);

      如果(retc!= 0){

        /* pthread_attr_setdetachstate()失败*/

       while (1);

      }

      pthread_attr_setschedparam (&pAttrs、&priParam);

     retc |= pthread_attr_setstacksize (&pAttrs、THREADSTACKSIZE);

     如果(retc!= 0){

        /* pthread_attr_setstacksize()失败*/

       while (1);

      }

     retc = pthread_create (&thread、&pAttrs、mainThread、NULL);

     如果(retc!= 0){

        /* pthread_create()失败*/

       while (1);

      }

      /*销毁 pthread 属性*/   

      pthread_attr_destroy (&pAttrs);

      BIOS_start();

    void sendorTask_AlertCB()

      static opto_sonde_data_t optosonde_data;

       /*清除警报中断源*/

      scifClearAlertIntSource();

      if (scifGetAlertEvents ()&(1 << SCIF_ADCMEAS_TASK_ID)){

        optosonde_data.reason = optosonde_reason_periodic;

        if (0!=SEM_WAIT (&datatmp)){

        }

        optosonde_data.temp_deg_FRAC_8 =(int16_t)(temp *100);

        SEM_post (&datatmp);

        while (!AONBatMonNewBatteryMeasureReady())

        {

          //等待

          Task_sleep (100 * 100 / Clock_tickPeriod);

        }

        optosonde_data.bat_20mV =(AONBatMonBatteryVoltageGet ()* 390625)/ 2000000;

        AONBatMonDisable();

        if (PIN_getInputValue (IOID_8)=0){

          optosonde_data.reason = optosonde_reason_button;

        }

        // Init Tx 任务

        Task_Params_init (&txTaskParams);

        TxTaskParams.STACKSIZE = RFEASYS LINKTX_TASK_STACK_SIZE;

        txTaskParams.priority = RFEASINKTX_TASK_priority + 1;

        txTaskParams.stack =&txTaskStack;

        txTaskParams.arg0 =(XDC_UArg) optosonde_data (&O);

        Task_construction (&txTask、rfEasyLinkTxFnx、&txTaskParams、NULL);

        }

      其他

      {

        //传感器失败

        压摆与复位(10 * 60);

      }

      /*确认警报事件*/

      scifAckAlertEvents ();

      scifUninit();

    void sensorTask_fn (UArg0、UArgarg1)

      AONBatMonEnable();

      scifOsalInit();

      scifOsalRegisterTaskAlertCallback (sendorTask_AlertCB);

      scifInit (&scifDriverSetup);

      scifExecuteTasksOnceNbl (1 << SCIF_ADCMEAS_TASK_ID);

    void pinint (PIN_Handle handle、PIN_ID pinId){

      if (pinId = 8){

        //强制复位以触发测量和 TX

        SysCtrlSystemReset();

      }

    /*

    * ==== main ====

    *

    int opto_main (void)

      /*调用驱动程序初始化函数。 *

      //datatemp.Data=0.0;

     // datatemp.acces=true;

      Board_initGeneral();

      PIN_Handle = PIN_OPEN (&pinState、pinTable);

      PIN_registerIntCb (PIN_Handle、PinInt);

      if (0!=SEM_INIT (&datatmp、0、0)){

        while (1);

      }

      //传感器任务

      Task_Params_init (&sensorTaskParams);

      TxTaskParams.STACKSIZE = RFEASYS LINKTX_TASK_STACK_SIZE;

      txTaskParams.priority = RFEASINKTX_TASK_priority;

      txTaskParams.stack = sensorTaskStack;

      txTaskParams.arg0 = 0;

      txTaskParams.arg1 = 0;

      Task_construction (&sensorTask、sensorTask_fn、&sensorTaskParams、NULL);

      maini2C();

      /*启动 BIOS */

      返回(0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否提供模式详细信息、说明"在访问可变温度时遇到问题"的含义? 从 float 转换为 int16_t 时是否遇到问题?
    此致、
    Prashanth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../ProbeI2C07052018S.zipThank您的回复、

    我能够读取寄存器中的温度值、如下图所示、但通过射频发送该值时不起作用。

    这是射频器件中的温度:

    optosonde_data.temp_deg_FRAC_8 =(int16_t)(temp * 100)

    RF 不能发送温度值、而发送其它参数时没有任何问题、如地址 MAC、电池状态、目的地址。

    知道射频部件和传感器在我的定制 PCB 上单独运行良好(CC1310、4x4mm、与带有 i2c 的 TMP 116连接)。

    感谢您花时间查看代码以找到我的问题的解决方案、请。

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

    我看到您使用的是 sendorTask_AlertCB()中静态变量中作为任务参数参数传递的数据。 能否在 rfEasyLinkTxFnx 中设置复制 txpacket.payload 的断点,并检查 optosonde_data->temp_deg_FRAC_8是否确实包含正确的数据。 我对 sendorTask_AlertCB 中 optosonde_data 的静态声明有点怀疑、其范围仅限于该函数。 我不确定将有限范围变量的地址传递给 rfEasyLinkTxFnx ()会保持这些值不变。 请告诉我们。 作为变通方法、您可以将 optosonde_data 声明为全局变量并首先尝试。

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

    大家好、感谢您的回复、

    我被声明为 optosonde_data 全局变量

    以下是调试的结果:

    此外、我的问题是变量 temp 在上下文中受线程保护?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、我认为 temp_deg_FRAC_8=0
    感谢您的请求
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    执行此行后、您会在" optosonde_data.temp_deg_FRAC_8"中看到什么?

    optosonde_data.temp_deg_FRAC_8 =(int16_t)(temp *100);

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

    感谢您的支持、

    optosonde_data.temp_deg_FRAC_8的值= 0

    温度值为24.666   

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

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

    /*
    *==== rfEasyLinkTx.c ===
    *
    /* XDCtools 头文件*/

    /* POSIX 头文件*/
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include


    /* BIOS 头文件*/
    #include
    #include
    #include
    #include
    #include
    #include


    /* TI-RTOS 头文件*/
    #include
    #include

    #include
    #include
    #include
    #include
    #include
    #include

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

    /* EasyLink API 头文件*/
    #include "EasyLink/EasyLink.h"

    #include "sc/scif.h"

    #include "version.h"
    #include "../sonde_gw_FW/sys_intf.h"

    #include
    #include

    #define RFEASINKTX_TASK_STACK_SIZE 1024
    #define RFEASINKTX_TASK_PRIORITY 2.

    #define RFEASINKTX_BURST_SIZE 1
    #define THREADSTACKSIZE 768

    #define SAMPLE_TIME 1 /*in seconds (*秒)*/

    #define TMP_TASK_STACK_SIZE 768

    TMP116_handle tmp116Handle =空;
    I2C_Handle i2cHandle =空;

    SEM_t tmp116Sem;

    /*可从 GUI Composer App 访问的全局值*/
    浮点温度;

    /*可从 GUI Composer App 访问和设置的全局采样率*/
    volatile uint16_t sampleTime;

    /*
    *==== tmp116Callback ====
    *当 TMP116硬件上满足警报条件时、ALERT 引脚
    *被置为有效、生成中断。 此回调函数用作
    *用于单个 TMP116传感器的 ISR。
    *
    void tmp116Callback (uint_least8_t 索引)

    SEM_post (&tmp116Sem);


    /*
    *==== tmp116AlertTask ====
    *当 ALERT 引脚被置为有效时、此任务将被解除阻止并生成
    *中断。 当 TMP116处于中断模式时、必须使用状态寄存器
    *以清除 ALERT 引脚。
    *

    void *tmp116AlertTask (void *arg0)

    uint16_t 数据;

    while (1){

    /*在信标上挂起、tmp116Sem */
    if (0 =SEM_WAIT (&tmp116Sem)){

    /*读取状态寄存器、复位 ALERT 引脚*/
    TMP116_readStatus (tmp116Handle、&data);

    /*检查物体温度高标志*/
    IF (DATA & TMP116_STAT_ALR_HI){


    /*检查物体温度低标志*/
    IF (DATA & TMP116_STAT_ALR_LO){






    /*以字节为单位的栈大小*/
    //#define THREADSTACKSIZE 768

    Task_Structt txTask;//不是静态的,因此可以在 ROV 中看到*/
    静态 Task_Params txTaskParams;
    静态 uint8_t txTaskStack[RFEASINKTX_TASK_STACK_SIZE];

    Task_StructsensorTask;//不是静态的,因此可以在 ROV 中看到*/
    静态 Task_Params sensorTaskParams;
    静态 uint8_t sensorTaskStack[RFEASINKTX_TASK_STACK_SIZE];


    静态 PIN_STATE 引脚状态;
    静态 PIN_Handle PIN_Handle;


    typedef 结构{
    uint8_t 原因;
    内部16_t TEMP_DEG_FRAC_8;
    uint8_t BAT_20mV;
    } opto_sonde_data_t;

    static opto_sonde_data_t optosonde_data;

    PIN_Config pinTable[]={
    PIN_ID (8)| PIN_INPUT_EN | PIN_PULLUP | PIN_迟滞、
    PIN_TERMINATE
    };


    void sleepAndReset (uint32_t sleep_time_s){

    //启用按钮中断唤醒
    PIN_setInterrupt (PIN_Handle、PIN_ID (8)| PIN_IRQ_NEGEDGE);

    uint32_t s = sleep_time_s;
    while (秒> 0)

    uint32_t SLEEP_s =秒> 2000? 2000:秒;
    Task_sleep ((sleep_s * 1000u * 1000)/ Clock_tickPeriod);
    secs --sleep_s;


    SysCtrlSystemReset();



    静态空 rfEasyLinkTxFnx (UArg0、UArgarg1)


    opto_sonde_data_t* optosonde_data =(opto_sonde_data_t*) arg0;

    EasyLink_init (EasyLink_Phy_Custom);

    /*
    *如果您希望使用默认频率以外的频率、请使用
    *以下 API:
    * EasyLink_setFrequency (868000000);
    *

    /*将输出功率设置为12dBm */
    // EasyLink_setRfPwr (12);
    EasyLink_setRfPwr (10);

    EasyLink_TxPacket txPacket;

    //填充数据包数据
    uint8_t PAYLOAD_ptr = 0;
    //有效载荷版本
    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(0x0);
    // src MAC
    EasyLink_getIeeAddr (&txPackage.PAYLOAD[PAYLOAD_PTR]);
    PAYLOAD_PTR += 8;

    //复制数据
    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->原因);
    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->temp_deg_FRAC_8 >> 8);
    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->temp_deg_FRAC_8);

    txPacket.PAYLOAD[PAYLOAD_PTR++]=(uint8_t)(optosonde_data->bat_20mV);

    //固件版本
    memcpy (&txPacket.PAYLOAD[PAYLOAD_PTR]、&version_hash、sizeof (version_hash));
    PAYLOAD_PTR += sizeof (version_hash);

    txPacket.len = PAYLOAD_PTR;
    txPacket.absTime = 0;
    txPacket.dstAddr[0]= OPTOSONDE_ADDR;

    EasyLink_Status 结果= EasyLink_transmit (&txPacket);

    if (结果=EasyLink_Status_Success)

    /*切换 LED1以指示 TX */
    // PIN_setOutputValue (pinHandle、Board_PIN_LED1、!PIN_getOutputValue (Board_PIN_LED1));

    其他

    /*切换 LED1和 LED2以指示错误*/
    // PIN_setOutputValue (pinHandle、Board_PIN_LED1、!PIN_getOutputValue (Board_PIN_LED1));
    // PIN_setOutputValue (pinHandle、Board_PIN_LED2、!PIN_getOutputValue (Board_PIN_LED2));


    //防止按钮重置过载
    if (optosonde_data->reason = optosonde_reason_button){
    Task_sleep (1000000 / Clock_tickPeriod);


    //将 RTC 设置为休眠状态
    #ifdef OPTOSONDE_DEMO_MODE
    uint32_t SLEEP_TIME_s = 30;
    #Elif OPTOSONDE_VITICODE
    uint32_t SLEEP_TIME_s = 10 * 60;
    其他
    uint32_t SLEEP_TIME_s = 1 * 60;
    #endif

    sleepAndReset (SLEEP_TIME_s);


    void sendorTask_AlertCB()



    /*清除警报中断源*/
    scifClearAlertIntSource();

    /*仅处理定期事件警报*/
    if (scifGetAlertEvents ()&(1 << SCIF_ADCMEAS_TASK_ID))

    optosonde_data.reason = optosonde_reason_periodic;


    optosonde_data.temp_deg_FRAC_8 =(Int16_t) temp*100;


    while (!AONBatMonNewBatteryMeasureReady())

    //等待
    Task_sleep (100 * 100 / Clock_tickPeriod);

    optosonde_data.bat_20mV =(AONBatMonBatteryVoltageGet ()* 390625)/ 2000000;
    AONBatMonDisable();

    if (PIN_getInputValue (IOID_8)=0){
    optosonde_data.reason = optosonde_reason_button;


    // Init Tx 任务
    Task_Params_init (&txTaskParams);
    TxTaskParams.STACKSIZE = RFEASYS LINKTX_TASK_STACK_SIZE;
    txTaskParams.priority = RFEASINKTX_TASK_priority + 1;
    txTaskParams.stack =&txTaskStack;
    txTaskParams.arg0 =(XDC_UArg) optosonde_data (&O);

    Task_construction (&txTask、rfEasyLinkTxFnx、&txTaskParams、NULL);


    其他

    //传感器失败
    压摆与复位(10 * 60);


    /*确认警报事件*/
    scifAckAlertEvents ();
    scifUninit();


    void sensorTask_fn (UArg0、UArgarg1)

    AONBatMonEnable();

    scifOsalInit();
    scifOsalRegisterTaskAlertCallback (sendorTask_AlertCB);
    scifInit (&scifDriverSetup);
    scifExecuteTasksOnceNbl (1 << SCIF_ADCMEAS_TASK_ID);


    void pinint (PIN_Handle handle、PIN_ID pinId){
    if (pinId = 8){
    //强制复位以触发测量和 TX
    SysCtrlSystemReset();





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

    I2C_Handle i2cHandle;
    I2C_Params i2cParams;
    内部 REC;
    pthread_t alertTask;
    pthread_attr_t pAttrs;
    sampleTime = sample_time;

    TMP116_Params tmp116Params;

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


    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);

    i2cParams.bitrate = I2C_400kHz;

    i2cHandle = I2C_open (Board_I2C_TMP、&i2cParams);
    if (i2cHandle == NULL){
    while (1);

    否则{


    if (0!= SEM_INIT (&tmp116Sem、0、0))

    /* SEM_INIT()失败*/
    while (1);


    pthread_attr_init (&pAttrs);
    pthread_attr_setstacksize (&pAttrs、TMP_task_stack_size);
    retc = pthread_create (alertTask、&pAttrs、tmp116AlertTask、NULL);
    如果(retc!= 0){
    /* pthread_create()失败*/
    while (1);


    /*将 tmp116Params 结构初始化为默认值*/
    TMP116_Params_init (&tmp116Params);

    /*警报事件回叫*/
    tmp116Params.callback = tmp116Callback (&T);

    /*使用自定义参数打开 TMP116传感器*/
    tmp116Handle = TMP116_open (Board_TMP007_ROOMTEMP、i2cHandle、&tmp116Params);

    /*检查打开是否成功*/
    if (tmp116Handle == NULL){
    while (1);


    /*允许传感器硬件完成其第一次转换*/
    睡眠(2);


    /*获取摄氏温度*
    if (!TMP116_getTemp (tmp116Handle、TMP116_Celsius、&temp)){



    /*开始无限任务循环*/
    while (1){

    /*获取裸片和物体温度*/
    if (!TMP116_getTemp (tmp116Handle、TMP116_Celsius、&temp)){




    睡眠(sampleTime);



    /*
    *==== main ====
    *

    void maini2c (void)

    pthread_t 线程;
    pthread_attr_t pAttrs;
    struct sched_param primParam;
    内部 REC;
    内部 detachState;

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

    /*设置优先级和堆栈大小属性*/
    pthread_attr_init (&pAttrs);
    priParam.sched_priority = 1;

    detachState = pthread_create_detached;
    retc = pthread_attr_setdetachstate (&pAttrs、detachState);
    如果(retc!= 0){
    /* pthread_attr_setdetachstate()失败*/
    while (1);


    pthread_attr_setschedparam (&pAttrs、&priParam);

    retc |= pthread_attr_setstacksize (&pAttrs、THREADSTACKSIZE);
    如果(retc!= 0){
    /* pthread_attr_setstacksize()失败*/
    while (1);


    retc = pthread_create (&thread、&pAttrs、mainThread、NULL);
    如果(retc!= 0){
    /* pthread_create()失败*/
    while (1);


    /*销毁 pthread 属性*/
    pthread_attr_destroy (&pAttrs);

    //返回(0);




    int opto_main (void)


    /*调用驱动程序初始化函数。 *

    Board_initGeneral();
    maini2c();

    PIN_Handle = PIN_OPEN (&pinState、pinTable);
    PIN_registerIntCb (PIN_Handle、PinInt);
    //传感器任务
    Task_Params_init (&sensorTaskParams);
    TxTaskParams.STACKSIZE = RFEASYS LINKTX_TASK_STACK_SIZE;
    txTaskParams.priority = RFEASINKTX_TASK_priority;
    txTaskParams.stack = sensorTaskStack;
    txTaskParams.arg0 = 0;
    txTaskParams.arg1 = 0;

    Task_construction (&sensorTask、sensorTask_fn、&sensorTaskParams、NULL);

    /*启动 BIOS */
    BIOS_start();

    返回(0);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Abdelkader、
    您是否能够解决此问题? 您找到了什么?
    此致、
    Prashanth