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:WOR 模式下 CC1101空闲激活时间不正确

Guru**** 2481375 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/1302847/cc1101-cc1101-idle-activation-time-incorrect-in-wor-mode

器件型号:CC1101

尊敬的,

 我使用 CC1101进行数据通信、并且需要使用 WOR 模式以降低功耗。

WOR 空闲间隔分为1和50ms 两种。您可以看到函数 CC1101 WOR Init。

在正常情况下、空闲间隔在1和50ms 之间切换、但在某些情况下、

对应于50ms 的空闲间隔将大于6s、大于7s 或14.8s、

对应于1的时间间隔将增加10、60、70或148。

如下图所示、我仅在两种情况(1或50ms)下配置了 WOREVT。

但实际空闲时间与配置不一致、

错误图:

正确的示意图:

void CC1101_RX_Mode(uint8_t mode, uint8_t pkg_mode)
{
  CC1101_radio_idle(RX);
  rxData.pktFormat = pkg_mode;
  Radio_mode = mode;

  if (rxData.pktFormat == INFINITE)
  {
#if (RF_EN == 2)
    DTU = 3;
#endif
    CC1101_SET_Pkg_infinite(RX);
  }
  else
  {
    CC1101_TRX_prepare(RX);
  }
}

/**
 * @brief :CC1101_radio_idle
 * @param :type : TX  RX
 * @note  :无
 * @retval:无
 */
void CC1101_radio_idle(uint8_t type)
{
  RESET_GDO0;
  RESET_GDO2;
  reset_rxData();
  reset_txData();

  if (Radio_mode == WOR_MODE)//if (type == TX && Radio_mode == WOR_MODE)
  {
    CC1101_SET_CSN_LOW();
    Delay_Us(500); // cc1101.page30:CSn low to positive edge on SCLK, in power-down mode
  }
  CC1101_Write_Cmd(CC1101_SIDLE);
  Delay_Us(1000); // 每次由空闲转换到发送或接受是延时必须超过810us。

  CC1101_Write_Cmd(CC1101_SFRX);
  CC1101_Write_Cmd(CC1101_SFTX);

  if (type == TX)
  {
    CC1101_Write_Reg(CC1101_PATABLE, PaTabel[I_p.para[1]]);
    if (Radio_mode == WOR_MODE)
    {
      CC1101_TRX_prepare(TX);
    }
  }
}

/**
 * @brief :CC1101_TRX_prepare
 * @param :type : TX  RX
 * @note  :无
 * @retval:无
 */
void CC1101_TRX_prepare(uint8_t type)
{
  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)
  CC1101_Write_Reg(CC1101_IOCFG0, 0x06); // 收到同步字置位,数据包末尾\地址校验失败\RXFIFO溢出时取消置位
  CC1101_Write_Reg(CC1101_MCSM2, 0x07); // RX_TIME:Until end of packet
  if (reed_mode)
    Group_addr = 65535;
  else
    memcpy(&Group_addr, &I_p.ADDR[1], 2);
  CC1101_Set_Channel(Group_addr);
  CC1101_Set_Address((Group_addr & 0xff) ^ ((Group_addr >> 8) & 0xff));
  if (type == RX)
  {
    // Asserts when the RX FIFO has overflowed. De-asserts when the FIFO has been flushed.
    if (Radio_mode == WOR_MODE)
    {
      CC1101_Set_Sync(1);
      CC1101_WOR_Init();
      SET_GDO2_UP;
    }
    else
    {
      CC1101_Set_Sync(0);
      CC1101_check_RX(); // CC1101_Write_Cmd(CC1101_RX);//
      SET_GDO0_DOWN; // 实时接收:GDO0超时
    }
  }
}

/**
 * @brief :CC1101初始化WOR功能
 * @param :无
 * @note  :无
 * @retval:无
 */
