スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

TWI(I2C)の制御に嵌る(陥る)

ラジオIC(RDA5800C)の制御にはI2Cを使用します。以前、汎用ポートのDDRを変更することによる簡易I2Cバスを作った事があるが、ATmega168PにはTWIというI2C相当の機能があるのでこれを使ってみることにしました。

TWI機能…なかなか難しいです。全て割込みで処理待ちできるように作られてますが、よ~く考えた構成にしないととてつもなく陥ります。I2Cは各種デバイスによってステータス間の待ち時間が微妙に違ったりするので、それを考慮した割込み制御式の汎用ドライバは難い。どうにかならないか考えに考えたが、使ってみる事を優先して、今回は割込みなしで作る事にしました。

最初は安直に考えていたI2C制御ですが、嵌りました。orz
いきなり使ったことのない物同士(TWI, RDA5800C)の組み合わせはマズイと思い、スレーブデバイスを秋月のリアルタイムクロックモジュール(RTC-8564NB)にしました。これは何回かテスト用に使ったことがあります。にも関わらず、嵌ってしまいました。

先ず、手抜きをしてマイコン内部のプルアップ抵抗ですまそうとしたのが間違いでした。いくらコマンドを送ってもウンともスンとも反応がありません。オシロを使って波形を見ると、波形の立ち上がりエッジが見事に鈍ってました。そりゃそうです。2.2kΩ付近でプルアップするところを20~60kΩの内部抵抗で賄おうとしてたのですから。2.2kΩを外付けすると見事な矩形波になりました(このモジュールはプルアップ用の抵抗が付いていて、パターンをショートさせるだけでプルアップできるのですが、それはやりたくなかった)。

次に、I2Cの各期間をちゃんと設定していなかったため、制御できてなかったのです。TWI機能が色々と裏で動いてくれるかな~と淡い期待をしていたのが間違いで、待つところはしっかり自分で待ってやらないと駄目です。基本的に待つ位置は以下のパターンです。

 ・'S'からアドレス送信の間
 ・'P'前の期間
 ・'P'から'S'の間
 ・'R'前の期間
 ・'R'からアドレス送信の間

  'S': STARTコンディション
  'P': STOPコンディション
  'R': ReSTARTコンディション

待ち時間の件は エレキジャック のサンプルを見ていた時に気がつきました。

これらを乗り越え、ようやく出来たのが以下のプログラムです。デバイスに依存する部分は後で見たときに分りやすいように設定用ファイルへ移動しました。

rtc_twi.zip

こんな感じに動いてます。

RIMG0122.JPG

スポンサーサイト

コメントの投稿

非公開コメント

黒ねこ時計 くろック D02
プロフィール

jujurou

Author:jujurou
運営HP:チャコの部屋
Twitter:jujurou

カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
最新記事
最新コメント
カテゴリ
ユーザタグ

ぺるけ RaspberryPi Linux トランジスタ式ミニワッター TRminiWatterPart4 MPD OpenOCD イーサネットコンバータ FON2405E DAC buildroot FM3ペリフェラル BeagleBoneBlack FM3評価ボード library OpenGL mingw ODROID-U2 TL-WR700N Edison bitbake KiCad 計測 VMware シングル FM4 ミニワッター 6N6P プリアンプ 

月別アーカイブ
ランキング

FC2 Blog Ranking

カウンター
検索フォーム
リンク
RSSリンクの表示
QRコード
QRコード
ライセンス
クリエイティブ・コモンズ・ライセンス
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。