前几天使用STM8S103K3调AT24C256,用到它的硬件I2C,遇到不少问题,查了很多资料,终于是调通了。
以下是以标准模式(即100KHz)的设置为主的I2C初始化配置的一些问题。
(1)I/O的配置问题。
无需对I/O口引脚处理。
如果I2C的两个接口引脚在事先没有被用作其他用途,仍保持着复位后默认状态,则不需要对其处理。
因为使用硬件I2C时,其对应的两个接口引脚需要被配置为浮空输入,而初始复位时,所有引脚均被设置为浮空输入。
即Px_CR1复位值为0x00
(2)I2C时钟频率等配置
I2C_FREQR = 系统时钟频率(单位:MHz)
I2C_TRISER = I2C_FREQR + 1
I2C_CCR = 系统时钟频率 / (I2C输出频率 * 2)(单位:Hz)
I2C_FREQR为I2C模块的输入时钟频率,一般即为时钟频率,注意单位为MHz,即如果系统时钟为16MHz,
则I2C_FREQR = 0x10
I2C_TRISER 本意为主模式时的最大上升时间,与I2C_FREQR有关。
标准模式中SCL最大允许的上升时间为1000ns,那么Tpclk1 = 1000 / I2C_FREQR,而I2C_TRISER = 1000ns / Tpclk1 + 1
虽然这里的式子有点绕,但最终得结果其实很简单,就是I2C_FREQR + 1而已。
I2C_CCR 时钟控制,标准模式中,Thigh = CCR * Tck;Tlow = CCR * Tck;I2C通信频率fscl = 1/(Thigh + Tlow);
即100KHz = 1 / ( 2 * CCR * Tpclk1 );Tpclk1在上面以介绍,Tpclk1 = 1000 / I2C_FREQR,通过化简最终可得到
I2C_CCR = 系统时钟频率 / (I2C输出频率 * 2)(单位:Hz)
(3)初始化I2C
以STM8S103K3为例,时钟频率16MHz,I2C标准模式100KHz,初始化函数:
void IIC_Init(void)
{
I2C_CR1 = 0x00; //禁止I2C外设
I2C_FREQR |= 0x10; //输入时钟频率16M
I2C_TRISER = 0x11; //0x10 + 1
I2C_CCRL = 0x50; //16M / 100K / 2
I2C_CCRH = 0x00;
I2C_CR1 |= 0x01; //开启I2C外设
I2C_CR2 |= 0x04; //应答使能
I2C_OARL = 0x50; //自身地址
I2C_OARH = 0x00;
}
在初始化前需先关闭I2C功能,禁止其使用,在那寄存器配置完后才使能I2C。手册上写的是必须禁止了才能写一些寄存器。虽然复位后I2C就是被禁止的。但一些历程里面,复位PE一般会写在I2C_FREQR配置的后面,程序仍能使用,不明白为什么。
自身地址,若不需要就忽略吧,这个可写在I2C使能之后。
关于STM8S的I2C初始化配置,鄙人的浅谈就到此结束,若有时间功夫,会补上I2C的使用问题。