working version

Dependencies:   mbed mbed-rtos SimpleDMA FreescaleIAP eeprom

Fork of CDMS_CODE_FM_28JAN2017 by samp Srinivasan

cdms_rtc.h

Committer:
samp1234
Date:
2022-04-03
Revision:
357:f3d48d62e00e
Parent:
356:197c93dc2012

File content as of revision 357:f3d48d62e00e:


void FCTN_CDMS_INIT_RTC()
{   
    if(EN_RTC == 0)
    return;
    wait_ms(4000);
    SPI_mutex.lock();
    gCS_RTC=1;
    spi.format(8,0);
    spi.frequency(1000000);
    
    //Kick starting the oscillator 
    gCS_RTC=0;
    spi.write(0x81); //register address with write flag
    spi.write(0x80);//enabling stop bit in the seconds register
    gCS_RTC=1;
    
    gCS_RTC=0;
    spi.write(0x81);
    spi.write(0x00);//disabling the stop bit to restart the oscillator 
    gCS_RTC=1;
        
    //clearing the halt bit 
    gCS_RTC=1;
    gCS_RTC=0;
    spi.write(0x8C);
    spi.write(0x00);
    gCS_RTC=1; 
     
    //clearing the OF bit 
    gCS_RTC=0;
    spi.write(0x8F);
    spi.write(0x00);
    gCS_RTC=1; 
     
    //century bits
    gCS_RTC=0;
    spi.write(0x80|0x03);
    spi.write(0x00);
    gCS_RTC=1;
    
    gCS_RTC=0;
    spi.write(0x80); 
    spi.write(0x00); // set milliseconds value to 00
    gCS_RTC=1;
 
    gCS_RTC=0;
    spi.write(0x81); 
    spi.write(0x00); //set seconds value to 00
    gCS_RTC=1;
 
    gCS_RTC=0;
    spi.write(0x82); 
    spi.write(0x00);//set minutes value to 00
    gCS_RTC=1;
 
    gCS_RTC=0;
    spi.write(0x83); 
    spi.write(0x00); //set the hours to 01
    gCS_RTC=1;
    
    gCS_RTC=0;
    spi.write(0x84); 
    spi.write(0x01); //set day of the week to 01
    gCS_RTC=1;
    
    gCS_RTC=0;
    spi.write(0x85); 
    spi.write(0x01); //set date of the month to 01
    gCS_RTC=1;
    
    gCS_RTC=0;
    spi.write(0x86); 
    spi.write(0x01); //set month to 01
    gCS_RTC=1;
    
    gCS_RTC=0;
    spi.write(0x87); 
    spi.write(0x16); //set year to 00(2000)
    gCS_RTC=1;
    gPC.puts("\n\r rtc initalised \n");
    RTC_INIT_STATUS = 1;
   //FCTN_CDMS_WR_FLASH(5,1);
    WRITE_TO_EEPROM(5,1);
    SPI_mutex.unlock();
}
 
uint64_t FCTN_CDMS_RD_RTC()
{   
    if(EN_RTC == 0)  
    return 0;
    SPI_mutex.lock(); 
    uint8_t response;
    uint64_t time = 0;
    
    gCS_RTC = 0;
    spi.write(0x0F);
    response = spi.write(0x00);
    //gPC.printf("0x%02X",response);
    gCS_RTC = 1;
    
    gCS_RTC=0;
    spi.write(0x00); //reading milliseconds register
    response = spi.write(0x00); // read the value by sending dummy byte
    uint8_t centiseconds =  (uint8_t(response&0xF0)>>4)*10+uint8_t(response&0x0F)*1;
    
    gCS_RTC=1;
    gCS_RTC=0;
    spi.write(0x01); //reading seconds register
    response =spi.write(0x01);
    uint8_t seconds =  ((response&0x70)>>4)*10+(response&0x0F)*1;
    
    gCS_RTC=1;
    gCS_RTC=0;
    spi.write(0x02); //reading minutes register
    response =spi.write(0x01);
    uint8_t minutes =  ((response&0xF0)>>4)*10+(response&0x0F)*1;
    
    gCS_RTC=1;
    gCS_RTC=0;
    spi.write(0x03); //reading hours register
    response=spi.write(0x01);
    uint8_t hours =  ((response&0x30)>>4)*10+(response&0x0F)*1;
    
    gCS_RTC=1;
    gCS_RTC=0;
    spi.write(0x04); //reading day's  register
    uint8_t day =spi.write(0x01);
    
    gCS_RTC=1;
    gCS_RTC=0;
    spi.write(0x05); //reading date register
    response =spi.write(0x01);
    uint8_t date =  ((response&0x30)>>4)*10+(response&0x0F)*1;
    
    gCS_RTC=1;
    gCS_RTC=0;
    spi.write(0x06); //reading month registe
    response =spi.write(0x01);
    uint8_t month =  ((response&0x10)>>4)*10+(response&0x0F)*1;
    
    gCS_RTC=1;
    gCS_RTC=0;
    spi.write(0x07);
    response = spi.write(0x01);
    uint8_t year = ((response&0xF0)>>4)*10+(response&0x0F)*1;
    year = (year == 16)?0x00:(year == 17)?0x01:(year == 18)?0x02:(year == 19)?0x03:0x00;
    gCS_RTC=1;
    
    
    time = time|(((uint64_t)(centiseconds&0x7F)));
    time = time|(((uint64_t)(seconds&0x3F))<<7);
    time = time|(((uint64_t)(minutes&0x3F))<<13);
    time = time|(((uint64_t)(hours&0x1F))<<19);
    time = time|(((uint64_t)(date&0x1F))<<24);
    time = time|(((uint64_t)(month&0x0F))<<29);
    time = time|(((uint64_t)(year&0x03))<<33);
    time = (time&0x00000007FFFFFFFF);
    SPI_mutex.unlock();
    return time;
}