i2c_mstr.hcr.txt このファイルは .h .c readme をまとめたものである。 それぞれの区切りは 1212121212121212121212121212121212121212121212121212121212121212121212121212121212121212 であるから それぞれのファイルが必要なときはエディタで切り出して使う。 1212121212121212121212121212121212121212121212121212121212121212121212121212121212121212 /* *************************************************************************************** i2c_mstr.h I2Cマスター機能のためのヘッダファイル 2010.12.25 im swNAK氏のプログラムからimが作製。「動いている」が正しいとは限らない。 i2c_mstr.c とともに使用プログラムフォルダに置くこと。 FCPUにより 下記の 『#define TWBR_data 18 』の値を適切に設定のこと。 FCPUは makefile で決定しているので注意のこと。 SCKは100kHzを使用している。 RTC読み出しの手順 // ライト・シーケンス I2CStart(); // スタート・コンディション I2CWrite(0xd0) // CB(W) Adrs=0xA2(A2+0) R/W=0 I2CWrite(0xXX); // ROM Adrs(H) Hは不要=無いものに指定すると誤動作する I2CWrite(0x00); // ROM Adrs(L) I2CWrite(0xXX); // 0番地書き込みデータ I2CWrite(0xXX); // 1番地書き込みデータ I2CStop(); // ストップ・コンディション発行 //リード・シーケンス (読み出す内部番地を書き込んで、リピートする) ------- 流れ ---------------------- I2CStart(); // リピート・スタート・コンディション |スタートコンディション発行 | I2CWrite(0xd0) // CB(W) Adrs=0xd0(d0+0) R/W=0 |コントロールバイト(書き込み) | I2CWrite(0xXX); // ROM Adrs(H) Hは不要=無いもの | | // に指定すると誤動作する | | I2CWrite(0x00) // ROM Adrs(L)指定=読み出しポイント00 |ROMアドレス書き込み(読み出し起点) | I2CStart(); // リピート・スタート・コンディション |リピートコンディション発行 | I2CWrite(0xd1) // CB(R) Adrs=0xA3(A2+1) R/W=1 |コントロールバイト(読み出し) | dat1 = I2CRead(0); // バイト・リード(ACK応答) |読み出し(継続) 自動インクリメント | dat1 = I2CRead(1); // バイト・リード(NOACK応答) |読み出し(最終) | I2CStop(); // ストップ・コンディション発行 |ストップコンディションで終了 | ---------------------------------------- スレーブのアドレス指定時は NOACK 対策を施すべきだが省略している if(!I2CWrite(0xd0)) { // CB Adrs=A2(W) // NOACK時 I2CStop(); // ストップ・コンディション発行 Delay3(); string_out("NOACK!!!!"); while(1){} } TWIビットレート値設定 100kHzの時は クロック(MHz)*1.25-2 の値になる。←←←(注意) 8MHz=8 12MHz=13 16MHz=18 20MHz=23 ********************************************************************************** 使い方 main.cのあるフォルダに i2c_mstr.h と i2c_mstr.c をコピーする。 maic.cの中で #define F_CPU 16000000UL をコメントで入れておく。 実際の指定はmakefileの F_CPU で定義する。 main(){}の中で I2CMsInit(); を実行する。引数なし。 スレーブへの書込は i2c_write_d(uint8_t adr,uint8_t hi_adr,uint8_t lo_adr,uint8_t n); i2c_write_d( uint8_t adr スレーブアドレス 8ビット偶数(bit0=0) ,uint8_t hi_adr スレーブ内部Hiアドレス(Hiがないときは 0 を指定する) ,uint8_t lo_adr スレーブ内部Loアドレス ,uint8_t n d[0](を含めて)からnバイトを書き込む(n=3ならn[0]〜n[2]) ) スレーブからの読み出しは i2c_read_d(uint8_t adr,uint8_t hi_adr,uint8_t lo_adr,uint8_t n); i2c_read_d( uint8_t adr スレーブアドレス 8ビット偶数(bit0=0) ,uint8_t hi_adr スレーブ内部Hiアドレス(Hiがないときは 0 を指定する) ,uint8_t lo_adr スレーブ内部Loアドレス ,uint8_t n スレーブ内部アドレスからnバイトをd[0]からへ読み出す(n=3ならn[0]〜n[2]) ) 注:SCL=100kHzで設定している。 d[35] は .hで設定しているのでmainでは設定しないこと。 ********************************************************************************************* */ //**************************************** ↓ I2C設定 ********************************************* #define TWBR_data F_CPU/1000000*1.25-2 // TWBR値を指定 FCPU(MHz)*1.25-2 注意:F_CPUにより変更のこと (上記)9999999999 #define true 1 #define false 0 #define rgSCond (1< #include // string #include #include #include // itoa #include "i2c_mstr.h" // void I2CMsInit(void) { // CPU=12MHz,ビットレート100kHzのとき TWBR=13, TWPS=4 TWBR = TWBR_data; // TWIビットレート値設定 mstr.h で指定 TWSR = 1; // TWIビットレート・プリスケーラ値設定 0=1分周 1=4分周 2=16分周 3=64分周 TWCR = 1<