Seiko instruments S35190
Diff: RTC_S35190.cpp
- Revision:
- 0:0ea0bb4ae24f
- Child:
- 1:c9d54daf068f
diff -r 000000000000 -r 0ea0bb4ae24f RTC_S35190.cpp --- /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])); +}