
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
/***************************************************************
RTC_SPI.c
copyright (c) 2017 by Sang-Yong Kim
Next Square Co. Ltd.
All Rights Reserved.
****************************************************************/
#include "CommonLib.h"
#define RTC_sec 0x0000
#define RTC_min 0x0100
#define RTC_hour 0x0200
#define RTC_day 0x0300
#define RTC_date 0x0400
#define RTC_month 0x0500
#define RTC_year 0x0600
#define RTC_write 0x8000
#define RTC_Status 0x0E00
// Defines for Chip Select toggle.
//
#define CS_LOW_A GPIO_writePin(61, 0)
#define CS_HIGH_A GPIO_writePin(61, 1)
int RTC_Read_seq=0;
int RTC_Write_seq=0;
int Time_sec=0, Time_min=0, Time_hour=0;
int Day_date=0, Day_month=0, Day_year=0;
int Write_sec=0,Write_min=0,Write_hour=0;
int Write_date=0,Write_month=0,Write_year=0;
int Time_1224=0, Time_AMPM=0;
int State_RTC_Write_complete=0;
//int Flag_RTC_Write=0;
int Read_addr=0;
//unsigned int Spid_TxErr_Cnt = 0;
//unsigned int Spid_RxErr_Cnt = 0;
//unsigned int Spid_Rx_Data = 0;
//unsigned int Spid_Tx_Data = 0;
unsigned int Spid_Flag_Rx = 1;
//unsigned int Spid_Flag_Tx = 0;
//int Testpcs4 = 0;
unsigned int BCDtoDEC(int bcd)
{
// int dec_num = 0;
// int weight = 1;
//
// while (bcd_num > 0) {
// int nibble = bcd_num & 0xF; // 마지막 4비트(한 니블) 추출
// dec_num += nibble * weight;
// weight *= 10;
// bcd_num >>= 4; // 다음 니블로 이동
// }
// 0~3비트에서 1초 자리 추출
int onesPlace = bcd & 0xF; // 0b1111과 AND 연산하여 0~3비트 값 추출
// 4~6비트에서 10초 자리 추출
int tensPlace = (bcd >> 4) & 0x7; // 0b0111과 AND 연산하여 4~6비트 값 추출
// 십진수로 변환
int dec = tensPlace * 10 + onesPlace;
return dec;
}
unsigned int decToBcd(int dec) {
unsigned int bcd = 0;
int shift = 0;
while (dec != 0) {
// 각 10진수 자리를 BCD로 변환
bcd |= (dec % 10) << (shift * 4);
dec /= 10;
shift++;
}
return bcd;
}
//int Spid_Tx(unsigned int Tx_Data)
//{
// int temp=0;
// CS_LOW_A;
// SPI_writeDataBlockingNonFIFO(SPIA_BASE, Tx_Data);
// temp = SPI_readDataBlockingNonFIFO(SPIA_BASE);
//
// delay_us(2);
// CS_HIGH_A;
//
//}
//
//unsigned int Spid_Rx(unsigned int Read_addr)
//{
// int a=0,b=0,temp=0;
//
// CS_LOW_A;
//
// SPI_writeDataBlockingNonFIFO(SPIA_BASE, Read_addr);
// temp = SPI_readDataBlockingNonFIFO(SPIA_BASE);
// SPI_writeDataBlockingNonFIFO(SPIA_BASE, Read_addr);
// temp = SPI_readDataBlockingNonFIFO(SPIA_BASE);
//// SPI_writeDataBlockingNonFIFO(SPIA_BASE, 0000);
//// Testpcs4 = SPI_readDataBlockingNonFIFO(SPIA_BASE);
//
// delay_us(2);
// CS_HIGH_A;
//
// return(temp);
//}
void SPI_RTC_Read_Sequence()
{
int a=0, b=0, c=0, d=0, temp=0;
int Spid_Rx_Data = 0;
if(State_RTC_Write_complete==0)
{
switch(RTC_Read_seq)
{
//-----------Read second from DS1390 -----------//
case RTC_sec:
Spid_Rx_Data = Spid_Rx(RTC_sec);
RTCRegs.SecDAT.all = Spid_Rx_Data;
RTCRegs.Sec = (RTCRegs.SecDAT.bit.Tens * 10 + RTCRegs.SecDAT.bit.Unit);
RTC_Read_seq = RTC_min;
break;
//-----------Read minute from DS1390 -----------//
case RTC_min:
Spid_Rx_Data = Spid_Rx(RTC_min);
RTCRegs.MinDAT.all = Spid_Rx_Data;
RTCRegs.Min = (RTCRegs.MinDAT.bit.Tens * 10 + RTCRegs.MinDAT.bit.Unit);
RTC_Read_seq = RTC_hour;
break;
//-----------Read hour from DS1390 -----------//
case RTC_hour:
Spid_Rx_Data = Spid_Rx(RTC_hour);
RTCRegs.HourDAT.all = Spid_Rx_Data;
RTCRegs.Hour = (RTCRegs.HourDAT.bit.Tens * 10 + RTCRegs.HourDAT.bit.Unit);
RTC_Read_seq = RTC_day;
break;
//-----------Read date from DS1390 -----------//
case RTC_day:
Spid_Rx_Data = Spid_Rx(RTC_day);
RTCRegs.DayDAT.all = Spid_Rx_Data;
RTCRegs.Day = (RTCRegs.DayDAT.bit.Day);
RTC_Read_seq = RTC_date;
break;
//-----------Read month from DS1390 -----------//
case RTC_date:
Spid_Rx_Data = Spid_Rx(RTC_date);
RTCRegs.DateDAT.all = Spid_Rx_Data;
RTCRegs.Date = (RTCRegs.DateDAT.bit.Tens * 10 + RTCRegs.DateDAT.bit.Unit);
RTC_Read_seq = RTC_month;
break;
//-----------Read year from DS1390 -----------//
case RTC_month:
Spid_Rx_Data = Spid_Rx(RTC_month);
RTCRegs.MonthDAT.all = Spid_Rx_Data;
RTCRegs.Month = (RTCRegs.MonthDAT.bit.Tens * 10 + RTCRegs.MonthDAT.bit.Unit);
RTC_Read_seq = RTC_year;
break;
//-----------Read year from DS1390 -----------//
case RTC_year:
Spid_Rx_Data = Spid_Rx(RTC_year);
RTCRegs.MonthDAT.all = Spid_Rx_Data;
RTCRegs.Month = (RTCRegs.MonthDAT.bit.Tens * 10 + RTCRegs.MonthDAT.bit.Unit);
RTC_Read_seq = RTC_sec;
break;
default:
RTC_Read_seq=0;
Spid_Flag_Rx=0;
break;
}
}
}
void SPI_RTC_Write_Sequence()
{
if(State_RTC_Write_complete)
{
switch(RTC_Write_seq)
{
unsigned int temp;
default: break;
//-----------Read second from DS1390 -----------//
case 0:
temp = RTC_write|RTC_sec|(decToBcd(Write_sec)&0x7F);
Spid_Tx(temp);
RTC_Write_seq=1;
break;
//-----------Read minute from DS1390 -----------//
case 1:
Spid_Tx(RTC_write|RTC_min|(decToBcd(Write_min)&0x7F));
RTC_Write_seq=2;
break;
//-----------Read hour from DS1390 -----------//
case 2:
Spid_Tx(RTC_write|RTC_hour|(decToBcd(Write_hour)&0x3F));
RTC_Write_seq=3;
break;
//-----------Read date from DS1390 -----------//
case 3:
Spid_Tx(RTC_write|RTC_date|(decToBcd(Write_date)&0x3F));
RTC_Write_seq=4;
break;
//-----------Read month from DS1390 -----------//
case 4:
Spid_Tx(RTC_write|RTC_month|(decToBcd(Write_month)&0x1F));
RTC_Write_seq=5;
break;
//-----------Read year from DS1390 -----------//
case 5:
Spid_Tx(RTC_write|RTC_year|(decToBcd(Write_year)&0xFF));
RTC_Write_seq=0;
State_RTC_Write_complete=0;
break;
}
}
}
void InitSpi_RTC()
{
}