Armadilloフォーラム

Armadillo-440のI2C通信速度設定につきまして

dda-isk.kobbysi_19

2016年8月5日 9時54分

株式会社グリーンハウスの小林と申します。
こちらには初めて投稿させて頂きます。
どうぞよろしくお願い致します。

基本的な質問で大変申し訳ないのですが、Armadillo-440において、
I2CをGPIOでエミュレーションして使用している場合、
I2C通信速度の設定は、どのように行えば宜しいのでしょうか。

標準のI2Cバスドライバーの場合、440のソフトウェアマニュアルに
"/arch/arm/mach-mx25/armadillo400.c" への設定例の記載が
御座いましたが、GPIOでエミュレーションしている際の
I2C通信速度の設定手順を発見できませんでした。

「Armdillo実践開発ガイド第3部」など、関連するドキュメントにも
発見できませんでした。

何かご存じの方がおられましたら、どうかご教示の程を
何卒、よろしくお願い致します。

コメント

y.nakamura

2016年8月5日 11時27分

中村です。

> "/arch/arm/mach-mx25/armadillo400.c" への設定例の記載が

このソースを見ているということは、
カーネルは2.6.26系ですね。

> 御座いましたが、GPIOでエミュレーションしている際の
> I2C通信速度の設定手順を発見できませんでした。

参考として、armadillo400.cの95行目あたりに、
Armadillo-460でのi2c-gpioの設定があります。

static struct i2c_gpio_platform_data armadillo460_ext_i2c_data = {
        ...
        .udelay = 5,
        ...
};
 
static struct platform_device armadillo460_ext_i2c_device = {
        .name = "i2c-gpio",
        .id = ARMADILLO460_EXT_I2C_ID,
};

このudelayが通信速度の指定で、
include/linux/i2c-gpio.hに次の説明があります。

 * @udelay: signal toggle delay. SCL frequency is (500 / udelay) kHz

--
なかむら

dda-isk.kobbysi_19

2016年8月8日 10時21分

いつもお世話になっております。
株式会社グリーンハウスの小林です。

I2C通信速度の設定方法をご教示頂き、ありがとうございました。

教えて頂いた ".udelay" を変更して動作確認致しました。
ですが、結果に疑問がありまして、再度ご教示を頂けますようお願い致します。

".udelay" を変更してI2Cの波形を確認したところ、以下の結果になりました。

 ・.udelay = 5:83kHz
 ・.udelay = 2:158.7kHz
 ・.udelay = 1:200kHz

ご教示頂いた情報通り、"include/linux/i2c-gpio.h" の説明には「(500 / udelay) kHz」と
記述されていたのですが、上記の結果とは食い違っておりました。

通信速度を「400kHz」に設定したいと考えているのですが、
GPIOエミュレーションの場合は「200kHz」が上限なのでしょうか。
他に設定が必要な領域があるのでしょうか。

ご存じのことがございましたら、どうかご教示のほどを何とぞよろしくお願い致します。

> 中村です。
>
> > "/arch/arm/mach-mx25/armadillo400.c" への設定例の記載が
>
> このソースを見ているということは、
> カーネルは2.6.26系ですね。
>
> > 御座いましたが、GPIOでエミュレーションしている際の
> > I2C通信速度の設定手順を発見できませんでした。
>
> 参考として、armadillo400.cの95行目あたりに、
> Armadillo-460でのi2c-gpioの設定があります。
>

> static struct i2c_gpio_platform_data armadillo460_ext_i2c_data = {
>         ...
>         .udelay = 5,
>         ...
> };
> 
> static struct platform_device armadillo460_ext_i2c_device = {
>         .name = "i2c-gpio",
>         .id = ARMADILLO460_EXT_I2C_ID,
> };
> 

> このudelayが通信速度の指定で、
> include/linux/i2c-gpio.hに次の説明があります。
>

>  * @udelay: signal toggle delay. SCL frequency is (500 / udelay) kHz
> 

>
> --
> なかむら
>

y.nakamura

2016年8月8日 11時56分

中村です。

> ".udelay" を変更してI2Cの波形を確認したところ、以下の結果になりました。
>
>  ・.udelay = 5:83kHz
>  ・.udelay = 2:158.7kHz
>  ・.udelay = 1:200kHz
>
> ご教示頂いた情報通り、"include/linux/i2c-gpio.h" の説明には「(500 / udelay) kHz」と
> 記述されていたのですが、上記の結果とは食い違っておりました。

単純に考えて(実際はもっと複雑なようです:後述のソースを見てください)、
SCL信号の上げ下げの"待ち"にudaley()関数を使っていて、
設定したudelay値をudelay()に渡しているとすれば、
たとえば、udelay=1のとき、SCL=HIGHにして1usec待ち、
SCL=LOWにして1usec待つと1周期が2usecなので、
周波数は500kHzになります。

ですが実際は、仮にudelay()が正確だとしても、
関数呼び出しのオーバーヘッドがありますので、
udelay(1)とやっても1usecでは終わりません。
udelay()はソフトウェアループで実装されている
はずですので、どのくらい正確かもわかりません。

i2c-gpioの実装は、カーネルソースの
drivers/i2c/algos/i2c-algo-bit.cだと思います。
(そんなに大きなソースではないので、
一度ご覧になることをお勧めします)

このソースをみると、SDAの上げ下げ(出力の場合)、
SCLの上げ下げのあちこちにudelayが使われいます。
ヘッダの説明は「(500 / udelay) kHz」でも、実際は
そうはなっていない、ということだと思います。

> 通信速度を「400kHz」に設定したいと考えているのですが、
> GPIOエミュレーションの場合は「200kHz」が上限なのでしょうか。

そういうことだと思います。

> 他に設定が必要な領域があるのでしょうか。

ソースを見た限りでは、なさそうです。

--
なかむら