打印
[STM8]

STM8S的I2C时钟问题?

[复制链接]
6126|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzhihai1986|  楼主 | 2011-11-15 16:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
香主,我遇见一个问题,I2C时钟设置成100KHz,但用示波器上显示的是200KHZ,调试时CCR寄存器里的值是40,FREQ里是8,理论计算是100KHZ,但实际不是,为什么啊,求解......
沙发
香水城| | 2011-11-15 17:00 | 只看该作者
说说你是怎么计算的?

使用特权

评论回复
板凳
dfsa| | 2011-11-15 18:22 | 只看该作者
可能是计算错了

使用特权

评论回复
地板
gudujiangren| | 2011-11-16 08:38 | 只看该作者
我想问个问题,lz分频了吗

使用特权

评论回复
5
wangzhihai1986|  楼主 | 2011-11-18 17:01 | 只看该作者
用的是官方的库函数,FREQ里是4时,理论应该是100KHZ的,示波器上显示是400KHZ,只有把FREQ里写入16时,示波器上测得的才正确,不知为什么。
        I2C_Init(100000, //100khz.
                         0xa0, //address.
                         I2C_DUTYCYCLE_2, //50% duty cycle.
                         I2C_ACK_CURR,
                         I2C_ADDMODE_7BIT,
                         16); //16MHz input clock.
这是直接调用库函数的。

使用特权

评论回复
6
香水城| | 2011-11-18 18:17 | 只看该作者
要看你板上的晶振频率是多少。

使用特权

评论回复
7
guanggaoren| | 2011-11-21 09:22 | 只看该作者
怎么分频的?

使用特权

评论回复
8
wangzhihai1986|  楼主 | 2011-11-22 09:21 | 只看该作者
晶振是16MHZ的,内部主时钟也是16MHZ

使用特权

评论回复
9
shuaibaobao| | 2011-11-26 15:57 | 只看该作者
计算有问题提吧。

使用特权

评论回复
10
mengjicheng| | 2012-11-28 14:42 | 只看该作者
能不能告诉怎样个寄算过程,一直对设置不是很理解

使用特权

评论回复
11
明月小厨| | 2012-12-2 00:29 | 只看该作者
I2C的SCL频率设定:相关的寄存器是二个8位的寄存器,拼在一起组合一个16位的寄存器(高低字节);
注:有的编译器要求高低字节分别写入的;我不知道是写的时候有要求还是读的时候有要求;

使用特权

评论回复
12
明月小厨| | 2012-12-2 00:33 | 只看该作者
本帖最后由 明月小厨 于 2012-12-2 00:51 编辑

D15:这个16位寄存器的最高位,F/S = 0;标准模式(低速)
D14:高速模式的占空比.随便设,0或1;
D14:=0
D13:=0
D12...D0;这里是关键点,设D12-D0 = n;则你的I2C_SCL的频率 = Fck/n;
Fck是I2C设备的频率,从主频分过来的;
Fck = 1MHZ ; (设 I2C_FREQR =1;)
然后 I2C_CCRL=10;

使用特权

评论回复
13
明月小厨| | 2012-12-2 00:59 | 只看该作者
香主,我遇见一个问题,I2C时钟设置成100KHz,但用示波器上显示的是200KHZ,调试时CCR寄存器里的值是40,FREQ里是8,理论计算是100KHZ,但实际不是,为什么啊,求解......
FREQ里是8;对应I2C时钟就是8MHZ;如果是1就是1MHZ,如果是2就是2MHZ......
CCR = 40;按上面的计算公式,8MHZ/40= 200KHZ;

你100KHZ是怎么计算出来的?:@:@:@:@

使用特权

评论回复
14
明月小厨| | 2012-12-2 01:32 | 只看该作者
如果我们知道主频是16MHZ,然后计算分频数,得到我们需要的频率;
可是 I2C_FEQR的低5位直接设你需要的频率值;如果我的主频不是16MHZ,而是12MHZ,这样设也有效吗?奇怪;
楼主调用的库函数我已经看过了,没有错.100KHZ也是你希望得到的结果,让函数内部帮你自动去设定.
但过程真的太复杂了.还是操作寄存器省事.

使用特权

评论回复
15
明月小厨| | 2012-12-2 01:53 | 只看该作者
100KHZ是你要的结果,这个不会有问题;另一个影响的参数是16(16MHZ);这是有可能出错的地方;
如果你是用HSI,相关的CLK_CKDIVR如果是1,就是16MHZ,如果是2,就是8MHZ;
此时系统主频是8MHZ的时候,但你却误以为是16MHZ,如果是样,你最后得到的结果应该是50KHZ才对,但你观察到的200KHZ是怎么回事?

还有一种解释就是你观察波形的时候,看的是半波(半个周期).

使用特权

评论回复
16
东海龙子| | 2013-9-21 23:34 | 只看该作者
你们说的什么库函数哪里有啊?我什么看不懂?我现在弄主I2C都弄不出来,谁有例子能否给我看下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:熟练掌握STM32F系列芯片,USB和以太网都可以做,要外包的可以联系我(QQ:594378180)。

21

主题

333

帖子

2

粉丝