已绑定手机
|
使用ST的硬件I2C时,总线经常会处于忙的状态,所以用的软件模拟I2C时序,最近笔者在使用GD32F107替换STM32F107的芯片,并且GD的硬件I2C是可以用的,所以我把调试中的问题记录下来,希望能帮助大家少入坑。
引脚配置
通过查询GD32的选型手册可以看到GD32是只有一个I2C资源的,大家在选型的时候要注意下。并且默认脚是PB6和PB7,可以重映射到PB8和PB9上;打开I2C0的重映射功能需要两步:
1.打开重映射时钟rcu_periph_clock_enable(RCU_AF);
2.重映射I2C0使能gpio_pin_remap_config(GPIO_I2C0_REMAP,ENABLE)
这两个步骤非常重要,笔者就是没有打开重映射时钟,导致I2C0一直运行不起来,直到打开后就好了。
I2C时钟配置
I2C引脚配置完成后,需要对I2C0的时钟进行配置。
GD32的I2C0时钟有两种模式,标准模式和快速模式。
在标准模式下,Thigh = Tlow = CLKC*TPCLK1
在快速模式下,DTCY=0,Thigh = CLKC*TPCLK1 Tlow = 2*CLKC*TPCLK1
DTCY=1,Thigh = 9*CLKC*TPCLK1 Tlow = 16*CLKC*TPCLK1
这里需要关注CLKC的值,CLCK=PCLK/(Speed*倍数),倍数为Thigh和Tlow之和,如标准下,倍数为2;快速模式下,DTCY=0,倍数为(1+2)=3;DTCY=1,倍数为(9+16)=25。PCLK=SYSCLK/2=108MHz/2=54MHz。
GD给的库函数是不需要直接写标准模式或快速模式的,它是根据填写的Speed去判定为标准模式或快速模式;小于等于100000(100K)以下就认为标准模式,小于等于400000(400K)以下认为是快速模式。
GD提供的库函数为i2c_clock_config(uint32_i i2c_periph,uint32_t clkspeed,uint32_t dutycyc)
i2c_periph是I2C0或I2C1
clkspeed就是计算CLKC填写的速率
dutycyc是快速模式下DTCY的值,0或1
更多详细内容请下载附件查看
|
|