/*************************************************************** 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() { }