历史上的今天
返回首页

历史上的今天

今天是:2025年05月31日(星期六)

2018年05月31日 | 浅谈STM8S(1)——I2C配置

2018-05-31 来源:eefocus

前几天使用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,初始化函数:


  1. void IIC_Init(void)  

  2. {  

  3.   

  4. I2C_CR1    = 0x00; //禁止I2C外设  

  5. I2C_FREQR |= 0x10; //输入时钟频率16M  

  6.   

  7. I2C_TRISER = 0x11; //0x10 + 1  

  8. I2C_CCRL   = 0x50; //16M / 100K / 2  

  9. I2C_CCRH   = 0x00;   

  10.   

  11. I2C_CR1   |= 0x01; //开启I2C外设  

  12.   

  13. I2C_CR2   |= 0x04; //应答使能  

  14.   

  15. I2C_OARL   = 0x50; //自身地址  

  16. I2C_OARH   = 0x00;  

  17.   

  18.   

  19. }  

在初始化前需先关闭I2C功能,禁止其使用,在那寄存器配置完后才使能I2C。手册上写的是必须禁止了才能写一些寄存器。

虽然复位后I2C就是被禁止的。但一些历程里面,复位PE一般会写在I2C_FREQR配置的后面,程序仍能使用,不明白为什么。

自身地址,若不需要就忽略吧,这个可写在I2C使能之后。

关于STM8S的I2C初始化配置,鄙人的浅谈就到此结束,若有时间功夫,会补上I2C的使用问题。

推荐阅读

史海拾趣

问答坊 | AI 解惑

可使用组合键的4*4按键扫描

可以读取任意按下的1~2个键。 …

查看全部问答>

做成用电话线电源接口的LED灯大家以后都不用交照明电费了呵呵

现在世面上已经有很多用电话线接口做成的LED台灯,家庭照明灯等,这样的话电费就不用自己交了。我也想自己DIY一个呢,用的多的话,不知道这样的话合法啊,欢迎大家讨论呵呵…

查看全部问答>

在开发嵌入式数据库时, CreateProcess(_T("\RegSvrCe" ,_T("/s \Windows\\adoce31.dll" ,NULL ..

把adoce31.dll拷贝到Windows, CreateProcess(_T(\"\\RegSvrCe\" ,_T(\"/s \\Windows\\\\adoce31.dll\" ,NULL .... 这个在wince.net 4.2以及wm5.0上面还不能正常使用 这个问题如何解决.…

查看全部问答>

0

攒分赚人品谢谢清洁工和大兔子…

查看全部问答>

如何将EXIT0中断优先级设置最高??

                                 如何将EXIT0中断优先级设置最高??能 MemManage还高吗?怎么设置?求教…

查看全部问答>

CCS 的FFT仿真问题

编辑时,调用失败,附带源码,望各位高手赐教!帮小弟找出问题,不胜感激!…

查看全部问答>

很有意义的一天

在2013年的第一天,能够遇到eeworld是一件多么幸福的事情啊。…

查看全部问答>

影响热电偶工作的重要因素

热电偶温度传感器具有测量范围宽、精度高以及响应时间快等优点,所以得到广泛的使用。本篇文章主要探讨影响热电偶温度传感器测量的因素,归纳起来,主要有以下几点:  插入深度   热电偶测温点的选择是最重要的。测温点的位置,对于生产工艺 ...…

查看全部问答>

广播和功耗模式

        想做一个功耗管理的实验,想着用什么方法验证功耗模式是不是设置成功。想到AF_DataRequest发送函数,广播时网络地址设置为0xFFFD时表示将数据包只发往未处于休眠状态的节点。所以就想着如果我节点设置为PM1 ...…

查看全部问答>