GD32的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一贯运行不起来,直到打开后就好了。
I2C0的重映射功能
那么如何是否打开了重映射功能呢,大家可以通过查看重映射寄存器AFIO_PCF0。I2C0_REMAP为1,表示已经打开了I2C0的重映射功能。
AFIO_PCF0寄存器
I2C时钟配置I2C引脚配置完成后,须要对I2C0的时钟进行配置。
GD32的I2C0时钟有两种模式,标准模式和快速模式。
在标准模式下,Thigh = Tlow = CLKCTPCLK1
在快速模式下,DTCY=0,Thigh = CLKCTPCLK1 Tlow = 2CLKCTPCLK1
DTCY=1,Thigh = 9CLKCTPCLK1 Tlow = 16CLKCTPCLK1
I2C0的时钟
这里须要关注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或I2C1clkspeed便是打算CLKC填写的速率dutycyc是快速模式下DTCY的值,0或1
不同的CLCK对应的高低电平
如上是笔者利用的快速模式,DTCY=0配置,发送了一个start旗子暗记(SCL为高时,DSA由高变低);Speed的值分别为400K和200K,对应的Thigh分别为54MHz/(4000003)/54MHz=830ns和54MHz/(2000003)/54MHz=1.666us,Tlow为Tigh2,频率分别为1/830ns3=361K和1/1.666us3=180K,与示波器抓的波形是非常靠近的。
快速模式下大家一定要把稳两点,1.Thigh与Tlow的韶光是不一致的,为1:2或者9:16;2.高电平保持韶光很小;大家把稳看波形,Speed的值为400K时,高电平基本没有保持韶光,这种时序是非常危险的,有可能从机收到会认为非常,这样I2C时序读写是非常不稳定的。由于笔者只是读取EEPROM,不须要太快的速率,以是终极选取了标准模式,Speed为20000(20K)。Thigh与Tlow相等,25us。
标准模式20K的I2C起始旗子暗记波形图
结语
GD32F107系列的硬件I2C就先容到这里,紧张是引脚配置和时钟选择,昔时夜家通过示波器能看到起始旗子暗记时,表示I2C旗子暗记已经调通了,之后根据读写协议收发数据即可。下一章节我们将讲述利用硬件I2C去读写EERPOM芯片AT24C64的过程;关注我,一起学习嵌入式专业知识。有什么想谈论的,请在评论区给我留言吧,感激大家!










