| 24 | == 通信方法 == |
| 25 | |
| 26 | === I2C通信 === |
| 27 | |
| 28 | I2C通信の詳細を記載します。 |
| 29 | |
| 30 | ==== 送信 ==== |
| 31 | |
| 32 | メーカー公開のデータシートよりプロトコル図を抜粋しました。 |
| 33 | |
| 34 | [[Image(fig37.png,480px)]] |
| 35 | |
| 36 | 1.データ書き込みモードでスレーブのデバイスIDを書き込みます。[[BR]]0xA2は8bitでのアドレスです。ArduinoのWireライブラリを利用する際は7bitのアドレスが0x51になります。 |
| 37 | |
| 38 | 2.データを書き込みたいレジスタアドレスを送信します。 |
| 39 | |
| 40 | 3.書き込みたいデータを送信します。こちらは連続で書き込むと内部で自動的にレジスタアドレスをインクリメントしてくれます。レジスタアドレスのインクリメントは、0x1Bの次に自動的に0x00に戻ります。 |
| 41 | |
| 42 | 4.通信を終了します。 |
| 43 | |
| 44 | 以下に、本ページで紹介しているライブラリの一部を抜粋します。 |
| 45 | {{{ |
| 46 | void PCF2129AT::dataSend(int id,int reg,int *data,int datasize) |
| 47 | { |
| 48 | Wire.beginTransmission(id); |
| 49 | Wire.write(reg); |
| 50 | for(int i=0;i<datasize;i++) |
| 51 | { |
| 52 | Wire.write(data[i]); |
| 53 | //Serial.print("data sended : "); //debug |
| 54 | //Serial.println(data[i], BIN); //debug |
| 55 | } |
| 56 | Wire.endTransmission(); |
| 57 | } |
| 58 | }}} |
| 59 | |
| 60 | ==== 受信 ==== |
| 61 | |
| 62 | メーカー公開のデータシートよりプロトコル図を抜粋しました。 |
| 63 | |
| 64 | [[Image(fig38.png,480px)]] |
| 65 | |
| 66 | 1.データ書き込みモードでスレーブのデバイスIDを書き込みます。[[BR]]0xA2は8bitでのアドレスです。ArduinoのWireライブラリを利用する際は7bitのアドレスが0x51になります。 |
| 67 | |
| 68 | 2.データを読みだすレジスタアドレスを書き込みます。 |
| 69 | |
| 70 | 3.ここで通信を終了します。{{{Wire.endTransmission(true);}}}とすることでストップビットを送信することができます。[[BR]]通信を終了しないデバイスのほうがどちらかと言えば多い印象です。 |
| 71 | |
| 72 | 4.再度通信を開始し、受信モードでデバイスIDを書き込みます。Wireライブラリを利用する際は読み取るバイト数を指定することができます。 |
| 73 | |
| 74 | 5.データを受信し、通信を終えます。 |
| 75 | |
| 76 | 手順3にてストップビットを送信しないまま読みだすと、PCF2129AT内部レジスタが1インクリメントされた状態で読み取りを開始するので注意が必要です。 |
| 77 | |
| 78 | 以下に、本ページで紹介しているライブラリの一部を抜粋します。 |
| 79 | {{{ |
| 80 | void PCF2129AT::dataRead(int id,int reg,int *data,int datasize) |
| 81 | { |
| 82 | //Serial.print("transmission begin");//debug |
| 83 | Wire.beginTransmission(id); //スレーブアドレス送信,書き込みモード |
| 84 | Wire.write(reg); //レジスタアドレス送信 |
| 85 | Wire.endTransmission(true); //STOPコンディションを送る |
| 86 | //STOPコンディションを送る仕様 |
| 87 | Wire.requestFrom(id, datasize, false); //スレーブアドレス送信,受信モード, |
| 88 | for(int i=0;i<datasize;i++) |
| 89 | { |
| 90 | data[i] = Wire.read(); |
| 91 | //Serial.print("data recived : ");//debug |
| 92 | //Serial.println(data[i], BIN);//debug |
| 93 | } |
| 94 | Wire.endTransmission(true); |
| 95 | //Serial.println("transmission end");//debug |
| 96 | } |
| 97 | }}} |
| 112 | {{{ |
| 113 | /* |
| 114 | * I2Cで接続したPCF2129ATに |
| 115 | * 日時を書き込んだ後に |
| 116 | * 読みだすプログラム |
| 117 | */ |
| 118 | #include <Wire.h> |
| 119 | #include "PCF2129AT.h" |
| 120 | |
| 121 | |
| 122 | PCF2129AT rtc; |
| 123 | dt_dat dt; |
| 124 | void setup() |
| 125 | { |
| 126 | Serial.begin(9600); |
| 127 | Wire.begin(); |
| 128 | rtc.init(); |
| 129 | Serial.println("PC2129AT Sample Program"); |
| 130 | dt.y = 2015; // 年の設定(2000年代) |
| 131 | dt.wd = 4; // 週の設定(0-6) |
| 132 | dt.mm = 11; // 月の設定(1-12) |
| 133 | dt.d = 16; // 日の設定(1-) |
| 134 | dt.h = 0; // 時の設定 |
| 135 | dt.m = 0; // 分の設定 |
| 136 | dt.s = 0; // 秒の設定 |
| 137 | rtc.setDate(&dt); // 日時の設定 |
| 138 | } |
| 139 | |
| 140 | void loop () |
| 141 | { |
| 142 | rtc.getTime(&dt); // 日時の取得 |
| 143 | // 日時の表示 |
| 144 | Serial.print("year :"); |
| 145 | Serial.print(2000 + dt.y,DEC); |
| 146 | Serial.print("\t week :"); |
| 147 | Serial.print(dt.wd,DEC); |
| 148 | Serial.print("\t month :"); |
| 149 | Serial.print(dt.mm,DEC); |
| 150 | Serial.print("\t date :"); |
| 151 | Serial.print(dt.d,DEC); |
| 152 | Serial.print("\t hour :"); |
| 153 | Serial.print(dt.h,DEC); |
| 154 | Serial.print("\t minutes :"); |
| 155 | Serial.print(dt.m,DEC); |
| 156 | Serial.print("\t second :"); |
| 157 | Serial.println(dt.s,DEC); |
| 158 | delay(100); |
| 159 | } |
| 160 | }}} |
| 161 | |
| 162 | === 動作サンプル === |
| 163 | |
| 164 | [[Image(sample1.png,480px)]] |
| 165 | |
| 166 | == ライブラリ == |
| 167 | |