4754|0

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STM32 I2C 的一个奇怪问题 [复制链接]

调试一块电路板时发现些问题,希望与大家一起探讨一下。
 
首先声明一下,我是在调I2C时发现的问题,晶振8M,核工作在72M,I2C总线目前工作在100K,一切正常,但是我感觉程序是有问题的。
 
(1)
  
   原程序作者在配置时钟时,对APB1和APB2都选择了不分频,这是我的第一个疑问,APB1不分频的话岂不是工作在72M,这与文档中最大工作在36M冲突。那么APB1总线到底是工作在了36M还是错误设定的72M?
 
(2)发现I2C初始化以后,CR2显示为0x00000008   
   程序是这样的,仿真跟了一遍:
      
    /* Get the I2Cx CR2 value */
    tmpreg = I2Cx->CR2;                                               ①  tmpreg  = 0
    /* Clear frequency FREQ[5:0] bits */
    tmpreg &= CR2_FREQ_Reset;
    /* Get pclk1 frequency value */
    RCC_GetClocksFreq(&rcc_clocks);
    pclk1 = rcc_clocks.PCLK1_Frequency;                         ②  pclk1 = 72000000   估计和时钟的错误设定有关 
    /* Set frequency bits depending on pclk1 value */
    freqrange = (u16)(pclk1 / 1000000);                           ③  freqrange = 72
    tmpreg |= freqrange;                                               ④  tmpreg = 72
    /* Write to I2Cx CR2 */
    I2Cx->CR2 = tmpreg;                                               ⑤ CR2 = 0x00000048 ,由于FREQ[5:0]只有6位,地7位是强制置0的,所以相当于赋值为 0x00000008,
 
                                                                                        也就是截图反应的情况。
 
这就与手册中的描述发生了冲突,手册中说“必须设置正确的输入时钟以产生正确的时序”,而我现在错误计算输入的时钟是8,实际工作应该是36M吧(或许是我疑问的72M),而且我也尝试给他赋36,工作也是正常的。为什么这个设错了的输入时钟怎么一点影响都没有呢,还是说硬件根本就不看你设的值,而是根据它实际检测到的APB1时钟为准?
 
 
 
(3)我原来的理解是FREQ[5:0]输入了正确的I2C输入时钟,再根据CCR寄存器中CCR[11:0]设定的分频值对输入时钟进行分频,最终在SCL上输出想要的100K总线时钟,既然FREQ输错了,那么CCR会怎样呢?于是我又看了看CCR的程序。
 
if (I2C_InitStruct->I2C_ClockSpeed <= 100000)
    {
        /* Standard mode speed calculate */
        result = (u16)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1));    ①result = 360,也就是说计算时,pclk1还是按72000000算的
        /* Test if CCR value is under 0x4*/
        if (result < 0x04)
        {
            /* Set minimum allowed value */
            result = 0x04;  
        }
        /* Set speed value for standard mode */
        tmpreg |= result;   
        /* Set Maximum Rise Time for standard mode */
        I2Cx->TRISE = freqrange + 1; 
    }
 
   实际测试一下SCL的波形,确实是100K,尝试赋值时改变result的值,发现改小的话SCL波形频率会升高。看来最终的波形是由这个值决定的,那么我算这个值时,APB1的频率可是按72M算的啊,最后结果正确,难道APB1真的工作在72M?
[ 本帖最后由 vipsongyan 于 2011-8-14 16:27 编辑 ]
此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表