Seiko instruments S35190

Revision:
0:0ea0bb4ae24f
Child:
1:c9d54daf068f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RTC_S35190.cpp	Tue Apr 29 05:39:14 2014 +0000
@@ -0,0 +1,190 @@
+#include "RTC_S35190.h"
+#include "mbed.h"
+
+RTC_S35190::RTC_S35190(PinName rtsio,PinName rtclk,PinName rtcs): _rtsio(rtsio),_rtclk(rtclk),_rtcs(rtcs){
+    _rtcs = 0;
+    _rtclk = 1;
+}
+    
+void RTC_S35190::portinit(){
+    _rtcs=0;             // RTCS = 0;
+    _rtclk=1;            // RTCLK = 1;
+}
+
+void RTC_S35190::send_cmd(char comm){
+    signed char c;
+    _rtsio.output();              // RTSIO=出力に変更
+    _rtcs = 1;              // RTCS=1 CS Active データ入出力後に L にする。
+                                // 必ずコマンドの後にデータがあるので。
+    for(c=7;c>=0;c--){
+        _rtclk = 0;        // RTCLK = 0;
+        _rtsio = (comm>>c)&0x01;
+        wait_us(10);
+        _rtclk = 1;         // RTCLK = 1;
+        wait_us(10);
+    }
+}
+
+//  Statusレジスタ1でPOC|BLDの値を返す
+char RTC_S35190::get_stat(){
+    char data,tmp;
+    signed char c;
+    data = 0;
+    send_cmd( RtcStat1 );
+
+    _rtsio.input();;            // 入力に変更
+    for(c=0;c<8;c++){
+        _rtclk = 0;        // RTCLK = 0;
+        wait_us(10);
+        _rtclk = 1;         // RTCLK = 1;
+        wait_us(10);
+        tmp = _rtsio;        // RTSIOはbit1データなので1回シフトしておく
+        data |= tmp<<c;
+    }
+    _rtcs = 0;             // RTCS = 0;
+    wait_us(10);
+    data &= 0xC0;   // 上位2bitのみ抽出
+    return data;
+}
+
+void RTC_S35190::reset(){
+    char data;
+    signed char c;
+
+    send_cmd( RtcStat1 & Reg_W );
+    
+    data = 0x03;                // 24時間,RESET=1
+    _rtsio.output();             // 出力に変更
+    for(c=0;c<8;c++){
+        _rtclk = 0;        // RTCLK = 0;
+        _rtsio = (data>>c)&0x01;
+        wait_us(10);
+        _rtclk = 1;         // RTCLK = 1;
+        wait_us(10);
+    }
+    _rtcs = 0;             // RTCS = 0;
+    wait_us(10);
+    _rtsio.input();            // 入力に変更
+}
+    
+void RTC_S35190::wr_freereg(char data){
+    signed char c;
+
+    send_cmd( Free_Reg & Reg_W );
+    
+    _rtsio.output();             // 出力に変更
+    for(c=0;c<8;c++){
+        _rtclk = 0;        // RTCLK = 0;
+        _rtsio = (data>>c)&0x01;
+        wait_us(10);
+        _rtclk = 1;         // RTCLK = 1;
+        wait_us(10);
+    }
+    _rtcs = 0;             // RTCS = 0;
+    wait_us(10);
+    _rtsio.input();            // 入力に変更
+}
+    
+char RTC_S35190::rd_freereg(){
+    char data;
+    signed char c;
+    data = 0;
+    
+    send_cmd( Free_Reg );
+    
+    _rtsio.input();            // 入力に変更
+    for(c=0;c<8;c++){
+        _rtclk = 0;        // RTCLK = 0;
+        wait_us(10);
+        _rtclk = 1;         // RTCLK = 1;
+        wait_us(10);
+        data |= (_rtsio<<c);
+    }
+    _rtcs = 0;             // RTCS = 0;
+    wait_us(10);
+    return data;
+}
+
+void RTC_S35190::rd_today(char *rtc_today){
+    char a;
+    signed char c;
+
+    send_cmd( RtcRegAcc1 );
+
+    _rtsio.input();            // 入力に変更
+    for(a=0;a<7;a++){
+        rtc_today[a] = 0;       // initialize
+        for(c=0;c<8;c++){
+            _rtclk = 0;        // RTCLK = 0;
+            wait_us(10);
+            _rtclk = 1;         // RTCLK = 1;
+            wait_us(10);
+            rtc_today[a] |= _rtsio<<c;
+        }
+    }
+    _rtcs = 0;             // RTCS = 0;
+    wait_us(10);
+}
+
+void RTC_S35190::wr_today(char *rtc_today){
+    char a;
+    signed char c;
+    
+    send_cmd( RtcRegAcc1 & Reg_W );
+
+    _rtsio.output();             // 出力に変更
+    for(a=0;a<7;a++){
+        for(c=0;c<8;c++){
+            _rtclk = 0;        // RTCLK = 0;
+            _rtsio = (rtc_today[a]>>c)&0x01;
+            wait_us(10);
+            _rtclk = 1;         // RTCLK = 1;
+            wait_us(10);
+        }
+    }
+    _rtcs = 0;             // RTCS = 0;
+    wait_us(10);
+    _rtsio.input();            // 入力に変更
+}
+
+
+void RTC_S35190::rd_now(char *rtc_today){
+    char a,data;
+    signed char c;
+
+    data = 0;
+    
+    send_cmd( RtcRegAcc2 );
+        
+    _rtsio.input();            // 入力に変更
+    for(a=4;a<7;a++){
+        data = 0;
+
+        for(c=0;c<8;c++){
+            _rtclk = 0;        // RTCLK = 0;
+            wait_us(10);
+            _rtclk = 1;         // RTCLK = 1;
+            wait_us(10);
+            data |= _rtsio<<c;
+        }
+        rtc_today[a] = data;
+    }
+    _rtcs = 0;             // RTCS = 0;
+    wait_us(10);
+}
+
+char RTC_S35190::Dec2RtcData(char tmp){
+    return ((tmp/10)<<4) | ((tmp%10)&0x0F);
+}
+
+char RTC_S35190::RtcData2Dec(char tmp){
+    return (tmp&0x0F) + (tmp>>4)*10;
+}
+
+void RTC_S35190::getDateStr(char *data,char *rtc_today){
+    sprintf(data,"20%02d/%2d/%2d",RtcData2Dec(rtc_today[0]),RtcData2Dec(rtc_today[1]),RtcData2Dec(rtc_today[2]));
+}
+
+void RTC_S35190::getTimeStr(char *data,char *rtc_today){
+    sprintf(data,"%02d:%02d:%02d",(RtcData2Dec(rtc_today[4]&0xBF)),RtcData2Dec(rtc_today[5]),RtcData2Dec(rtc_today[6]));
+}