[技术问答] HC32F4A0硬件I2C的波特率/时钟要怎么配置

[复制链接]
4157|11
 楼主| T3rra 发表于 2024-10-28 17:30 | 显示全部楼层 |阅读模式
希望能把I2C的频率调低到10kHZ左右,有人知道应该怎么配置吗
官方库里的I2C波特率初始化代码,主要是根据结构体stc_i2c_init_t的三个参数【u32ClockDiv】【u32Baudrate】【u32SclTime】三个参数进行配置
  1. static int32_t Master_Initialize(void)
  2. {
  3.     int32_t i32Ret;
  4.     stc_i2c_init_t stcI2cInit;
  5.     float32_t fErr;

  6.     I2C_DeInit(I2C_UNIT);

  7.     (void)I2C_StructInit(&stcI2cInit);
  8.     stcI2cInit.u32ClockDiv = I2C_CLK_DIV128;
  9.     stcI2cInit.u32Baudrate = I2C_BAUDRATE;
  10.     stcI2cInit.u32SclTime = 1UL;                               
  11.     i32Ret = I2C_Init(I2C_UNIT, &stcI2cInit, &fErr);

  12.     I2C_BusWaitCmd(I2C_UNIT, ENABLE);

  13.     return i32Ret;
  14. }
在配置函数的注释里有说这几个参数的关系和计算方法,但还是看不太懂
下面是I2C_BaudrateConfig函数的注释,说要先计算DIV,计算方法是div = (I2cSrcClk/Baudrate/(Imme+2*Dnfsum+SclTime)
这里面的SCLTIME =(SCL rising time + SCL falling time)/period of i2c clock ,后面的这个I2C clock period是什么,指的是I2C Source Clock【PCLK3】的周期吗?还是说指的是其他?
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] Set the baudrate for I2C peripheral.
  3. * @param [in] I2Cx                 Pointer to I2C instance register base.
  4. *                                  This parameter can be a value of the following:
  5. *         [url=home.php?mod=space&uid=2817080]@ARG[/url] CM_I2C or CM_I2Cx:  I2C instance register base.
  6. * @param [in] pstcI2cInit          Pointer to I2C config structure  [url=home.php?mod=space&uid=144993]@ref[/url] stc_i2c_init_t
  7. *         @arg pstcI2cInit->u32ClockDiv: Division of i2c source clock, reference as:
  8. *              step1: calculate div = (I2cSrcClk/Baudrate/(Imme+2*Dnfsum+SclTime)
  9. *                     I2cSrcClk -- I2c source clock
  10. *                     Baudrate -- baudrate of i2c
  11. *                     SclTime  -- =(SCL rising time + SCL falling time)/period of i2c clock
  12. *                                 according to i2c bus hardware parameter.
  13. *                     Dnfsum   -- 0 if digital filter off;
  14. *                                 Filter capacity if digital filter on(1 ~ 4)
  15. *                     Imme     -- An Immediate data, 68
  16. *              step2: chose a division item which is similar and bigger than div from @ref I2C_Clock_Division.
  17. *         @arg pstcI2cInit->u32Baudrate : Baudrate configuration
  18. *         @arg pstcI2cInit->u32SclTime : Indicate SCL pin rising and falling
  19. *              time, should be number of T(i2c clock period time)
  20. * @param [out] pf32Error           Baudrate error
  21. * @retval int32_t
  22. *         - LL_OK:                 Success
  23. *         - LL_ERR_TIMEOUT:        Failed
  24. *         - LL_ERR_INVD_PARAM:     Parameter error
  25. */


 楼主| T3rra 发表于 2024-10-29 15:26 | 显示全部楼层
顶顶 有没有知道的
wubangmi 发表于 2024-10-30 09:00 | 显示全部楼层
后面的这个I2C clock period是什么,指的是I2C Source Clock【PCLK3】的周期吗?还是说指的是其他?


针对你这个提问,我个人认为这个I2C clock period是PLCK3分频后的时钟,I2C的时钟默认是PLCK3/1不分频,最大是PCLK3/128分频
xionghaoyun 发表于 2024-10-30 11:19 | 显示全部楼层
直接甩代码。。。 你先把官方例程看完 你先把主频弄好
 楼主| T3rra 发表于 2024-10-30 13:58 | 显示全部楼层
xionghaoyun 发表于 2024-10-30 11:19
直接甩代码。。。 你先把官方例程看完 你先把主频弄好

这个就是官方例程里的代码啊,就是因为看不明白才来问的
 楼主| T3rra 发表于 2024-10-30 14:00 | 显示全部楼层
wubangmi 发表于 2024-10-30 09:00
后面的这个I2C clock period是什么,指的是I2C Source Clock【PCLK3】的周期吗?还是说指的是其他?

谢谢回复
su1yirg 发表于 2024-11-11 23:51 | 显示全部楼层
在HC32F4A0芯片上配置硬件I2C的波特率(时钟频率)时,需要根据系统时钟频率和所需的I2C时钟频率来计算分频系数。HC32F4A0的I2C模块支持多种时钟频率,包括标准模式(100kHz)、快速模式(400kHz)和高速模式(1MHz)。

liu96jp 发表于 2024-11-11 23:53 | 显示全部楼层
在HC32F4A0芯片上配置硬件I2C的波特率(时钟频率)时,需要根据系统时钟频率和所需的I2C时钟频率来计算分频系数,并配置相应的寄存器。
b5z1giu 发表于 2024-11-12 10:11 | 显示全部楼层
首先,确定系统时钟频率(如HRC、LRC或外部晶振)。假设系统时钟频率为sys_clk。

lix1yr 发表于 2024-11-12 12:23 | 显示全部楼层
我觉得可以根据所需的I2C时钟频率(如100kHz、400kHz或1MHz),计算分频系数。分频系数的计算公式如下:[ \text{div} = \frac{\text{sys_clk}}{\text{I2C_clk} \times 2} ]其中:sys_clk 是系统时钟频率。I2C_clk 是所需的I2C时钟频率。

kaif2n9j 发表于 2024-11-12 13:33 | 显示全部楼层
配置I2C时钟分频器,根据计算出的分频系数,配置I2C时钟分频器。

4c1l 发表于 2025-1-31 11:40 | 显示全部楼层
新年好呀,新年好呀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部