Armadilloフォーラム

I2C 速度変更

y-otuki

2015年3月2日 22時19分

Armadillo840を使用しています。

製品マニュアルの「8.3.18.I2C」にI2C0の最大転送レートが400kbpsと記載されているのですが。
100kHzでしか通信してくれません。

ご存じの方がおられましたら、ご教授お願いします。

以上

コメント

at_takashi.sasayama

2015年3月4日 14時50分

笹山です。

> 製品マニュアルの「8.3.18.I2C」にI2C0の最大転送レートが400kbpsと記載されているのですが。
> 100kHzでしか通信してくれません。

Armadillo-840 で i2c転送レートを 400kHz に設定するには、
以下の変更を行ってみてください。

この例では、i2c0 と i2c1 を両方とも、100kHz から 400kHz へ変更しています。

■変更対象のファイル
atmark-dist/linux-3.x/arch/arm/mach-shmobile/setup-r8a7740.c

 #include <linux/dma-mapping.h>
+#include <linux/i2c/i2c-sh_mobile.h>  /* 追加します */
 #include <mach/dma-register.h>
 :
 
/* 575行目付近 */
+static struct i2c_sh_mobile_platform_data i2c0_platform_data = {
+       .bus_speed = 400000,
+};
+
+static struct i2c_sh_mobile_platform_data i2c1_platform_data = {
+       .bus_speed = 400000,
+};
+
 static struct platform_device i2c0_device = {
        .name           = "i2c-sh_mobile",
        .id             = 0,
        .resource       = i2c0_resources,
        .num_resources  = ARRAY_SIZE(i2c0_resources),
+       .dev            = {
+               .platform_data  = &i2c0_platform_data,
+       },
 };
 
 static struct platform_device i2c1_device = {
        .id             = 1,
        .resource       = i2c1_resources,
        .num_resources  = ARRAY_SIZE(i2c1_resources),
+       .dev            = {
+               .platform_data  = &i2c1_platform_data,
+       },
 };

添付ファイルは上記の変更をパッチにしたものです。
atmark-dist/linux-3.x に格納後、以下のコマンドで適用できます。

atde5:~/atmark-dist/linux-3.x$ patch -p0 < linux-3.4-at11-i2c-400khz.patch 
ファイル ファイルの説明
linux-3.4-at11-i2c-400khz.patch linux-3.4-at11用 i2c0

笹山さま

ご教授、ありがとうございます。
無事、400kHzでI2CのEEPROMを操作することが出来ました。