Post Go back to editing

DS1305 Write and Read

Category: Software
Product Number: DS1305
Software Version: Code Composer 12

Hello,

I'd like to ask. I have a problem to write to RTC modul DS1305EN. I do not have an access to write also for enable external oscillator. 

Bellow I pinned my code for write and for debug proccedure 

void WriteToRTC(void)
{
LOCAL volatile Uint16 DummyData,Temp;

//DINT;
Init_SPI(0x06,0x52,0x0F);

// Write to control Reg
if (NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC); else GPIO_CS_Set(CS_EN_RTC);
SpiaRegs.SPIDAT = 0x8F00; // WP=0, EOSC=0 (aktivuj oscilátor)
while (SpiaRegs.SPIFFRX.bit.RXFFST != 1);
DummyData = SpiaRegs.SPIRXBUF;
if (NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC); else GPIO_CS_Clear();

//--- First enable SPI expander ---
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//--- Writing to RTC enabled ---
SpiaRegs.SPIDAT = 0x8F00;
DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//--- Write Second ---
//Temp = (SetDatum.Word1.bits.Second + (SetDatum.Word2.bits.Second << 5));
Temp = SetDatum.Word2.bits.Second1;
DummyData = ((Temp / 10) << 4) + (Temp MOD 10);
SpiaRegs.SPIDAT = 0x8000 + (DummyData & 0x7F);
DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//--- Write Minute ---
DummyData = ((SetDatum.Word1.bits.Minute / 10) << 4) + \
(SetDatum.Word1.bits.Minute MOD 10);
SpiaRegs.SPIDAT = 0x8100 + (DummyData & 0x7F);
DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//--- Write Hour ---
DummyData = ((SetDatum.Word1.bits.Hour / 10) << 4) + \
(SetDatum.Word1.bits.Hour MOD 10);
SpiaRegs.SPIDAT = 0x8200 + (DummyData & 0x3F);
DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//--- Write PO_NE ---
SpiaRegs.SPIDAT = 0x8300 + (RTC_PO_NE & 0x7F);
DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//--- Write Day ---
DummyData = ((SetDatum.Word0.bits.Day / 10) << 4) + \
(SetDatum.Word0.bits.Day MOD 10);
SpiaRegs.SPIDAT = 0x8400 + (DummyData & 0x3F);
DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//--- Write Month ---
DummyData = ((SetDatum.Word0.bits.Month / 10) << 4) + \
(SetDatum.Word0.bits.Month MOD 10);
SpiaRegs.SPIDAT = 0x8500 + (DummyData & 0x7F);
DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//--- Write Year ---
DummyData = ((SetDatum.Word0.bits.Year / 10) << 4) + \
(SetDatum.Word0.bits.Year MOD 10);
SpiaRegs.SPIDAT = 0x8600 + (DummyData & 0xFF);
DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//--- Writing to RTC disabled ---
SpiaRegs.SPIDAT = 0x8F40;
DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//--- Last disable SPI expander ---
//EINT;
}


