Работа с DS1302 через wiringPI http://blindage.org/?p=4937
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
3.0 KiB

/*
DS1302 RTC Module.
(C) Vladimir Smagin, 2013.
http://blindage.org
*/
#include <time.h>
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int PinClk=4;
int PinDat=5;
int PinRst=6;
#define RTC_SEC 0x81
#define RTC_MIN 0x83
#define RTC_HOUR 0x85
#define RTC_DATE 0x87
#define RTC_MONTH 0x89
#define RTC_DAY 0x8b
#define RTC_YEAR 0x8d
//посылаем команду или байт данных в часы
void rtc_write(unsigned char cmd)
{
digitalWrite(PinRst,HIGH);
delayMicroseconds(4);
for(unsigned char i=0; i<8; i++)//передаем биты
{
if((cmd&(1<<i)) == 1<<i)
{
digitalWrite(PinDat,HIGH);
}
else
{
digitalWrite(PinDat,LOW);
}
delayMicroseconds(1);
digitalWrite(PinClk,HIGH);
delayMicroseconds(1);
digitalWrite(PinClk,LOW);
digitalWrite(PinDat,LOW);
}
}
//вызываем после записи байта данных в часы
void rtc_transm_end()
{
digitalWrite(PinRst,LOW);
}
//чтение данных
unsigned char rtc_read()
{
unsigned char readbyte=0;//сюда будем читать
pinMode(PinDat,INPUT);
//читаем побитно, если "1" записываем "1" в соответствующий бит, также с "0"
for(unsigned char i=0;i<8;i++)
{
if(digitalRead(PinDat)==0)
{
readbyte &= ~(1<<i);
}
else
{
readbyte |= 1<<i;
}
digitalWrite(PinClk,HIGH);
delayMicroseconds(10);//а это и есть большая задержка, чем при передаче
digitalWrite(PinClk,LOW);
delayMicroseconds(2);
}
delayMicroseconds(4);
pinMode(PinDat,OUTPUT);
return readbyte;
}
unsigned char time_get(unsigned char addr) {
rtc_write(addr);
unsigned char ret = rtc_read();
rtc_transm_end();
return ret;
}
void time_set(unsigned char addr, unsigned char value) {
rtc_write(addr-1);
rtc_write(value);
rtc_transm_end();
}
void rtc_time() {
printf("Time: %02x:%02x:%02x\n",time_get(RTC_HOUR),time_get(RTC_MIN),time_get(RTC_SEC));
printf("Date: %02x-%02x-20%02x\n",time_get(RTC_DATE),time_get(RTC_MONTH),time_get(RTC_YEAR));
}
void rtc_wp() {
rtc_write(0x8E);
rtc_write(0x00);
rtc_transm_end();
}
void rtc_reset() {
printf("Reset RTC\n");
//seconds and CH
rtc_write(0x80);
rtc_write(0x00);
rtc_transm_end();
rtc_write(0x82);
rtc_write(0x00);
rtc_transm_end();
rtc_write(0x84);
rtc_write(0x09);
rtc_transm_end();
}
int main( int argc, char *argv[] ){
if (wiringPiSetup() == -1) exit (1) ;
//init
pinMode(PinRst,OUTPUT);
digitalWrite(PinRst,LOW);
pinMode(PinClk,OUTPUT);
digitalWrite(PinClk,LOW);
pinMode(PinDat,OUTPUT);
digitalWrite(PinDat,LOW);
rtc_wp(); //remove write protect
//rtc_reset(); //start clock if stopped from 9 AM
rtc_time(); //show time and date
//time_set(RTC_MIN, 0x44); //set 44 minutes
//rtc_time(); //show time and date again with updated minutes
return 0;
}