在线时间0 小时
UID302946
ST金币0
蝴蝶豆0
注册时间2008-7-16
新手上路
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
调试一块电路板时发现些问题,希望与大家一起探讨一下。
首先声明一下,我是在调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 |
|