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.

[参考译文] CC1101:当 CC1101首次进入 WOR 模式时、总体功耗大约为27uA。 当 CC1101从 WOR 模式唤醒后再次进入 WOR 模式时、整体功耗增加至32uA

Guru**** 2471730 points
Other Parts Discussed in Thread: CC1101

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1410003/cc1101-when-the-cc1101-enters-wor-mode-for-the-first-time-the-overall-power-consumption-is-about-27ua-when-the-cc1101-enters-wor-mode-again-after-being-awakened-from-wor-mode-the-overall-power-consumption-is-increased-to-32ua

器件型号:CC1101

工具与软件:

void CC1101_Write_Cmd_SWOR(void)
{
  //__istate_t isate = __get_interrupt_state();__disable_interrupt();
  DisableInterruptsAndSaveState();
  // Every 4 th time when going from RX or TX to IDLE automatically
  //CC1101_Write_Reg(CC1101_MCSM0, 0x38); //PO_TIMEOUT[10] :Approx. 149 – 155 μs
  CC1101_Write_Reg(CC1101_MCSM0, 0x3C);  //PO_TIMEOUT[10]: 3 (11)  256  Approx. 597 – 620 μs
  //TX1_TOGGLE;
  if (WOR_short)
  {
    //RX_timeout =tevent0 * RX_TIME = 50ms*3.125% = 1.5625ms
    CC1101_Write_Reg(CC1101_MCSM2, 0x11);        // 0x10 50ms*3.125% = 1.5625ms
    //sl_p = (uint32_t)(50 * 26000 / 750);       //0x06C5
    CC1101_Write_Reg(CC1101_WOREVT1, 0x06);      // Event0高8位  50ms
    CC1101_Write_Reg(CC1101_WOREVT0, 0xC5);      // Event0低8位
  }
  else
  {
    CC1101_Write_Reg(CC1101_MCSM2, 0x16);        // 1000ms*0.195%=1.95ms
    CC1101_Write_Reg(CC1101_WOREVT1,0x87);//Event0高8位  1000ms
    CC1101_Write_Reg(CC1101_WOREVT0,0x6A);//Event0低8位
  }
  CC1101_Write_Reg(CC1101_WORCTRL, 0x58);//WOR_RES = 0  Max:1.8 – 1.9 seconds
  //tevent1 = 12*750/2M = 346us
  Delay_Ms(4);//2ms校准时间
  //bug4:WOR timing error on short timing intervals
  CC1101_Write_Reg(CC1101_IOCFG0, 0x27); // 0x27:CLK_32k 34.66KHz 推断晶振为26Mhz
  //tsleep = tevent0(999/50ms) - tevent1(346.15) - tidletorx/cal(799) -trx_timeout - tidle(150us)
  //WOR_short:1  trx_timeout = 1.5625ms tsleep= 50ms-0.34615-0.799-1.5625-0.15 = 47.14235 ms
  //WOR_short:0  trx_timeout = 1.95ms tsleep= 1000ms-0.34615-0.799-1.95-0.15 = 996.75485 ms
  //t SLEEP >t SLEEP min     tsleepmin = 750*384/26MHz = 11.0769ms
  //WOR_short:1:   tevent0 - tsleepmin = 50 -11.08 = 38.92ms 
  //WOR_short:0:   tevent0 - tsleepmin = 1000 -11.08 = 988.92ms 
  //WOR_short:1  x= 1349    WOR_short:0  x=34282  x*750/26000000 = 38.92 /988.92ms 
  while(1)
  {
    if(GDO0_IN == 0) 
    {
      wortime = CC1101_Read_Status(CC1101_WORTIME0);
      wortime |= CC1101_Read_Status(CC1101_WORTIME1)<<8;
      if(WOR_short && wortime < 1300)
      {
        break;
      }
      if((WOR_short == 0) &&  wortime < 34000)
      {
        break;
      }
    }
  }
  //bug7:WOR Timer Issue when RCOSC Calibration is Disabled WOR timer runs too slow
  CC1101_Write_Reg(CC1101_IOCFG0, 0x26); // 0x26:CLK_256
  //CC1101_Write_Reg(CC1101_WORCTRL, 0x38); // 事件 1 工作暂停前事件 0 后  WOR_RES==0 1LSB周期 (27μs – 31μs)
  //EVENT1[2:0]=4(100) tevnet1= 0.444~0.462ms
  //tEvent1 > Max XOSC Startup + PO_TIMEOUT?   XOSC Startup:150us 
  CC1101_Write_Reg(CC1101_WORCTRL, 0x50);
  uint8_t calib1 = CC1101_Read_Status(RCCTRL1_STATUS);
  uint8_t calib0 = CC1101_Read_Status(RCCTRL0_STATUS);
  CC1101_Write_Reg(CC1101_RCCTRL1, calib1);
  CC1101_Write_Reg(CC1101_RCCTRL0, calib0);
//  while(1)
//  {
//    if(GDO0_IN == 0)
//      break;
//  }
  while(GDO0_IN);
  //CC1101_Write_Reg(CC1101_IOCFG0, 0x24);  // 0x24  WOR_ENVT0
  //CC1101_Write_Reg(CC1101_IOCFG0, 0x25); // 0x25  WOR_ENVT1
  CC1101_Write_Reg(CC1101_IOCFG0, 0x2E); // 0x25  WOR_ENVT1
#ifdef EVNET_CHP_TEST
  CC1101_Write_Reg(CC1101_IOCFG2, 0x25); // 0x25  WOR_ENVT1
  CC1101_Write_Reg(CC1101_IOCFG0, 0x29); // 0x29  CHIP_RDYn
#endif
  CC1101_Write_Cmd(CC1101_SWORRST); // Resets the real time clock
  // This means that the strobe command must be executed in less than 1.84 ms
  CC1101_Write_Cmd(CC1101_SWOR);    // Starts Wake-on-Radi
  //TX1_TOGGLE;
  RestoreInterrupts();//__set_interrupt_state(isate); 
}

