你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 6892|回复: 3

STM32 I2C 的一个奇怪问题

[复制链接]

5

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2011-8-14 16:25:22 | 显示全部楼层 |阅读模式
调试一块电路板时发现些问题,希望与大家一起探讨一下。
 
首先声明一下,我是在调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 I2C_ClockSpeed 
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-8-15 09:10:43 | 显示全部楼层

RE:STM32 I2C 的一个奇怪问题

这个和I2C芯片有关系,比如E2,他的工作范围是100K-400K,如果你的时钟改变,只要在这个范围内都能够正常通讯。
回复 支持 反对

使用道具 举报

5

主题

9

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2011-8-15 14:08:53 | 显示全部楼层

回复:STM32 I2C 的一个奇怪问题

回复第 2 楼 于2011-08-15 01:10:43发表:
这个和I2C芯片有关系,比如E2,他的工作范围是100K-400K,如果你的时钟改变,只要在这个范围内都能够正常通讯。 

版主您好,其实归根结底我的问题里最关键有两点:
(1)APB1是不是真能工作在72M,我错误的设置了72M,他真的会工作在这个频率吗?
(2)FREQ[5:0]的设定值有什么用,手册上写的挺坚定的“必须正确设定”,而我明明写错了而且随便写个数他好像也没有影响呢。
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-8-15 17:01:13 | 显示全部楼层

RE:STM32 I2C 的一个奇怪问题

1、PPRE1[2:0]:低速APB预分频(APB1) (APB low-speed prescaler (APB1)) 位10:8 由软件置’1’或清’0’来控制低速APB1时钟(PCLK1)的预分频系数。 警告:软件必须保证APB1时钟频率不超过36MHz。
0xx:HCLK不分频
100:HCLK 2分频
101:HCLK 4分频
110:HCLK 8分频
111:HCLK 16分频
这个设置取3位,所以,他最大只能工作在36Mhz,如果你设置错误,他就会按照默认的频率走。0xx:HCLK不分频
2、必须设置正确的输入时钟频率以产生正确的时序,允许的范围在2~36MHz之间:
最小值2,最大值36,关闭,只有这2种情况,你肯定不会超出范围的。
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版