如何计算stm32l0的i2c时序

时间:2018-05-28 11:25:59

标签: c++ stm32 i2c

我有一个stm32l0系列处理器,我不知道如何计算i2c时序。 我想和Bosh bme680 / bme280传感器一起工作。我发现只有stm32F0 / f3的Timming配置工具。 Some1知道如何计算它?

1 个答案:

答案 0 :(得分:2)

TLDR RM0377 Reference manual "Ultra-low-power STM32L0x1 advanced Arm®-based 32-bit MCUs", page 614包含示例。


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

  1. UM1749 User Manual "Description of STM32L0 HAL and Low Layer drivers"(p。 233):

      

    uint32_t I2C_InitTypeDef :: Timing指定I2C_TIMINGR_register值。该参数通过参考计算   参考手册中的I2C初始化部分

  2. RM0377 Reference manual "Ultra-low-power STM32L0x1 advanced Arm®-based 32-bit MCUs" (第641页):

      

    定时寄存器(I2C_TIMINGR)

         

    (...)

         

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

         

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

         

    t_PRESC = (PRESC+1) x t_I2CCLK

         

    SCLDEL [3:0] :数据设置时间   该字段用于在SDA沿和SCL上升沿之间生成延迟t_SCLDEL。在主机模式和从机模式下(NOSTRETCH = 0),在t_SCLDEL期间SCL线被拉低。

         

    t_SCLDEL = (SCLDEL+1) x t_PRESC

         

    注意:t_SCLDEL用于生成t_SU:DAT计时。

         

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

         

    t_SDADEL = SDADEL x t_PRESC

         

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

         

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

         

    t_SCLH = (SCLH+1) x t_PRESC

         

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

         

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

         

    t_SCLL = (SCLL+1) x t_PRESC

         

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

    有关预分频器的更多信息,请参见有关计时器的段落 (第433页)。

  3. RM0377(第581页):

      

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

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

  4. RM0377(p.583):

      

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

         
        
    • PCLK1:APB1时钟(默认值)
    •   
    • HSI16:内部16 MHz RC振荡器
    •   
    • SYSCLK:系统时钟   有关更多详细信息,请参见第7节:复位和时钟控制(RCC)。
    •   
  5. RM0377(第604页): I2C-SMBUS specification clock timings

  6. RM0377(第602页):

      

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

         

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

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

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

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

      

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


全部收集:根据I2C时钟频率以及您要使用的速度,您需要选择PRESCSCLDEL,{ {1}},SDADELSCLH,表示您使用公式SCLL遵守I2C-SMBUS specification clock timings

第614页的RM0377中还有一些t_SCL = t_SYNC1 + t_SYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x t_I2CCLK}