| I2Cマスタのソフトウェアエミュレーション for H8-300h | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 概要 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
H8/3664に搭載されているI2Cモジュールは使い物になりません。 そこで汎用ポートをソフトウェアで叩くことでI2Cマスタの機能を実現する方法を説明します。 *現在では改良版のH8/3694が出ているようですが、筆者はこちらを使用した経験が無いのでコメントを控えます。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| キーワード | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| H8-300h, H8tiny, I2C, IIC, ソフトウェアエミュレーション | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 注記 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
きっちりとしたライブラリ化はあえてしていません。 動作実績のある1コード片として参考にしていただけたら幸いです。 HOS上で動かすために書いたので一部HOS依存です。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ソールファイル | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
i2c.h i2c.c | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| コンパイル・動作確認済み環境 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ハードウェア:AKI−H8/3664F(QFP) タイニーマイコンキット(秋月電子) 開発環境: windows XP + cygwin + gcc3.3 + hosv4 動作実績:第11回川崎ロボット競技大会 リミットカズラ で使用。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| I2Cとは | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| I2C busとはInter-Integrated-Circuit busの略で、IC間のデータ転送のために Philips社により提案された規格です。 I2Cでは2本の信号線:SCL(クロック)とSDA(データ)に複数のモジュールがオープンコレクタによって 接続されます。両信号線は抵抗をはさんで電源ラインに接続されます。 バス上には基本的にひとつのマスタと複数のスレーブがつながります。 複数のマスタを許可するマルチマスタモードもありますが本稿では対象外です。 マスタはSCL線を通じて各スレーブにクロックを供給します。 各スレーブは重複しないアドレスを持ちます。I2C規格には7ビットアドレスモードと 10ビットアドレスモードがありますが、後者は本稿の対象外です (趣味用途なら127個(厳密には予約アドレスがあるため112個)もつなげられれば十分でしょう)。 より詳しく知りたい方はMicrochip社のアプリケーションノート 辺りを参考にされると良いでしょう。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 周辺回路 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() 例ではマスタがH83664F、スレーブがPIC16F873となっています。 この組み合わせはリミットカズラで採用して動作が確認されています。 VDDは5Vです。 バスラインのプルアップ抵抗は図では2.2kΩとしてあります。 バス駆動用のTrは一応2SC1815としましたがI/Oポートで駆動できるものならなんでもいいでしょう。 電源電圧やスレーブ数、クロック周波数などが異なる場合は最適な抵抗値が前後するそうです。 そもそも本稿のソフトウェアエミュレーションだとそれほどスピードが出ないので、 あまり神経質になることもないでしょう。 *注意* ポート割り当ては上の図と異なっていても問題ありません(その場合はi2c.hのマクロを書き変えてください) が、ハードウェアI2Cに使われるP56,P57は他のポートと電気的特性が異なるので使用しないことを お勧めします。筆者が最初使おうとしたときにうまく動作しなかったことを記憶しています (昔のことなので確証はありませんが・・・)。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 使い方 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#include<i2c.h>
#define SLAVE_ADDR 0x01
static unsigned char g_i2cbuff[64];
int main(void){
/* I2C初期化 */
i2c_init();
/* スレーブから10バイト受信 */
i2c_startbit();
i2c_read(SLAVE_ADDR, g_i2cbuff, 10);
i2c_stopbit();
/* スレーブへ5バイト送信 */
i2c_startbit();
i2c_write(SLAVE_ADDR, g_i2cbuff, 5);
i2c_stopbit();
}
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| リファレンス | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||