下準備として ここ の記述を参考に以下を行いました。ただし、自分の環境は色々なものをインストールしているので、何がどう影響(良くも悪くも)しているかが正直わからないんですが・・・
まず、/etc/modules に
i2c-dev
の一行を追加して、/etc/modprobe.d/raspi-blacklist.conf の
blacklist i2c-bcm2708
の先頭に#をつけてコメントアウト。一旦、再起動後に
sudo apt-get install i2c-tools
で i2c-tools をインストールしました。
動作確認に使ったソースはこんな感じ。ただし、delay関数を使うために wiringPiのライブラリを使用しています。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <wiringPi.h>
int main(int argc, char **argv)
{
int rtc; // ファイルディスクリプタ。
char *i2cFileName = "/dev/i2c-0"; // I2Cドライバファイル名。
int rtcAddress = 0xa2 >> 1; // I2C LCD のアドレス。右1bitシフト。
unsigned char buf[16]; // バッファ。
printf("***** start i2c test program *****\n");
printf("Initializing RTC unit... Please wait\n");
delay(1000);
// I2CポートをRead/Write属性でオープン。
if ((rtc = open(i2cFileName, O_RDWR)) < 0)
{
printf("Faild to open i2c port\n");
exit(1);
}
// 通信先アドレスの設定。
if (ioctl(rtc, I2C_SLAVE, rtcAddress) < 0)
{
printf("Unable to get bus access to talk to slave\n");
exit(1);
}
// RTC初期化。
delay(15);
// はじめにアドレス0x00を指定。次からはオートインクリメント。
buf[0] = 0x00;
// コントロールレジスタ1。
buf[1] = 0x00;
// コントロールレジスタ2。
buf[2] = 0x00;
// 秒レジスタ。とりあえず、58秒。
buf[3] = 0x58;
// 分レジスタ。とりあえず、59分。
buf[4] = 0x59;
// 時レジスタ。とりあえず、23時。
buf[5] = 0x23;
// 日レジスタ。とりあえず、23日。
buf[6] = 0x23;
// 曜日レジスタ。とりあえず、木曜日。
buf[7] = 0x04;
// 月レジスタ。とりあえず、8月。
buf[8] = 0x08;
// 年レジスタ。取りあえず、12年。
buf[9] = 0x12;
// アラーム設定。なし。
buf[11] = 0x00;
buf[12] = 0x00;
buf[13] = 0x00;
// Clock出力設定。1Hz。
buf[14] = 0x83;
if (write(rtc, buf, 15) != 15)
{
printf("Error writeing to i2c slave\n");
exit(1);
}
delay(20);
printf("RTC Initialized.\n");
int i;
for (i = 0; i < 20; i++)
{
// データ要求ダミーコマンド送信。
buf[0] = 0;
if ((write(rtc, buf, 1)) != 1) {
printf("Error writing to i2c slave\n");
exit(1);
}
// データ読み込み。
if (read(rtc, buf, 16) != 16)
{
printf("Uneble to read\n");
exit(1);
}
// 西暦年。以下数値はBCD。
printf("20");
printf("%x", buf[8]);
printf("/");
// 月。下位9bit。
printf("%x", buf[7] & 0x1f);
printf("/");
// 日。下位10bit。
printf("%x", buf[5] & 0x3f);
printf(" ");
// 曜日。
switch (buf[6] & 0x07) {
case 0:
printf("Sun");
break;
case 1:
printf("Mon");
break;
case 2:
printf("Tue");
break;
case 3:
printf("Wed");
break;
case 4:
printf("Thr");
break;
case 5:
printf("Fri");
break;
case 6:
printf("Sat");
break;
default:
printf(" ");
break;
}
printf(" ");
// 時。
printf("%x", buf[4] & 0x3f);
printf(":");
// 分。
printf("%x", buf[3] & 0x7f);
printf(":");
// 秒。
printf("%x", buf[2] & 0x7f);
printf("\n");
delay(500);
}
return 0;
}
どうやら、RTCから情報を取得できているようです。


0 件のコメント:
コメントを投稿