C++ 如何计算stm32l0的i2c定时

C++ 如何计算stm32l0的i2c定时,c++,stm32,i2c,C++,Stm32,I2c,我有一个stm32l0系列处理器,我不知道如何计算i2c定时。 我想使用波什bme680/bme280传感器。我发现只有用于stm32F0/f3的Timming配置工具。有人知道如何计算吗?TLDR:包含示例 注意:我还没有真正使用过I2C。以下所有内容均以文档为基础 (p。 233): uint32_t I2C_InitTypeDef::Timing指定I2C_TIMINGR_寄存器值。此参数通过引用 至参考手册中的I2C初始化部分 (临641): 定时寄存器(I2C_TIMINGR)

我有一个stm32l0系列处理器,我不知道如何计算i2c定时。 我想使用波什bme680/bme280传感器。我发现只有用于stm32F0/f3的Timming配置工具。有人知道如何计算吗?

TLDR:包含示例


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

  • (p。 233):

    uint32_t I2C_InitTypeDef::Timing指定I2C_TIMINGR_寄存器值。此参数通过引用 至参考手册中的I2C初始化部分

  • (临641):

    定时寄存器(I2C_TIMINGR)

    (……)

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

    此字段用于预标I2CCLK,以生成用于数据设置和保持计数器的时钟周期t_PREC(参考 至第587页上的I2C计时)和SCL高电平和低电平 计数器(参见第602页的I2C主机初始化)

    t_PRESC=(PRESC+1)x t_I2CCLK

    SCLDEL[3:0]:数据设置时间 该字段用于在SDA边缘和SCL上升边缘之间生成延迟t_SCLDEL。在NOSTRETCH=0的主模式和从模式下,SCL线在t_SCLDEL期间被拉伸到较低的位置

    t_-SCLDEL=(SCLDEL+1)x t_-PRESC

    注意:t\u SCLDEL用于生成t\u SU:DAT定时。

    SDADEL[3:0]:数据保持时间 该字段用于生成SCL下降沿和SDA沿之间的延迟t_SDADEL。在NOSTRETCH=0的主模式和从模式下,SCL线在t_SDADEL期间被拉伸到较低的位置

    t\u SDADEL=SDADEL x t\u PRESC

    注意:SDADEL用于生成t_HD:DAT定时。

    SCLH[7:0]:SCL高时段(主模式) 此字段用于在主模式下生成SCL高周期

    t_-SCLH=(SCLH+1)x t_-PRESC

    注意:SCLH还用于生成TU SU:STO和TU HD:STA定时。

    SCL[7:0]:SCL低周期(主模式) 此字段用于在主模式下生成SCL低周期

    t_-SCLL=(SCLL+1)x t_-PRESC

    注意:SCLL还用于生成TU BUF和TU SU:STA定时。

    有关预分频器的更多信息可以在有关计时器的段落中找到 (第433页)

  • 0377令吉(第581页):

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

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

  • 0377令吉(第583页):

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

    • PCLK1:APB1时钟(默认值)
    • HSI16:内部16MHz RC振荡器
    • 系统时钟 有关更多详细信息,请参阅第7节:复位和时钟控制(RCC)
  • 0377令吉(第604页):

  • 0377令吉(第602页):

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

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

    • 落坡
    • 启用时,模拟滤波器引起的输入延迟
    • 启用时,数字滤波器引起的输入延迟:DNF x t_I2CCLK
    • SCL与I2CCLK时钟同步引起的延迟(2到3个I2CCLK周期)
    t_SYNC2的持续时间取决于以下参数:

    • 上坡
    • 启用时,模拟滤波器引起的输入延迟
    • 启用时,数字滤波器引起的输入延迟:DNF x t_I2CCLK
    • SCL与I2CCLK时钟同步引起的延迟(2到3个I2CCLK周期)
  • (第30页):

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


  • 收集所有信息:根据I2C时钟频率和您想要使用的速度,您需要选择以下值:
    PREC
    SCLDEL
    SDADEL
    SCLH
    SCLL
    使用公式
    t_SCL=t_SYNC1+t_SYNC2+{[(SCLH+1)+(SCLL+1)]x(PREC+1)x t_I2CCLK}遵守
    I2C-SMBUS规范时钟计时

    RM0377第614页也有一些I2C计时寄存器配置示例。

    TLDR:包含示例


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

  • (p。 233):

    uint32_t I2C_InitTypeDef::Timing指定I2C_TIMINGR_寄存器值。此参数通过引用 至参考手册中的I2C初始化部分

  • (临641):

    定时寄存器(I2C_TIMINGR)

    (……)

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

    此字段用于预标I2CCLK,以生成用于数据设置和保持计数器的时钟周期t_PREC(参考 至第587页上的I2C计时)和SCL高电平和低电平 计数器(参见第602页的I2C主机初始化)

    t_PRESC=(PRESC+1)x t_I2CCLK

    SCLDEL[3:0]:数据设置时间 该字段用于在SDA边缘和SCL上升边缘之间生成延迟t_SCLDEL。在NOSTRETCH=0的主模式和从模式下,SCL线在t_SCLDEL期间被拉伸到较低的位置

    t_-SCLDEL=(SCLDEL+1)x t_-PRESC

    注意:t\u SCLDEL用于生成t\u SU:DAT定时。

    SDADEL[3:0]:数据保持时间 此字段用于生成延迟t_SDADEL betwe