浅谈STM8S(1)——I2C配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014397533/article/details/46495905

前几天使用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的使用问题。

展开阅读全文

没有更多推荐了,返回首页