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

最佳答案

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



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


UM1749 User Manual "Description of STM32L0 HAL and Low Layerdrivers"(第
233):


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

RM0377 Reference manual "Ultra-low-power STM32L0x1 advanced Arm®-based 32-bitMCUs"
(第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页)。
RM0377(第581页):


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


因此,为了进行通信,I2C时钟需要具有适当的频率。
RM0377(第583页):


  可以从以下三个时钟源中选择该独立的时钟源:
  
  
  PCLK1:APB1时钟(默认值)
  HSI16:内部16 MHz RC振荡器
  SYSCLK:系统时钟
  有关更多详细信息,请参见第7章:复位和时钟控制(RCC)。
  

RM0377(第604页):
c++ - 如何为stm32l0计算i2c时序-LMLPHP
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周期)
  

BME280 Datasheet(第30页):


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





收集所有信息:根据I2C时钟频率和要使用的速度,您需要选择要遵循的PRESCSCLDELSDADELSCLHSCLL值。 I2C-SMBUS specification clock timings使用公式t_SCL = t_SYNC1 + t_SYNC2 + {[(SCLH+1) + (SCLL+1)] x (PRESC+1) x t_I2CCLK}

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

关于c++ - 如何为stm32l0计算i2c时序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50565320/

10-08 21:15