2012/08/05

[fm3]I2Cが動かんのはプルアップ抵抗の値か

FM3基板のI2C。
サンプルドライバはFRAMアクセスするようになっているので、動かしてみた。

・・・動く。
割込がちゃんと入ってくるし、ACKも確認できている。

FRAMは、SOT1_0 / SCK1_0を使っている。
じゃあ、SOT1_2 / SCK1_2に差し替えればとりあえず動くのかな?

・・・動かない。
割込が入ってこない。
ソフトは同じで、変更したのはポートだけだ。

では、未接続のSOT6_1 / SCK6_1にしてみたら?
・・・割込が入ってきた。
未接続だからエラーなんだけど、割込は来る。

ではでは、SOT6_1/SCK6_1にLCDを接続すると?
・・・割込が入ってこない。

 

つまり、接続する相手のせいで割込が入ってこないようになっているのだ。
うーん、その可能性は考えてなかったなぁ。


LCDの型番で検索
うーん、みんな22kΩくらいのプルアップ抵抗だなぁ。
ストロベリーリナックスさんのページには、20kΩ以上で100kΩでもいい、くらいなことを書いていたように思う。
なので47kΩのを使っていたのだが・・・。

 

私も20kΩくらいの抵抗を探し出し、つないだ。

image

出るやん・・・。
プルアップ抵抗って、そんな微妙なものなのか・・・。

では、設定をやり直して。。。

image

わーい。
素直に嬉しい。

プルアップ抵抗なんてエッジがなまらない程度にしておけばいいんだろうと思ってたけど、神秘の深淵を除いた気持ちである(おおげさ)。

4 件のコメント:

  1. そうそう、サンプルのiic.cはマクロのifdefがUART_LOCになってるので注意だ。
    I2C_LOCが正しいですね。

    返信削除
  2. はじめまして、突然の書き込み大変失礼致します。
    同じ悩みで困り果てておりまして、もしご助言頂ければ幸いです。
    (恥ずかしながら、オシロを所有していないため波形の確認ができていません)

    ・本サイトを拝見し、プルアップ抵抗いろいろ変えてやってみましたが、
     いずれもNG。(2KΩ、10KΩ、22KΩ、45KΩ、67KΩ)
    ・ついでに接続先も変更してみましたが、これもNG。
     (SOT2_0&SCK2_0、SOT3_0&SCK3_0)
    ・他のI2Cセンサー(FRAMや加速度センサーや温度センサー)は問題なく
     動作しており、他のI2Cセンサーのプルアップ抵抗が関与していることも
     疑い、他のI2Cセンサーは排除して行ったがこれもNG。
    ・初期化手順は、ストベリさんのところにあったサンプルコードを参考に
     ディレイを入れつつ以下のような感じで初期化を行っています。
     以下シーケンスもいろいろ変化させながら行ってはいますが今の所NGです。
    /* ここから初期化 */
    wait_40ms()
    i2c_write(0x3e,0x00,0x38) /* 26usをはさみつつ */
    i2c_write(0x3e,0x00,0x39)
    i2c_write(0x3e,0x00,0x14)
    i2c_write(0x3e,0x00,0x70 | (0x30 & 0xf))
    i2c_write(0x3e,0x00,0x5c | (0x30 >> 4 & 3))
    i2c_write(0x3e,0x00,0x6b)
    wait_300ms()
    i2c_write(0x3e,0x00,0x38)
    i2c_write(0x3e,0x00,0x0c)
    i2c_write(0x3e,0x00,0x01)
    wait_2ms()
    /* ここまで初期化 */
    i2c_print(0x3e,0x40,0x41) /* Aを表示させたい */

    <蛇足>
     実は、ストベリさんのRTC(I2C)もなぜか動作せず、秋月さんのRTC(I2C)では
     なぜか動作しています。単に私の力量の無さですが、、、

    返信削除
  3. 私はあまりハードに強くないので、そっち方面はよくわかりません。。
    うちの回路図は、こうなっています。
    https://github.com/hirokuma/toppers_rcs956_sample/blob/master/doc/fm3_rcs620s.PNG


    他のI2C機器は動くということなので、FM3での制御はできているのでしょう。
    となると、あとはST7032iの初期化とか、やはりちゃんと波形が出ていないとか、そういうところしか思い当たりません。
    私のST7032i初期化は、以下の109行目からです。
    _write_lcd()の最後の引数は、送信後の待ち時間で、単位はmsecです(usecのタイマを作っていないので)。
    初期化の最後にENTRY MODE SETしているくらいでしょうか。

    https://github.com/hirokuma/toppers_rcs956_sample/blob/master/st7032i/st7032i.c

    参考になれば幸いです。

    返信削除
    返信
    1. ありがとうございます。とても参考になります!!
      回路図まで頂いて大変お手数おかけしました。

      ENTRY MODE SET(確か0x06?)は行ってみたのですが、
      やはりNGでした。
      私の回路との大きな違いは、リセットを行っているところ
      かと思います。(私は面倒だったのでVCCにしちゃってます)

      何をしても無反応で手ごたえがない感じだったので、
      同じ環境で動作している方がいるのは本当に心強かったです。
      ほとんど諦めかけていたんですが、もう少しがんばってます。
      (頂いた回路図とシーケンスを参考に見直してみます。)

      本当にありがとうございました。m(_ _)m

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。