消耗

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

    有许多事情是不清楚的,我们需要了解才能帮助你。

    您如何测量总体功耗? 这是休眠模式下的电流消耗、还是在一段时间内测量的电流消耗? 这段时间有多长?

    测量时 WOR_SHORT 是什么?功耗增加是由于 RX 时间较长等原因导致的、还是由于睡眠等原因导致的功耗较高?

    您应该使用功率分析仪、以便查看当前配置文件并确定不同情况下的不同之处。

    此外、您需要确保测试条件保持不变。 您应在所测试的信道上没有信号时测量电流消耗。

    此外、您如何知道您在比较相同的校准条件、因为您已经将合成设置为每4次唤醒一次进行校准。 完成校准的唤醒时的电流消耗将高于跳过的情况

    BR

    Siri

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

    以下代码主要显示 WOR 模式的配置以及接收数据后的中断响应。 解析数据后、系统会根据 WOR 模式配置再次进入 WOR 模式。

    void CC1101_Write_Cmd_SWOR(void)
    {
      //__istate_t isate = __get_interrupt_state();__disable_interrupt();
      DisableInterruptsAndSaveState();
      //PO_TIMEOUT[10] :Approx. 149 – 155 μs
      //CC1101_Write_Reg(CC1101_MCSM0, 0x38); // When going from RX or TX back to IDLE automatically
      //PO_TIMEOUT[10]: 3 (11)  256  Approx. 597 – 620 μs
      CC1101_Write_Reg(CC1101_MCSM0, 0x3C); 
    
      {
        CC1101_Write_Reg(CC1101_MCSM2, 0x16);        // 1000ms*0.195%=1.95ms
        CC1101_Write_Reg(CC1101_WOREVT1,0x87);//Event0高8位  1000ms
        CC1101_Write_Reg(CC1101_WOREVT0,0x6A);//Event0低8位
      }
      CC1101_Write_Reg(CC1101_WORCTRL, 0x58);//WOR_RES = 0  Max:1.8 – 1.9 seconds
      //tevent1 = 12*750/2M = 346us
      Delay_Ms(4);//2ms校准时间
      //bug4:WOR timing error on short timing intervals
      CC1101_Write_Reg(CC1101_IOCFG0, 0x27); // 0x27:CLK_32k 34.66KHz 推断晶振为26Mhz
      //tsleep = tevent0(999/50ms) - tevent1(346.15) - tidletorx/cal(799) -trx_timeout - tidle(150us)
      //WOR_short:1  trx_timeout = 1.5625ms tsleep= 50ms-0.34615-0.799-1.5625-0.15 = 47.14235 ms
      //WOR_short:0  trx_timeout = 1.95ms tsleep= 1000ms-0.34615-0.799-1.95-0.15 = 996.75485 ms
      //t SLEEP >t SLEEP min     tsleepmin = 750*384/26MHz = 11.0769ms
      //WOR_short:1:   tevent0 - tsleepmin = 50 -11.08 = 38.92ms 
      //WOR_short:0:   tevent0 - tsleepmin = 1000 -11.08 = 988.92ms 
      //WOR_short:1  x= 1349    WOR_short:0  x=34282  x*750/26000000 = 38.92 /988.92ms 
      while(1)
      {
        if(GDO0_IN == 0) 
        {
          wortime = CC1101_Read_Status(CC1101_WORTIME0);
          wortime |= CC1101_Read_Status(CC1101_WORTIME1)<<8;
          if((WOR_short == 0) &&  wortime < 34000)
          {
            break;
          }
        }
      }
      //bug7:WOR Timer Issue when RCOSC Calibration is Disabled WOR timer runs too slow
      CC1101_Write_Reg(CC1101_IOCFG0, 0x26); // 0x26:CLK_256
      //CC1101_Write_Reg(CC1101_WORCTRL, 0x38); // 事件 1 工作暂停前事件 0 后  WOR_RES==0 1LSB周期 (27μs – 31μs)
      //EVENT1[2:0]=4(100) tevnet1= 0.444~0.462ms
      //tEvent1 > Max XOSC Startup + PO_TIMEOUT?   XOSC Startup:150us 
      CC1101_Write_Reg(CC1101_WORCTRL, 0x50);
      uint8_t calib1 = CC1101_Read_Status(RCCTRL1_STATUS);
      uint8_t calib0 = CC1101_Read_Status(RCCTRL0_STATUS);
      CC1101_Write_Reg(CC1101_RCCTRL1, calib1);
      CC1101_Write_Reg(CC1101_RCCTRL0, calib0);
      while(1)
      {
        if(GDO0_IN == 0)
          break;
      }
      CC1101_Write_Reg(CC1101_IOCFG0, 0x24);  // 0x24  WOR_ENVT0
    
      CC1101_Write_Cmd(CC1101_SWORRST); // Resets the real time clock
      // This means that the strobe command must be executed in less than 1.84 ms
      CC1101_Write_Cmd(CC1101_SWOR);    // Starts Wake-on-Radi
      
      RestoreInterrupts();//__set_interrupt_state(isate); 
    }
    
    void CC1101_WOR_Init(void)
    {
      CC1101_Write_Cmd(CC1101_SIDLE);
      Delay_Us(900); // 每次由空闲转换到发送或接受是延时必须超过799us。pg54
      
      // CC1101_Write_Reg(CC1101_PATABLE,PaTabel[I_p.para[1]]);
      CC1101_Write_Cmd(CC1101_SFRX);
      CC1101_Write_Cmd(CC1101_SFTX);
    
     CC1101_Write_Reg(CC1101_PKTLEN, 0xff); //
      // CC1101_Write_Reg(CC1101_IOCFG2,0x0E);  //Carrier sense.
      CC1101_Write_Reg(CC1101_IOCFG2, 0x07);   // CRC_OK
      CC1101_Write_Reg(CC1101_PKTCTRL0, 0x45); // 可变长度
      // ADR_CHK:Address check, no broadcast
      CC1101_Write_Reg(CC1101_PKTCTRL1, 0x0D);
      CC1101_Write_Reg(CC1101_MCSM0, 0x18); // When going from IDLE to RX or TX (or FSTXON)
      // IDLE to RX, with calibration  1953/f xosc + FS calibration Time  799
      // IDLE to TX/FSTXON, with calibration  1953/f xosc + FS calibration Time  799
      // Delay_Us(810);
      CC1101_Write_Reg(CC1101_IOCFG0, 0x06); // 收到同步字置位,数据包末尾\地址校验失败\RXFIFO溢出时取消置位
      // WOR, RX_TIME是百分比,退出WOR,RX_TIME就必须一直持续到packet结束
      CC1101_Write_Reg(CC1101_MCSM2, 0x07); // RX_TIME:Until en
    
      CC1101_Write_Cmd(CC1101_SIDLE);
      CC1101_Write_Cmd_SWOR();
    }
    
    
    uint8_t CC1101_GDO2_ISR(void)
    {
      //----------------------- TX MODE -----------------------
      if (Radio_mode == TX_MODE)
      {
        if (CC1101_Get_TxCounter()) // 发送溢出
          return 0x16;              // TXFIFO_UNDERFLOW
        if (txData.lastpkg)
        {                                                                               // Less than 60 bytes to write to the
          CC1101_Write_Multi_Reg(CC1101_TXFIFO, txData.pBufferIndex, txData.bytesLeft); //-txData.tx_fifo
          // CC1101_Write_Reg( CC1101_MCSM1, 0x03);//230614 新增最后一包透传自动切换接收模式
          //  txData.pBufferIndex += txData.bytesLeft;//RESET_GDO2;
        }
        return 0;
    
        //----------------------- RX MODE -----------------------
      }
      else
      {
        if (CC1101_Get_RxCounter())
        { // 接收溢出
          return 0x21;
        }
        if (rxData.rx_fifo == 0)
        {
          return 0x22;
        }
        if (GDO2 == GPIO_PIN_SET) // 上升沿,单包数据CRC——OK
        {
          // RESET_GDO0;//GDO0下降沿中断不处理
          CC1101_Rx_Packet(rxData.buf);
          return 0;
        }
      }
    }
    
    uint8_t CC1101_Rx_Packet(uint8_t *RxBuff)
    {
      if (rxData.rx_fifo <= 63)
      {
        if (rxData.pktFormat == VARIABLE)
        {
          rxData.bytes_len = CC1101_Read_Reg(CC1101_RXFIFO); // 获取长度信息
          CC1101_Read_Reg(CC1101_RXFIFO);                    // 如果数据包中包含地址信息 ,则读取地址信息
          if (rxData.bytes_len == 0)
          {
            return 0x15; // 无数据
          }
          else
          {
            rxData.bytes_len--; // 减去一个地址字节
          }
          CC1101_Read_Multi_Reg(CC1101_RXFIFO, RxBuff, rxData.bytes_len + 2);
          memcpy(l_Status, &RxBuff[rxData.bytes_len], 2);
          // CC1101_Read_Multi_Reg( CC1101_RXFIFO, l_Status, 2 );
          
          if (rxData.bytes_len)
          {
            rxData.packetsReceived = 2;
            WR_sync_stage(2); // 收到同组
          }
          else
          { // WOR模式收到唤醒,长度为0
    #if 1
            //CC1101_FREQOFF_est(); // 频率偏移补偿
            rxData.packetsReceived = 1;
    #else
            return 0x16;
    #endif
          }
        }
        RX_rssi = l_Status[0];
        RX_LQI = l_Status[1] & LQI_EST; // 读取数据
        // 读取数据包最后两个额外字节,后一个为CRC标志位
        if (RX_rssi >= 128)
          RSSI_dBm = (((int16_t)RX_rssi - 256) >> 1) - 74;
        else
          RSSI_dBm = ((int16_t)RX_rssi >> 1) - 74;
        if (l_Status[1] & CRC_OK)
        { // 校验通过
          // RF_Rx_Packet();
          return 0;
        }
        else
        {
          rxData.packetsReceived = 0;
          return 0x13;
        }
      }
      else
        return 0x14;
    }

    e2e.ti.com/.../1725675988781.mp4

    事实上、我对系统的功耗进行了很长一段时间的测试、超过1小时。 确保除 CC1101外设的电流消耗是固定的。 CC1101首次进入 WOR 状态后、CC1101的功耗在25至35uA 之间波动。 从 WOR 状态唤醒并再次返回 WOR 模式后、功耗在 30到40uA 之间波动。

    WOR_SHORT 表示 WOR 睡眠间隔为50ms 的情况。 目前、所有测试都是在睡眠间隔为1s 的情况下进行的。 50ms 是另一种模式、间隔为50ms、整个机器的功耗将大于100uA。

    我将校准设置为每4次进行一次、如上图所示、校准期间的电流确实大于其他次。 我刚才截取了约7秒的电流消耗的屏幕截图。

    由于系统的工作电压是固定的、因此此处仅讨论电流消耗。 如视频所示、当系统首次上电时、CC1101处于 WOR 模式并每4次校准一次。 整个系统的功耗在25 至35uA 范围内波动。 在中间、其他器件以 WOR 模式唤醒器件、瞬时 RX 电流约为17mA、然后通信结束并返回到 WOR 模式。 然而、整机的功率波动范围可增加至30~40uA。

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

     首先、我无法看到您所附的视频、因此我仍然不明白您的测量结果是什么样子的。

    只是从查看代码、我无法回答您看到功耗不断变化的原因、所以我所能做的就是为您提供一些一般的调试提示。

    首先、在测量电流时、请确保仅测量 CC1101无线电的电流消耗、而不测量电路板上其他所有组件(MCU、外设等)的所有贡献。

    您应该使用功率分析仪以便查看清晰的功率配置文件、例如AN047--CC1100/CC2500无线电激活(修订版 B (TI.com))中所示的配置文件

    根据我对帖子的理解、您是在启动应用时测量一个平均电流消耗、而在收到数据包并再次进入 WOR 模式后测量另一个。

    您需要确定的是您的电流曲线在25uA 至35uA 之间以及30uA 至40uA 之间情况下的确切变化。

    此差异是由于睡眠或 RX 中的电流消耗较高引起的、还是由时序变化(睡眠时间、EVENT1或 RX 中的时间发生变化)引起的?

    我还建议您在调试时简化代码。

    例如、您只能校准 RC osc。 启动时执行一次(而不是每次调用 Write_Cmd_ OR 时)。 此外、您可以取消代码中对齐 clk 边沿的做法、只需在完整测试期间保持 GDO 引脚的相同设置即可。

    这样、能够更轻松地确定究竟是什么限制了您的电流消耗发生变化。

    Siri

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

    我只有一个采样率为100ksps 的功率器件、因此无法看到整个 WOR 开关过程。 不过、我看到 CC1101的电流消耗在整个过程中基本保持不变、无论是否被唤醒都是如此。 最后一个定位是 MCU 功耗 SPI 外设漏电流增加、重新配置后的功耗可以直接为25~35uA。

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

    我担心、当我没有与您相同的硬件(或软件)时、我无法告诉您正在发生的情况。

    我唯一能说的是、CC1101无线电没有任何理由不会开始消耗更多电流。

    您需要查看以下内容。

    您是否对 MCU 上的任何输入/输出引脚进行了更改?

    在两种不同的情况下、CC1101上的 GDO 配置是否有任何差异?

    很遗憾、除了您必须尝试简化您的软件、我没有任何其他建议可供您参考、直到您不再发现问题为止。

    Siri

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

    谢谢!