查看: 11870|回复: 7

[已解决] kl02的i2c通讯速率达不到400khz

[复制链接]

该用户从未签到

3

主题

6

帖子

0

新手上路

Rank: 1

积分
39
最后登录
2017-12-28
发表于 2016-6-25 16:47:30 | 显示全部楼层 |阅读模式


因项目需要400k的i2c通讯速率,看了kl02的规格书说最大可支持到400k,使用sdk2.0的interrupt_transfer例程配置的400k速率,但实际用示波器看波形只跑到330khz。

测试设备:FRDM-KL02Z
程序:SDK_2.0_MKL02Z8xxx4\boards\frdmkl02z\driver_examples\i2c\interrupt_transfer\mdk
把源程序的速率由100k改为400k  #define I2C_BAUDRATE 400000U

#define EXAMPLE_I2C_MASTER_BASEADDR I2C0
#define EXAMPLE_I2C_SLAVE_BASEADDR  I2C1
#define I2C_MASTER_CLK_SRC I2C0_CLK_SRC
#define I2C_SLAVE_CLK_SRC I2C1_CLK_SRC
#define I2C_MASTER_IRQ I2C0_IRQn
#define I2C_SLAVE_IRQ I2C1_IRQn
#define I2C_MASTER_SLAVE_ADDR_7BIT 0x7EU
#define I2C_BAUDRATE 400000U


例程其他地方没做改动。
实际抓取波形如下图

实测i2c速率为330k

实测i2c速率为330k


求如何让i2c跑到400k?难道飞思卡的规格书也玩虚标?


最佳答案

小恩GG 发表于 2016-6-27 16:25 楼主你好! 我这边刚使用寄存器控制方式去实现I2C模块,因为SDK的代码比较冗余,不便于具体特性的测试。 目 ... SDK2.0 , FRDM_KL02 默认的sysClk是47.972352 M , bus/flash clock = ...
回复

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24863
最后登录
2025-7-18
发表于 2016-6-27 13:25:06 | 显示全部楼层
楼主你好!
看datasheet 关于达到400K的条件是有注释的:
The maximum SCL Clock Frequency in Fast mode with maximum bus loading can only achieved when using the High
drive pins (see Voltage and current operating behaviors) or when using the Normal drive pins and VDD ≥ 2.7 V
也就是只有使用高驱动能力的引脚,或者VDD大于2.7V。
关于高驱动引脚如下:
PTA12, PTA13, PTB0 and PTB1 I/O have both high drive and normal drive capability selected by the associated
PTx_PCRn[DSE] control bit. All other GPIOs are normal drive only.
所以,请楼主先检查下这些前提条件是否满足。
如果都满足了,你现在使用的系统时钟是多少?bus时钟是多少?
我这边会帮你检查下。
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

6

帖子

0

新手上路

Rank: 1

积分
39
最后登录
2017-12-28
 楼主| 发表于 2016-6-27 14:08:33 | 显示全部楼层
本帖最后由 zoe2000 于 2016-6-27 14:09 编辑
小恩GG 发表于 2016-6-27 13:25
楼主你好!
看datasheet 关于达到400K的条件是有注释的:
The maximum SCL Clock Frequency in Fast mode w ...



前面说了,我用的是sdk2.0的interrupt_transfer里的例程,只改了#define定义里的通讯速率,其他都默认的,sys=48M,bus=9.6M。


按你的说法,PTA12, PTA13, PTB0 and PTB1是high drive pin,但我看了规格书,这些pin都不能配置成I2C管脚的啊!!
这样的话,是不是KL02系列都跑不到400k了??

IO.jpg



回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24863
最后登录
2025-7-18
发表于 2016-6-27 14:51:56 | 显示全部楼层
zoe2000 发表于 2016-6-27 14:08
前面说了,我用的是sdk2.0的interrupt_transfer里的例程,只改了#define定义里的通讯速率,其他都默认的 ...

or when using the Normal drive pins and VDD ≥ 2.7 V
电压高于2.7V,也是可以的。
楼主先不着急,我这边待会测试下,按照手册是可以达到400K的。
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24863
最后登录
2025-7-18
发表于 2016-6-27 16:25:25 | 显示全部楼层
楼主你好!
我这边刚使用寄存器控制方式去实现I2C模块,因为SDK的代码比较冗余,不便于具体特性的测试。
目前可以实现400K或者的波特率。
测试模块I2C0,该模块的时钟源bus时钟,为23.98617Mhz.
波特率的计算公式为:
I2C baud rate = bus speed (Hz)/(mul × SCL divider)
由于bus时钟比较小,所以想得到高波特率400Khz,则mul × SCL divider也要相应的小,这里配置mul=1.
然后计算SCL divider
= 23986K/400K=59.9
而通过表格可以知道:
43.jpg
没有60选择,则选择就近的56,即ICR=0X11.
所以配置:
void hal_i2c_init(I2C_MemMapPtr p)
{
   // SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK;
   SIM_SCGC4 |= SIM_SCGC4_I2C0_MASK;
   
      // configure GPIO for I2C function
    PORTB_PCR3 = PORT_PCR_MUX(2);
    PORTB_PCR4 = PORT_PCR_MUX(2);

    p->F  = 0x11; // baudrate
     p->C1 = 0x80; // enable IIC
}

最后测试下来,I2C的波特率的确可以达到了400Khz
44.png
45.png

测试平台,同样是FRDM-KL02, 测试引脚,PTB3,PTB4
楼主你可以在你那边测试下这个特性。
如果还有问题,欢迎继续交流。
kl02-frdm-demo.rar (4.47 MB, 下载次数: 25)
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

6

帖子

0

新手上路

Rank: 1

积分
39
最后登录
2017-12-28
 楼主| 发表于 2016-6-29 12:49:43 | 显示全部楼层
小恩GG 发表于 2016-6-27 16:25
楼主你好!
我这边刚使用寄存器控制方式去实现I2C模块,因为SDK的代码比较冗余,不便于具体特性的测试。
目 ...

谢谢版主的耐心解答哈

回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24863
最后登录
2025-7-18
发表于 2016-6-29 13:35:04 | 显示全部楼层
zoe2000 发表于 2016-6-29 12:49
谢谢版主的耐心解答哈

不客气,后续有问题,欢迎继续发帖交流!
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

65

帖子

0

中级会员

Rank: 3Rank: 3

积分
233
最后登录
1970-1-1
发表于 2016-7-5 15:48:56 | 显示全部楼层
小恩GG 发表于 2016-6-27 16:25
楼主你好!
我这边刚使用寄存器控制方式去实现I2C模块,因为SDK的代码比较冗余,不便于具体特性的测试。
目 ...

SDK2.0 , FRDM_KL02 默认的sysClk是47.972352 M , bus/flash clock = 9.59M (至于为什么把BUS 设这么低, 谁知道。。。)
然后经过I2C_MasterInit(), 算出 ICR = 2 , MULT = 0 ;
注意!!!
手册里写的很清楚:
For some cases on some devices, the SCL divider value may
vary by +/-2 or +/-4 when ICR’s value ranges from 00h to 0Fh.

所以 波特率是  9.59M / (24-4) ~ 9.59M/(24+4) , 也就是 479K ~ 342 K
所以代码与实测现象是相符的。

另外, 对于几百K的频率,无论代码写的冗余,不至于影响这么大。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-19 01:29 , Processed in 0.105510 second(s), 29 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表