I2Cコントロール実験
●2007.8.20 ATmega168 I2C マスタースレーブ通信(400KHz)
1)マスターからスレーブへインクリメントデータを1バイト送る
WSN#172基板使用
マスターソース 2007.8.23(実験版)
スレーブソース 2007.8.23(実験版)
ヒューズビットのクロック選択は各自合わせてもらうようにコメント変更しました。スレーブのクロックはSCLの最低16倍必要なことをコメント追加しました。
本ソフトは、実験仕様のためエラーがあると永久ループに入るようになっています。そのため、マスターとスレーブは手動でほぼ同時にリセットして起動する必要があります。よってマスター、スレーブ共にリセットスイッチを付けてください。
スレーブは起動直後に受信体制になりますが、マスターは起動してから約1秒後に送信開始します。
通信エラーがあると2つのLEDが交互に点滅します。正常に1バイト通信できると2つのLEDが同時に1度点滅します。
LEDは以下のように2つ必要です。
LED1 PORTC0
LED2 PORTC1
2)マスターからスレーブへインクリメントデータを複数バイト送る(実験版)
今回はマスターから複数バイト送信をおこないます。またスレーブ側は割り込み処理だけにしました。その方が処理が簡単になるためです。それとマスターでエラーがあった場合、TWIを再初期化しています。エラー時はLED1、LED2の交互点滅3回おこないTWIを初期化して復帰させます。正常時はLED1、LED2が同時に点滅します。
マスターソース 2007.8.24(実験版)
スレーブソース 2007.8.24(実験版)
3)マスターからスレーブへwriteし、スレーブからreadする
今回はマスター側のi2c_read()関数とスレーブのデータ送信の割り込み処理を追加しました。write後にi2c_stopしないで、i2c_repeat_startもサポートしました。コメント修正してご使用ください。なおジェネラルコールアドレス、複数マスターは処理していません。必要なら追加をお願いします。
ループ1回で送信と受信をおこなっていますが、マスターのLED1、LED2は点滅1回で送信と受信としています。スレーブは送信、受信別々にLED1、LED2を点滅させるので2回点滅します。
マスターソース 2007.8.28(完成版)
スレーブソース 2007.8.28(完成版)
●2007.8.29 ATmega168 I2C IO拡張実験
WSN172(ATMega168マスター)
WSN176(MCP23017スレーブ)基板使用
WSNAKさんの基板を使用したI2C実験です。スレーブのMCP23017はIO拡張ICで、GPA0〜GPA7とGPB0〜GPB7の計16本のIOをマスターからI2C制御できます。
I2C関数は私が作成したものを使用しました。ただし、WSNAKさんのサイトにあったI2C制御パラメータを使用しています。これは、MCP23017の全IOを出力に設定して、HI/LOWトグルで切り替えるものです。今回のファームではループにして、2秒ごとにHIとLOWを切り替えています。マスターでは切り替えごとにLED1とLED2を点滅させたので、切り替えのタイミングは目視できると思います。
注意点) kumanさんによるとMCP23017に対する外部リセットは不要のようです。そのため、WSN176基板上にある外部リセット回路D1,C3は実装していません。また、SCL,SDAのプルアップ抵抗はWSN172に実装しているのでWSN176のR1、R2は実装していません。
マスターソース 2007.8.29(完成版)