void ReadFromRTC(Uint16 SetProt)
{
LOCAL volatile Uint16 DummyData, Temp;
Uint16 ControlReg;

READING_RTC = 1;
Init_SPI(0x06, 0x40, 0x0F);

// --- READ register 0x0F (control register) ---
if (NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC); else GPIO_CS_Set(CS_EN_RTC);
SpiaRegs.SPIDAT = 0x0F00; // READ 0x0F
SPI_Error(CS_EN_RTC);
ControlReg = SpiaRegs.SPIRXBUF;
if (NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC); else GPIO_CS_Clear();

Debug_RTC_Control = ControlReg; //

// --- ENABLE oscillator if EOSC bit (bit 7) is set ---
if (ControlReg & 0x0080)
{
if (NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC); else GPIO_CS_Set(CS_EN_RTC);
SpiaRegs.SPIDAT = 0x8F00; // WRITE 0x00 to 0x0F (clear EOSC)
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
if (NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC); else GPIO_CS_Clear();
DELAY_US(10); // nech sa to stihne nastaviť
}
//DINT;
//--- Read Second ---
SpiaRegs.SPIDAT = 0x0000;
//DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = (SpiaRegs.SPIRXBUF & 0x007F);
//EINT;
DummyData = (((DummyData >> 4) & 0x0007) * 10) + (DummyData & 0x000F);
DateTime.Word1.bits.Second = (DummyData & 0x1F);
DateTime.Word2.bits.Second = ((DummyData & 0x20) >> 5);
DateTime.Word2.bits.Second1= (DummyData & 0x3F);
// (DateTime.Word1.bits.Second + (DateTime.Word2.bits.Second << 5))
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//DELAY_US(1);
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//DINT;
//--- Read Minute ---
SpiaRegs.SPIDAT = 0x0100;
//DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = (SpiaRegs.SPIRXBUF & 0x007F);
//EINT;
DummyData = (((DummyData >> 4) & 0x0007) * 10) + (DummyData & 0x000F);
RTC_MINUTE = DummyData;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//DELAY_US(1);
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//DINT;
//--- Read Hour ---
SpiaRegs.SPIDAT = 0x0200;
//DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = (SpiaRegs.SPIRXBUF & 0x003F);
//EINT;
DummyData = (((DummyData >> 4) & 0x0003) * 10) + (DummyData & 0x000F);
RTC_HOUR = DummyData;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//DELAY_US(1);
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//DINT;
//--- Read PO_NE ---
SpiaRegs.SPIDAT = 0x0300;
//DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = SpiaRegs.SPIRXBUF;
//EINT;
RTC_PO_NE = (DummyData & 0x000F);
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//DELAY_US(1);
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//DINT;
//--- Read Day ---
SpiaRegs.SPIDAT = 0x0400;
//DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = (SpiaRegs.SPIRXBUF & 0x003F);
//EINT;
DummyData = (((DummyData >> 4) & 0x0003) * 10) + (DummyData & 0x000F);
RTC_DAY = DummyData;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//DELAY_US(1);
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//DINT;
//--- Read Month ---
SpiaRegs.SPIDAT = 0x0500;
//DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = (SpiaRegs.SPIRXBUF & 0x003F);
//EINT;
DummyData = (((DummyData >> 4) & 0x0003) * 10) + (DummyData & 0x000F);
RTC_MONTH = DummyData;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//DELAY_US(1);
//------
if(NEW_CONTROLBOARD) GPIOSet(CS_EN_RTC);
else GPIO_CS_Set(CS_EN_RTC);
//DINT;
//--- Read Year ---
SpiaRegs.SPIDAT = 0x0600;
//DummyData = SpiaRegs.SPIRXBUF;
SPI_Error(CS_EN_RTC);
DummyData = (SpiaRegs.SPIRXBUF & 0x00FF);
//EINT;
DummyData = (((DummyData >> 4) & 0x000F) * 10) + (DummyData & 0x000F);
RTC_YEAR = DummyData;
if(NEW_CONTROLBOARD) GPIOClear(CS_EN_RTC);
else GPIO_CS_Clear();
//DELAY_US(1);
//--- Last disable SPI expander ---
if(PROTOCOLS.prot462.Word2.all != DateTime.Word2.all)
SCI_SEND_RTC = 1;
if(SetProt)
{ /*PROTOCOLS.prot136.Word0.bits.Day = RTC_DAY;
PROTOCOLS.prot136.Word0.bits.Month = RTC_MONTH;
PROTOCOLS.prot136.Word0.bits.Year = RTC_YEAR;
PROTOCOLS.prot136.Word1.bits.Hour = RTC_HOUR;
//if(PROTOCOLS.prot9.Word1.bits.Hour != 15)
//PROTOCOLS.prot9.Word1.bits.Hour = 10;
PROTOCOLS.prot136.Word1.bits.Minute = RTC_MINUTE;
PROTOCOLS.prot136.Word1.bits.Second = (RTC_SECOND >> 0)&0x1F;
PROTOCOLS.prot136.Word2.bits.Second = (RTC_SECOND >> 5)&0x01;
PROTOCOLS.prot136.Word2.bits.Second1= RTC_SECOND1;*/
PROTOCOLS.prot462.Word0.all = DateTime.Word0.all;
PROTOCOLS.prot462.Word1.all = DateTime.Word1.all;
PROTOCOLS.prot462.Word2.all = DateTime.Word2.all;
}
if((DateTime.Word0.all == 0x4BAD) AND (DateTime.Word1.all == 0xAAAD) AND (DateTime.Word2.all == 0x055E))//0x001E))
RTC_FROM_RS = 0;
else
RTC_FROM_RS = 1;
READING_RTC = 0;
//EINT;
}


PROTOCOLS.prot462.Word0.bits.Day = 0;
PROTOCOLS.prot462.Word0.bits.Month = 0;
PROTOCOLS.prot462.Word0.bits.Year = 25;

PROTOCOLS.prot462.Word2.bits.Second = 0;
PROTOCOLS.prot462.Word2.bits.Second1 = 0;
PROTOCOLS.prot462.Word2.bits.SetDatum = 1;
PROTOCOLS.prot462.Word1.all = 0;
//
// Debug_SPI_Second_BCD = ((PROTOCOLS.prot462.Word2.bits.Second1 / 10) << 4) |
// (PROTOCOLS.prot462.Word2.bits.Second1 % 10);
// Debug_SPI_Minute_BCD = ((PROTOCOLS.prot462.Word1.bits.Minute / 10) << 4) |
// (PROTOCOLS.prot462.Word1.bits.Minute % 10);
// Debug_SPI_Hour_BCD = ((PROTOCOLS.prot462.Word1.bits.Hour / 10) << 4) |
// (PROTOCOLS.prot462.Word1.bits.Hour % 10);
//
SettingRTC();

DELAY_US(500); //

ReadFromRTC(0);

Debug_RTC_Hour = RTC_HOUR;
Debug_RTC_Minute = RTC_MINUTE;
Debug_RTC_Second = RTC_SECOND1;
Debug_RTC_Day = RTC_DAY;
Debug_RTC_Month = RTC_MONTH;
Debug_RTC_Year = RTC_YEAR;


if (RTC_HOUR != PROTOCOLS.prot462.Word1.bits.Hour ||
RTC_MINUTE != PROTOCOLS.prot462.Word1.bits.Minute ||
RTC_SECOND1 != PROTOCOLS.prot462.Word2.bits.Second1 ||
RTC_DAY != PROTOCOLS.prot462.Word0.bits.Day ||
RTC_MONTH != PROTOCOLS.prot462.Word0.bits.Month ||
RTC_YEAR != PROTOCOLS.prot462.Word0.bits.Year)
{
Debug_Flag_RTC_Mismatch = 1; //
}
else
{
Debug_Flag_RTC_Mismatch = 0;
}