void CC1101_WOR_Init(void)
{
  //CC1101_Write_Cmd(CC1101_SIDLE);
  // CC1101_Write_Reg(CC1101_MCSM2,0x10);//RX_RSSI=1(便于快速休眠)
  //uint16_t sl_p;
  if (WOR_short)
  {
    CC1101_Write_Reg(CC1101_MCSM0, 0x28); // When going from RX or TX back to IDLE automatically
    //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位
    CC1101_Write_Reg(CC1101_MCSM2, 0x10);        // 0x10 50ms*12.5%
  }
  else
  {
    CC1101_Write_Reg(CC1101_MCSM0, 0x38); // 每第四次当从 RX 或 TX 返回空闲时自动进行校准
    //sl_p = (uint32_t)(1000 * 26000 / 750); //0x876A
    CC1101_Write_Reg(CC1101_WOREVT1,0x87);//Event0高8位  1000ms
    CC1101_Write_Reg(CC1101_WOREVT0,0x6A);//Event0低8位
    CC1101_Write_Reg(CC1101_MCSM2, 0x13);        // 1000ms*0.391%=391us
  }
  CC1101_Write_Reg(CC1101_WORCTRL, 0x38); // 事件 1 工作暂停前事件 0 后  WOR_RES==0 1LSB周期 (27μs – 31μs)
  Delay_Ms(10);
  CC1101_Write_Reg(CC1101_WORCTRL, 0x30);
  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);

  CC1101_Write_Reg(CC1101_IOCFG0, 0x25); // 0x25  WOR ENVT1
  //CC1101_Write_Reg(CC1101_IOCFG0, 0x24); // 0x24  WOR ENVT0
  //CC1101_Write_Cmd(CC1101_SIDLE );
  CC1101_Write_Cmd(CC1101_SWORRST); // Resets the real time clock
  CC1101_Write_Cmd(CC1101_SWOR);    // Starts Wake-on-Radi
  //CC1101_Write_Cmd(CC1101_SPWD);
}

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

    我从您的代码片段中看到、您尚未考虑勘误表中的"RCOSC 校准禁用时的 WOR 计时器问题"。

    该错误可能导致50ms 间隔时间为6.4s、而1s 间隔时间应为128s。

    这并不能解释两个配置都有4个不同的时间间隔、而是从实施修复开始、然后看看是如何进行的。

    Br

    Siri

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

    你有示例代码吗? 我已作出勘误表。 我会尝试它。谢谢!   

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

    尊敬的 Siri:

    核心思想是:这意味着 STROBE 命令必须在1.84ms 内执行。

     我喜欢这个。

    /**
     * @brief :CC1101 执行SWOR命令
     * @param :无
     * @note  :SWRZ020E cc1101 Errata 描述WOR Timer Issue when RCOSC Calibration is Disabled
     * @retval:无
     */
    void CC1101_Write_Cmd_SWOR(void)
    {
      __istate_t isate = __get_interrupt_state();
      __disable_interrupt();
      TX1_TOGGLE;
      CC1101_Write_Reg(CC1101_WORCTRL, 0x30);
      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);
    
      CC1101_Write_Reg(CC1101_IOCFG0, 0x25); // 0x25  WOR ENVT1
      //CC1101_Write_Reg(CC1101_IOCFG0, 0x24); // 0x24  WOR ENVT0
      //CC1101_Write_Cmd(CC1101_SIDLE );
      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
      CC1101_Write_Cmd(CC1101_SWOR);
      TX1_TOGGLE;
      __set_interrupt_state(isate);
    }
    /**
     * @brief :CC1101初始化WOR功能
     * @param :无
     * @note  :无
     * @retval:无
     */
    void CC1101_WOR_Init(void)
    {
      //CC1101_Write_Cmd(CC1101_SIDLE);
      // CC1101_Write_Reg(CC1101_MCSM2,0x10);//RX_RSSI=1(便于快速休眠)
      //uint16_t sl_p;
      if (WOR_short)
      {
        CC1101_Write_Reg(CC1101_MCSM0, 0x28); // When going from RX or TX back to IDLE automatically
        //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位
        CC1101_Write_Reg(CC1101_MCSM2, 0x10);        // 0x10 50ms*12.5%
      }
      else
      {
        CC1101_Write_Reg(CC1101_MCSM0, 0x38); // 每第四次当从 RX 或 TX 返回空闲时自动进行校准
        //sl_p = (uint32_t)(1000 * 26000 / 750); //0x876A
        CC1101_Write_Reg(CC1101_WOREVT1,0x87);//Event0高8位  1000ms
        CC1101_Write_Reg(CC1101_WOREVT0,0x6A);//Event0低8位
        CC1101_Write_Reg(CC1101_MCSM2, 0x13);        // 1000ms*0.391%=391us
      }
      CC1101_Write_Reg(CC1101_WORCTRL, 0x38); // 事件 1 工作暂停前事件 0 后  WOR_RES==0 1LSB周期 (27μs – 31μs)
      Delay_Ms(4);
      CC1101_Write_Cmd_SWOR();
    }

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

    解决方法是选通脉冲不得出现在256kHz 时钟的边沿上、不仅要使其短于184ms。

    为了能够实现这一点、您需要在一个引脚上输出时钟(256kHz)、然后等待一个边沿后再选通:

    伪代码:

    .
    .
    .
    CC1101_Write_Reg(CC1101_WORCTRL, 0x38);
    
    while (GDOx == 0); // Wait for edge on GDOx (IOCFGx = 0x26, and the code must wait for an edge to happen)
      
    CC1101_Write_Cmd_SWOR(); // This must take less than 1.84 ms to avoid the next edge
    .
    .
    .

    Siri

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

    谢谢!我 明白了 。

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

    尊敬的 Siri:

    这里有一个新情况。

    CLK_256正常时间值  :1.84ms

    但该 CLK_256 间隔 为3.415ms、

    CLK_256 5ms/CLK_256 3ms.png

    ,EVENT1间隔为14.95s。

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

    我无法告诉您为什么要测量这个、因为我无法在这里重现问题。

    发生这种情况时的 wor 间隔是多少?

    您是否刚刚更改了 发生这种情况的时间间隔?

    这种情况是否会随机发生、还是在进入 WOR 模式后才会出现移位?

    您是否已确保 tEvent1 >最大 XOSC 启动+ PO_TIMEOUT?

    您多久看到一次发生这种情况?

    我强烈建议您首先简化代码、然后使用较短的间隔(50ms)或较长的间隔(1s)开始测试。

    让测试尽可能简单、以便在您发现测试失败时可以尝试在此处重新创建测试。

    一旦间隔设置和运行都没有问题,就可以尝试将它们合并。 如果出现问题、那么我们就知道问题与您如何重新配置相关。

    调试时还应使用逻辑分析器、以便可以监控所有 SPI 线路和 GDO 线路、从而在问题发生之前弄清发生了什么情况。

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

    尊敬的 Siri:  

    如下所示的 CC1101射频参数。

    我想找出彼此干扰最少的17个通道。

    在正常情况下、如果通信数据长度小于64字节、

    因此无需对这些通道进行滤波。

    但我需要传输大量数据、使用无限模式、最高5KB 的数据、使用100kbps 的传输时间需要大约400ms、

    每组器件都采用1个主器件3个从器件模式、每个从器件需要发送5k 字节、总共1.5秒。

    至少有17组器件同时执行这些大数据传输。

    我曾尝试对每个器件的大数据发送时间进行固定的延迟、但总时间超过25秒。

    如果整个时间可以缩短到小于5s、则更理想。

    因此、 我想找出彼此干扰最少的17个通道。

    如何对来自100个通道的这些通道进行分频和滤波?

    是否提供参考文档或必须使用分光光度图进行筛查 测试。

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

    尊敬的 Shang:

    您要在什么稳压和频率区域进行设计? 您有多大带宽可供使用? 例如、欧洲的434MHz 频段仅为1.74 MHz 宽。 200kHz 通道不能超过8个。  

    此致、

    Hg

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

    我来自中国、中国属于 ISM 地区3。 没有免许可证的频谱。 但有一个例外、那就是微功耗无线器件。 微功耗无线设备可以使用 ISM 使用的公共频带(有许多频带、包括您可以搜索的所有无线设备)和频带。 只要不干扰公共设备即可。 目前使用的 CC1101是一个微功耗无线器件、因此可以灵活定义。

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

    尊敬的 Shang:

    在这种情况下、您应该将17组设置中的每一组配置为在不同的 信道中运行。  如何选择这些通道取决于它们所处的工作环境。 您应扫描频谱以查看哪些信道最繁忙、并避免选择这些信道。

    如果该区域中有其他设备运行并使用某种跳频、则很难为设备选择信道。 在这种情况下、应在传输数据之前扫描工作信道以查看是否有其他人使用该信道。

    在另一个注意事项上、您是否会同时发送所有5KB 数据? 最好将数据分解成较小的块。 当接收到不流动数据时、您是否对错误进行了某种处理?

    此致、

    Hg

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

    我想问问、是否有其他更有利于实现上述功能的硬件解决方案、以及由 cc1312支持的 TI 15.4-Stack 是否能够应对这一挑战。

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

    尊敬的 Shang:

    我将分配一名软件工程师、并在周一之前与您联系。

    此致、

    Hg

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

    尊敬的 Shang:

    15.4-Stack 不支持该频段在中国。 它仅支持欧盟频带、如下图所示。 对于您的应用、最好坚持使用专有模式。

    此致、

    Hg

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

    谢谢!