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.

CC2640R2F采集数据传感器

Other Parts Discussed in Thread: CC2640R2F
您好!我在使用贵公司的CC2640R2F时遇到如下问题:
使用IO中断读取传感器数据,会导致丢包现象严重,基本读不到数据。在使用timer定时器的输入捕获时可以正确读取数据,但是会导致功耗较高,CPU一直处于唤醒状态。通过测量同行产品的功耗,同行设备在保证数据正确读取的情况下CPU一直处于standby模式。请问还有哪种方式可以实现standby模式下实现传感器的读取?或者timer定时器输入捕获要怎么进行优化?目前我们是每500ms对外发送一包数据。传感器通信协议见附件。量表通讯口协议.doc
  • standby模式下只有RTC开启,只能使用XOSC_LF ,其他定时器都无法使用。用RTC做捕获实现起来比其他timer难一些,参考下这边的例程:e2e.ti.com/.../654174
  • 您好,刚刚的例程我看了一下,这是利用GPIO中断来实现?我之前有尝试过使用GPIO中断+sysclk定时器来实现这个读传感器功能,但是在仿真的过程中,我很难完成正确的读数
  • 如果希望在stanby模式下使用定时器,目前只有这样。“我很难完成正确的读数” 能否具体描述?
  • 我是这样实现的,开启sysclk计时器为20ms,每20ms计数器加1。然后在GPIO中断函数中通过判断计数器的数值来确定两个中断之间的时间(粗略计算即可,只要保证两个中断的时间间隔在100ms以内,则认为是同一包数据,否则为两包数据,当前中断信号为新数据的起始位),最后发现在读取过程中存在丢数的问题,即很难完成连续28次的读取数据
  • 首先,用sysclk是做不了低功耗的。
    sensor在准备好数据后一般都会通过触发信号的pin 发送一个信号给cpu,cpu接收到该信号后 进行数据的采集处理。所以方案一般都是外部触发中断的方式。没有数据 sensor就不触发cpu cpu就可以休眠。从而实现低功耗

    外部中断触发是可以实现数据的完整采集的 基于spi or i2c 等接口的sensor 数据量不会大到无法采集完整的地步。还是要从程序设计上找原因。
  • 可以考慮用sensor controller
  • 您好,如果我要使用sensor controller的话,我要使用哪几个资源?目前当前的协议好像不符合i2c或spi的通信
  • 你传感器是什麼?有沒有datasheet?
  • 2068.量表通讯口协议.doc我在问题里已经提交了通信协议。在这里我再重新提交一份吧

  • 你的文件我打開都是亂碼

  • 0020.量表通讯口协议.doc不好意思,您试试看这个,应该是可以正常打开的

  • 建議使用sensor controller去讀取GPI的訊號

  • 请问sensor controller要使用哪些资源?我没有找到呢
  • Sensor controller GPIO 可以參考

    Timer 參考

  • 好的,非常感谢,我先尝试一下,如果遇到问题再向您请教。
  • 您好,我上午参考您给的链接尝试实现读取数据的功能,但是无法使用timer1GetValue()函数,而且报错挺多的,麻烦您帮忙看一下。相关配置及代码在压缩包。8054.CC2640R2F读取数据.7z

  • 1. 目前的sensor controller沒有支持timer1GetValue這個API

    2. 程序裡面的

    }
    else{

    都要改成

    }else{

    3. 程序裡面的 "if(eeeclknum ==0)" 要去掉==前面的空白

    4. 程序裡面的 "eeeclknum ++;"要改用"eeeclknum=eeeclknum+1;"

  • 如果不支持timer1GetValue這個API的话,我怎么判断两个高脉冲的时间间隔呢?
  • 這個我目前沒有答案,我開了個issue在e2e.ti.com/.../967430 , 看看TI的AE怎麼回應
  • 您好,我尝试使用RTC+GPIO中断来实现数据采集,您看下我下面使用的rtc时钟对吗?另外就是我想问一下AONRTCCaptureValueCh1Get()函数单位是秒吗?低16位代表的是毫秒(即1s均分为655535)?

    gpio.c
    //GPIO�궨��
    #define	DATA_GPIO        IOID_26
    #define CLK_GPIO         IOID_27
    
    //GPIO���ù���
    PIN_Config GPIOConfig[] = {
        DATA_GPIO | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLDOWN,
        CLK_GPIO | PIN_GPIO_OUTPUT_DIS| PIN_INPUT_EN | PIN_PULLUP, 
        PIN_TERMINATE
    };
    
    //��������
    static PIN_State    GPIOPinState;
    static PIN_Handle   hGPIOPinsHandle;
    
    static u8 ClkNum = 0;       //CLK�жϼ�����
    
    //�ڲ����ú���
    static void CLK_GPIOIsrCallback(PIN_Handle handle, PIN_Id pinId);
    
    //------------------------------------------------------------------------------
    //����    ����	void GPIO_Init(void)
    //����    ����	λ�Ƽ�GPIO��RTCʱ�ӳ�ʼ��
    //����ڲ�����	��
    //�����ز�����	��
    //��˵    ����	��
    //------------------------------------------------------------------------------
    void GPIO_Init(void)
    {
        BleSDKManagerInfo_t err;               // ״̬����      
        err = DriverIOOpen(&hGPIOPinsHandle,&GPIOPinState,(const PIN_Config *)GPIOConfig);  //����IO����
        
        if(err != MANAGER_INFO_REQUEST_IO_SUCCESS){                                //һ��IO��򿪳ɹ� �����������û��IO  
            return;
        }  
      
        err = DriverIORegisterIntCallBack(&hGPIOPinsHandle,CLK_GPIOIsrCallback);      //ע��һ��io�жϻص�����    
        if(err != MANAGER_INFO_CONTROL_IO_SUCCESS){       
            return;
        }
        
        err = DriverIOSetConfig(&hGPIOPinsHandle,PIN_BM_IRQ,CLK_GPIO | PIN_IRQ_NEGEDGE);//����CLK_GPIO���жϹ���    
        if(err != MANAGER_INFO_CONTROL_IO_SUCCESS){
            return;
        }
        
    #ifdef POWER_SAVING                                                         //���ϵͳ������ʡ�繦�� ����ҪΪ��io���û��ѹ���(��ʹ��߱���˯��״̬ͨ���жϻ���mcu�Ĺ���)
        err = DriverIOSetConfig(&hGPIOPinsHandle,PINCC26XX_BM_WAKEUP,CLK_GPIO | PINCC26XX_WAKEUP_NEGEDGE);//����CLK_GPIO���жϻ��ѹ���
        
        if(err != MANAGER_INFO_CONTROL_IO_SUCCESS){    
            return;
        }
    #endif
        
        AONRTCChannelDisable(AON_RTC_CH1);
        AONRTCModeCh1Set(AON_RTC_MODE_CH1_CAPTURE);
        AONEventRtcSet(AON_EVENT_IO);
        AONRTCChannelEnable(AON_RTC_CH1);
    }
    
    
    //------------------------------------------------------------------------------
    //����    ����  CLK_GPIOIsrCallback(PIN_Handle handle, PIN_Id pinId)
    //����    ����  io�жϻص�����
    //����ڲ�����  ��
    //�����ز�����  ��
    //��˵    ����  ��
    //------------------------------------------------------------------------------
    static void CLK_GPIOIsrCallback(PIN_Handle handle, PIN_Id pinId)
    {
        static u32 uiDataTemp = 0;    
        static u32 CLKedgeTimingCurrectValue[2] = {0};  
        u32 edgeTimingCurrectValue = 0;
        
        g_uiShutDownClk = 0;    //shutdownģʽ��ʱ������
          
        if(ClkNum == 0){
    //        CLKedgeTimingCurrectValue[0] = AONRTCCurrentCompareValueGet();
            CLKedgeTimingCurrectValue[0] = AONRTCCaptureValueCh1Get();
            AONRTCEventClear(AON_RTC_CH1);
        }
        else{
    //        CLKedgeTimingCurrectValue[1] = AONRTCCurrentCompareValueGet();
            CLKedgeTimingCurrectValue[1] = AONRTCCaptureValueCh1Get();
            AONRTCEventClear(AON_RTC_CH1);
            if(CLKedgeTimingCurrectValue[1] >= CLKedgeTimingCurrectValue[0])
                edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] - CLKedgeTimingCurrectValue[0];
            else
                edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] + (0xFFFFFFFF - CLKedgeTimingCurrectValue[0]);
            CLKedgeTimingCurrectValue[0] = CLKedgeTimingCurrectValue[1];
            if(edgeTimingCurrectValue > 328){ //����5ms��5ms *(1000 / 65535)
                ClkNum = 0;
                uiDataTemp = 0;
            }
        }
        if(1 == DriverIOGetInputValue(DATA_GPIO))   //��ȡIO��ƽ
            uiDataTemp = uiDataTemp + (1 << ClkNum);
            
        ClkNum += 1;
        if(ClkNum >= 28){	//���ݶ�ȡ���
            ClkNum = 0;
            g_uiData = uiDataTemp;
            g_cDataFinsh = 1;
        }
    }
    

  • 低16位代表
    - 0x0000 = 0.0 sec
    - 0x4000 = 0.25 sec
    - 0x8000 = 0.5 sec
    - 0xC000 = 0.75 sec
  • 您好,我在使用过程中发现:将断点打在if(ClkNum >= 28){}代码里面的ClkNum = 0;位置,程序是进不去的,一直进if(edgeTimingCurrectValue > 0x1000){}这个函数。进一步调试,将断点打在if(edgeTimingCurrectValue > 0x1000)处,edgeTimingCurrectValue的值很小,但是如果将断点打在if(edgeTimingCurrectValue > 0x1000)()函数里面的 ClkNum = 0处,edgeTimingCurrectValue值又会很大。请问是怎么回事?下面是中断处理函数的部分代码,具体整个文件的配置代码见文件

    6646.gpio.c
    //GPIO�궨��
    #define	DATA_GPIO        IOID_26
    #define CLK_GPIO         IOID_27
    
    //GPIO���ù���
    PIN_Config GPIOConfig[] = {
        DATA_GPIO | PIN_GPIO_OUTPUT_DIS | PIN_INPUT_EN | PIN_PULLDOWN,
        CLK_GPIO | PIN_GPIO_OUTPUT_DIS| PIN_INPUT_EN | PIN_PULLUP, 
        PIN_TERMINATE
    };
    
    //��������
    static PIN_State    GPIOPinState;
    static PIN_Handle   hGPIOPinsHandle;
    
    static u8 ClkNum = 0;       //CLK�жϼ�����
    
    //�ڲ����ú���
    static void CLK_GPIOIsrCallback(PIN_Handle handle, PIN_Id pinId);
    
    //------------------------------------------------------------------------------
    //����    ����	void GPIO_Init(void)
    //����    ����	λ�Ƽ�GPIO��RTCʱ�ӳ�ʼ��
    //����ڲ�����	��
    //�����ز�����	��
    //��˵    ����	��
    //------------------------------------------------------------------------------
    void GPIO_Init(void)
    {
        BleSDKManagerInfo_t err;               // ״̬����      
        err = DriverIOOpen(&hGPIOPinsHandle,&GPIOPinState,(const PIN_Config *)GPIOConfig);  //����IO����
        
        if(err != MANAGER_INFO_REQUEST_IO_SUCCESS){                                //һ��IO��򿪳ɹ� �����������û��IO  
            return;
        }  
      
        err = DriverIORegisterIntCallBack(&hGPIOPinsHandle,CLK_GPIOIsrCallback);      //ע��һ��io�жϻص�����    
        if(err != MANAGER_INFO_CONTROL_IO_SUCCESS){       
            return;
        }
        
        err = DriverIOSetConfig(&hGPIOPinsHandle,PIN_BM_IRQ,CLK_GPIO | PIN_IRQ_NEGEDGE);//����CLK_GPIO���жϹ���    
        if(err != MANAGER_INFO_CONTROL_IO_SUCCESS){
            return;
        }
        
    #ifdef POWER_SAVING                                                         //���ϵͳ������ʡ�繦�� ����ҪΪ��io���û��ѹ���(��ʹ��߱���˯��״̬ͨ���жϻ���mcu�Ĺ���)
        err = DriverIOSetConfig(&hGPIOPinsHandle,PINCC26XX_BM_WAKEUP,CLK_GPIO | PINCC26XX_WAKEUP_NEGEDGE);//����CLK_GPIO���жϻ��ѹ���
        
        if(err != MANAGER_INFO_CONTROL_IO_SUCCESS){    
            return;
        }
    #endif
        
        AONRTCChannelDisable(AON_RTC_CH1);
        AONRTCModeCh1Set(AON_RTC_MODE_CH1_CAPTURE);
        AONEventRtcSet(AON_EVENT_IO);
        AONRTCChannelEnable(AON_RTC_CH1);
    }
    
    
    //------------------------------------------------------------------------------
    //����    ����  CLK_GPIOIsrCallback(PIN_Handle handle, PIN_Id pinId)
    //����    ����  io�жϻص�����
    //����ڲ�����  ��
    //�����ز�����  ��
    //��˵    ����  ��
    //------------------------------------------------------------------------------
    static void CLK_GPIOIsrCallback(PIN_Handle handle, PIN_Id pinId)
    {
        static u32 uiDataTemp = 0;    
        static u32 CLKedgeTimingCurrectValue[2] = {0};  
        u32 edgeTimingCurrectValue = 0;
        
        g_uiShutDownClk = 0;    //shutdownģʽ��ʱ������
          
        if(ClkNum == 0){
    //        CLKedgeTimingCurrectValue[0] = AONRTCCurrentCompareValueGet();
            CLKedgeTimingCurrectValue[0] = AONRTCCaptureValueCh1Get();
            AONRTCEventClear(AON_RTC_CH1);
        }
        else{
    //        CLKedgeTimingCurrectValue[1] = AONRTCCurrentCompareValueGet();
            CLKedgeTimingCurrectValue[1] = AONRTCCaptureValueCh1Get();
            AONRTCEventClear(AON_RTC_CH1);
            if(CLKedgeTimingCurrectValue[1] >= CLKedgeTimingCurrectValue[0])
                edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] - CLKedgeTimingCurrectValue[0];
            else
                edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] + (0xFFFFFFFF - CLKedgeTimingCurrectValue[0]);
            CLKedgeTimingCurrectValue[0] = CLKedgeTimingCurrectValue[1];
            if(edgeTimingCurrectValue > 328){ //����5ms��5ms *(1000 / 65535)
                ClkNum = 0;
                uiDataTemp = 0;
            }
        }
        if(1 == DriverIOGetInputValue(DATA_GPIO))   //��ȡIO��ƽ
            uiDataTemp = uiDataTemp + (1 << ClkNum);
            
        ClkNum += 1;
        if(ClkNum >= 28){	//���ݶ�ȡ���
            ClkNum = 0;
            g_uiData = uiDataTemp;
            g_cDataFinsh = 1;
        }
    }
    

    CLKedgeTimingCurrCLKedgeTimingCurrectValue[1] = AONRTCCaptureValueCh1Get();

    AONRTCEventClear(AON_RTC_CH1);

    if(CLKedgeTimingCurrectValue[1] >= CLKedgeTimingCurrectValue[0])

               edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] - CLKedgeTimingCurrectValue[0];

    else

              edgeTimingCurrectValue = CLKedgeTimingCurrectValue[1] +(0xFFFFFFFF - CLKedgeTimingCurrectValue[0]);

    if(edgeTimingCurrectValue > 0x1000){ //大约62ms

               ClkNum = 0;

               uiDataTemp = 0;

    }

    CLKedgeTimingCurrectValue[0] - CLKedgeTimingCurrectValue[1];

    ClkNum += 1;

    if(ClkNum >= 28){

         ClkNum = 0;

        .....

    }

  • 如果我想使用GPIO中断+RTC计时的话,请问我怎么能获得us级别的时间呢?
  • 可以使用 Clock_getTicks,但最小單位是10us,可以參考一下 sunmaysky.blogspot.com/.../how-to-detect-buttont-hold-in-cc26x2.html
  • 您好,您发的链接我无法访问,请您确认一下链接是否正确
  • 試試用vpn去打開連結