如何计算stm32l0的i2c时序

Kub*_*uba 1 c++ stm32 i2c

我有一个 stm32l0 系列处理器,但我不知道如何计算 i2c 时序。我想使用 Bosh bme680/bme280 传感器。我只找到stm32F0/f3的Timming配置工具。有人知道怎么计算吗?

pan*_*oku 5

TLDR : RM0377 参考手册“超低功耗 STM32L0x1 高级 Arm\xc2\xae 基于 32 位\n MCU”,第 614 页包含示例。

\n\n
\n\n

注意:我还没有真正使用过 I2C。以下所有内容均基于文档。

\n\n
    \n
  1. UM1749 用户手册《STM32L0 HAL 和低层驱动程序说明》 (p.\n233):

    \n\n
    \n

    uint32_t I2C_InitTypeDef::Timing 指定 I2C_TIMINGR_寄存器值。该参数参考参考手册中的I2C初始化部分计算得出

    \n
  2. \n
  3. RM0377 参考手册《超低功耗STM32L0x1高级Arm\xc2\xae基于32位\nMCU》 \n(p.641):

    \n\n
    \n

    时序寄存器(I2C_TIMINGR)

    \n\n

    (...)

    \n\n

    压力[3:0]:定时预分频器

    \n\n

    该字段用于预分频 I2CCLK,以生成用于数据建立和保持计数器(请参阅第 587 页上的 I2C 时序)以及 SCL 高电平和低电平计数器(请参阅第 587 页上的 I2C 主初始化)的时钟周期 t_PRESC。第 602 页)。

    \n\n

    t_PRESC = (PRESC+1) x t_I2CCLK

    \n\n

    SCLDEL[3:0]:数据建立时间\n 该字段用于在 SDA 边缘和 SCL 上升沿之间生成延迟 t_SCLDEL。在主机模式和 NOSTRETCH = 0 的从机模式下,SCL 线在 t_SCLDEL 期间拉低。

    \n\n

    t_SCLDEL = (SCLDEL+1) x t_PRESC

    \n\n

    注:t_SCLDEL 用于生成 t_SU:DAT 时序。

    \n\n

    斯达德尔[3:0]:数据保持时间\n 该字段用于生成 SCL 下降沿和 SDA 沿之间的延迟 t_SDADEL。在主机模式和 NOSTRETCH = 0 的从机模式下,SCL 线在 t_SDADEL 期间拉低。

    \n\n

    t_SDADEL = SDADEL x t_PRESC

    \n\n

    注:SDADEL 用于生成 t_HD:DAT 时序。

    \n\n

    SCLH[7:0]:SCL 高电平周期(主模式)\n 该字段用于在主模式下生成 SCL 高电平周期。

    \n\n

    t_SCLH = (SCLH+1) x t_PRESC

    \n\n

    注意:SCLH 还用于生成 t_SU:STO 和 t_HD:STA 时序。

    \n\n

    SCLL[7:0]:SCL 低电平周期(主模式)\n 该字段用于在主模式下生成 SCL 低电平周期。

    \n\n

    t_SCLL = (SCLL+1) x t_PRESC

    \n\n

    注意:SCLL 还用于生成 t_BUF 和 t_SU:STA 时序。

    \n
    \n\n

    有关预分频器的更多信息可以在有关定时器的段落中找到\n(p. 433)。

  4. \n
  5. RM0377(第 581 页):

    \n\n
    \n

    该接口通过数据引脚 (SDA) 和时钟引脚 (SCL) 连接到 I2C 总线。它可以与标准(高达 100 kHz)、快速模式(高达 400 kHz)或快速模式 Plus(高达 1MHz)I2C 总线连接。

    \n
    \n\n

    因此,为了进行通信,I2C 时钟需要具有适当的频率。

  6. \n
  7. RM0377(第 583 页):

    \n\n
    \n

    该独立时钟源可以从以下三个时钟源中选择:

    \n\n
      \n
    • PCLK1:APB1时钟(默认值)
    • \n
    • HSI16:内部 16 MHz RC 振荡器
    • \n
    • SYSCLK:系统时钟\n 有关更多详细信息,请参阅第 7 节:复位和时钟控制 (RCC)。
    • \n
    \n
  8. \n
  9. RM0377(第 604 页):\nI2C-SMBUS 规范时钟时序

  10. \n
  11. RM0377(第 602 页):

    \n\n
    \n

    t_SCL = t_SYNC1 + t_SYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x t_I2CCLK}

    \n\n

    t_SYNC1 的持续时间取决于以下参数:

    \n\n
      \n
    • SCL下降斜率
    • \n
    • 启用后,模拟滤波器会引起输入延迟。
    • \n
    • 启用后,数字滤波器引起的输入延迟:DNF x t_I2CCLK
    • \n
    • 由于 SCL 与 I2CCLK 时钟同步(2 至 3 个 I2CCLK 周期)而导致的延迟
    • \n
    \n\n

    t_SYNC2 的持续时间取决于以下参数:

    \n\n
      \n
    • SCL上升斜率
    • \n
    • 启用后,模拟滤波器会引起输入延迟。
    • \n
    • 启用后,数字滤波器引起的输入延迟:DNF x t_I2CCLK
    • \n
    • 由于 SCL 与 I2CCLK 时钟同步(2 至 3 个 I2CCLK 周期)而导致的延迟
    • \n
    \n
  12. \n
  13. BME280 数据表(第 30 页):

    \n\n
    \n

    支持所有模式(标准、快速、高速)。

    \n
  14. \n
\n\n
\n\n

总结一下:根据 I2C 时钟频率和您想要使用的速度,您需要选择符合使用公式的、、PRESCSCLDELSDADELSCLHSCLLI2C-SMBUS specification clock timingst_SCL = t_SYNC1 + t_SYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x t_I2CCLK}

\n\n

I2C_TIMINGR register configuration examples第 614 页的 RM0377 中也有一些。

\n