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

查看: 6931|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版