STM32设备I2C_TIMINGR中SCLH与SCLL的计算方法问询
STM32 I2C_TIMINGR SCLH/SCLL 计算与参数调整
核心计算公式(基于RM0433与AN4235)
针对**模拟滤波器开启(AF=1)、数字滤波器关闭(DF=0)**的主模式场景,时序计算需遵循以下步骤:
- 先计算I2C时钟源分频后的周期:
T_I2C_CLK = T_PCLK1 × (PRESC + 1),其中PRESC是I2C_TIMINGR[3:0]的预分频系数,T_PCLK1 = 1 / f_PCLK1(您的场景下f_PCLK1=170MHz,因此T_PCLK1≈5.882ns) - SCL高电平时间:
T_SCLH = (SCLH + 1) × T_I2C_CLK,同时必须满足T_SCLH ≥ T_RISE + T_AF(T_RISE为外部上升时间,T_AF为模拟滤波器典型延迟50ns) - SCL低电平时间:
T_SCLL = (SCLL + 1) × T_I2C_CLK,同时必须满足T_SCLL ≥ T_FALL + T_AF(T_FALL为外部下降时间) - I2C总线频率:
f_I2C = 1 / (T_SCLH + T_SCLL)
对您给出例子的分析
您提到的参数组合(f_I2C=1MHz、f_PCLK1=170MHz、SCLH=0x10、SCLL=0x31)存在计算矛盾:
- 若
PRESC=0(无预分频),则T_I2C_CLK=5.882ns,计算得T_SCLH=(16+1)×5.882≈100ns,T_SCLL=(49+1)×5.882≈294ns,总周期T_SCL=394ns,对应f_I2C≈2.54MHz,与您描述的1MHz不符。 - 若要达到1MHz的总线频率,需调整
PRESC并重新计算SCLH/SCLL:- 目标总周期
T_SCL=1000ns,假设PRESC=2(分频3倍),则T_I2C_CLK=5.882×3≈17.65ns - 需满足
T_SCLH≥80+50=130ns,取SCLH=7,则T_SCLH=(7+1)×17.65≈141ns T_SCLL=1000-141=859ns,计算得SCLL=(859/17.65)-1≈47(即十六进制0x2F)
- 目标总周期
关于“低周期是高周期的3倍”,这是为了满足I2C规范的时序要求:
- 快速模式Plus(1MHz)要求SCL低电平最小740ns、高电平最小260ns,低周期约为高周期的2.8倍,接近3倍;
- 实际配置中常会预留额外余量,确保信号稳定性,因此会刻意设置低周期更长。
延长SCL高周期的调整方法
若要延长T_SCLH,可通过以下方式调整:
- 直接增大
SCLH数值:在满足T_SCLH ≥ T_RISE + T_AF的前提下,增大I2C_TIMINGR[15:8]对应的SCLH值,T_SCLH会随SCLH线性增加; - 调整预分频系数
PRESC:若SCLH已达最大值(255),可增大PRESC系数,提升T_I2C_CLK,从而间接增大T_SCLH; - 同步调整
SCLL:若需保持I2C频率不变,延长T_SCLH后需对应减小SCLL值,确保T_SCLH + T_SCLL = 1/f_I2C;若允许总线频率降低,可保持SCLL不变或同时增大。
内容的提问来源于stack exchange,提问作者user7586189
相关产品推荐
相关产品推荐

