以前一直用STM32cubemx配置得I2C,在cubemx里最高只能给到1MHz,然后那个时序又不怎么看得懂,于是就一度以为最高只能1MHz。
今天忙里偷闲研究了下I2C的timing寄存器
操作平台STM32G431,使用LL库
先贴手册

这是一个32bit寄存器
bit【0~7】SCLL,SCL低电平时间
bit【8~15】SCLH,SCL高电平时间
bit【16~19】SDADEL,数据保持时间,在SCL拉低多久后SDA可以变化
bit【20~23】SCLDEL,数据设置时间,在SDA上加载本次传输的0/1后多久SCL拉高(通知从机数据有效)
bit【28~31】PRESC,时钟源预分频
SCL高低电平时间很好理解
SDADEL和SCLDEL可以参考下图我框出来的,I2C在SCL高电平时数据有效,这个时间主要就是为了防止SCL高电平时SDA数据还没准备好,可以想象大部分情况下给到0其实也不会有问题,但原则上还是至少给1避免不稳定因素

关于timing参数的最小时间单位,我的理解是时钟树配给I2C的频率除去预分频就是了 ,例如160M主频如果不分频,那么timing的数字就表示多少个(1/160M)秒,但实测并不是这样,似乎时钟树提供给I2C的时钟首先已经被分频了一次,大约已经给到了10分频。但是手册上大概看了看没发现类似的说明,希望有高手给解释一下。
根据手册,写了一段代码,用来设置I2C时序

本文介绍了如何在STM32G431平台上使用LL库优化I2C的timing参数,揭示了时序设置的细节,包括SCL和SDA时间,以及预分频的影响。作者实测显示,通过硬件I2C可以实现3.12MHz的通信速率,强调了硬件在I2C速度和稳定性上的优势。
最低0.47元/天 解锁文章
2730





