![](/media/cache/profiles/a532400ed62e772b9dc0b86f46e583ff.50x50_q85.jpg)
This is a complete listing of the RS-EDP software for the mbed module to support the RS-EDP platform.
Diff: SourceFiles/RSEDP_COM_PCF8583_Real_Time_Clock.cpp
- Revision:
- 0:5b7639d1f2c4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SourceFiles/RSEDP_COM_PCF8583_Real_Time_Clock.cpp Fri Nov 19 09:49:16 2010 +0000 @@ -0,0 +1,662 @@ +/* Driver For PCF8583T Real Time Clock IC */ +/* ************************************** */ + + +/* Version 1.00 */ +/* Start Date: 23/6/2009 */ +/* The RTC Clock IC is part of the communications module */ + + + + + +/* Include Files Here */ +#include "mbed.h" /* mbed header file */ +#include "misra_types.h" /* MISRA Types header file */ +#include "defines.h" +#include "RSEDP_Slave_Address_Defines.h" /* Slave Address of CNTRL I2C devices */ + +#include "mbed_Port_Structure.h" /* Port structure for MBED Module */ +#include "RSEDP_CNTRL_I2C.h" /* Control I2C Driver */ + + + +#define START_YEAR (uint16_t) 2009 /* Value used for real time clock */ + + + + +/* Function Prototypes Here */ +sint32_t RSEDP_COM_setup_PCF8583(uint8_t Slave_Address, uint8_t mode); /* Setup the device */ +sint32_t RSEDP_COM_PCF8583_Read_Status_Register(uint8_t Slave_Address, uint8_t *status_register); /* Read the status register of the device */ +sint32_t RSEDP_COM_PCF8583_Write_Status_Register(uint8_t Slave_Address, uint8_t payload); /* Status register write */ + +/* RTC Function */ +sint32_t RSEDP_COM_PCF8583_Write_RTC(uint8_t Slave_Address, uint8_t *RTC_Array); /* Write raw data to the RTC device */ +sint32_t RSEDP_COM_PCF8583_Read_RTC(uint8_t Slave_Address, uint8_t *RTC_Array); /* Read raw data from the real time clock */ +sint32_t RSEDP_COM_PCF8583_Set_Clock(uint8_t Slave_Address, uint8_t hours, uint8_t minutes, uint8_t seconds,uint8_t F24hour_flag, uint8_t AMPM_flag); /* Set the clock only */ +sint32_t RSEDP_COM_PCF8583_Set_Date(uint8_t Slave_Address, uint8_t dow, uint8_t day,uint8_t month, uint16_t year); /* Set the date only */ +sint32_t RSEDP_COM_PCF8583_Read_Clock(uint8_t Slave_Address, uint8_t *Time_Array); /* Read the time component only */ +sint32_t RSEDP_COM_PCF8583_Read_Date(uint8_t Slave_Address, uint8_t *Date_Array); /* Read the date component only */ +sint32_t RSEDP_COM_PCF8583_Read_Clock_And_Date(uint8_t Slave_Address, uint8_t *Time_Array,uint8_t *Date_Array); /* Read time and date */ +sint32_t RSEDP_COM_PCF8583_Start_Clock(uint8_t Slave_Address); /* Start the clock counting */ +sint32_t RSEDP_COM_PCF8583_Stop_Clock(uint8_t Slave_Address); /* Stop the clock */ + +/* Battery Maintained SRAM functions */ +sint32_t RSEDP_COM_PCF8583_Read_SRAM(uint8_t Slave_Address, uint8_t *read_data,uint8_t address); /* Read data from the battery maintained SRAM */ +sint32_t RSEDP_COM_PCF8583_Write_SRAM(uint8_t Slave_Address, uint8_t payload,uint8_t address); /* Write data to the battery maintained SRAM */ + + +/* Print Functions */ +void RSEDP_COM_Print_Time(uint8_t *Time_Array); +void RSEDP_COM_Print_Date(uint8_t *Date_Array); +void RSEDP_COM_Print_Time_Date_Year(uint8_t *RTC_Array); + + + +/* Static local functions */ +static void delay_small(void); + + + + + +/* Setup the device */ +sint32_t RSEDP_COM_setup_PCF8583(uint8_t Slave_Address, uint8_t mode) + { + sint32_t Ack_Status = 0; + /* Assume the I2C Peripheral is already configured */ + + if ((mode=='c') | (mode== 'C')) + { + /* Configure for Clock mode */ + Ack_Status = RSEDP_COM_PCF8583_Write_Status_Register(Slave_Address, 0x00); + + } + + if ((mode=='e') | (mode== 'E')) + { + /* configure for Event Counter Mode */ + Ack_Status = RSEDP_COM_PCF8583_Write_Status_Register(Slave_Address, 0x20); + } + return Ack_Status; + } + + + + +/* Read the status register of the device */ +sint32_t RSEDP_COM_PCF8583_Read_Status_Register(uint8_t Slave_Address, uint8_t *status_register) + { + sint32_t Ack_Status = 0; + sint8_t tx_array[2]; + sint8_t rx_array=0; /* Variable used to receive data from slave */ + + tx_array[0] = 0x00; /* Memory address 0x00 */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array, 1); /* Set the RTC address */ + + if (Ack_Status == ACK) + { + Ack_Status = CNTRL_I2C_Master_Mode_Receive(Slave_Address, &rx_array,1); /* Read single byte address */ + } + *status_register = rx_array; /* Load value from RTC into receive pointer */ + return Ack_Status; + } + + + + +/* Status register write */ +sint32_t RSEDP_COM_PCF8583_Write_Status_Register(uint8_t Slave_Address, uint8_t payload) + { + sint32_t Ack_Status = 0; + sint8_t tx_array[2]; /* Transmission array */ + + tx_array[0] = 0x00; /* Address 0x00 is where the control register is located */ + tx_array[1] = payload; /* Data to be written */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array,2); /* Send the data */ + return Ack_Status; + } + + +/* Read the real time clock information */ +sint32_t RSEDP_COM_PCF8583_Read_RTC(uint8_t Slave_Address, uint8_t *RTC_Array) + { + sint32_t Ack_Status = 0; + sint8_t tx_array[2]; + sint8_t local_array[8]; + uint8_t n = 0u; + + tx_array[0] = 0x01; /* Memory address 0x01 */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array, 1); /* Set the RTC memory address */ + + if (Ack_Status == ACK) + { + Ack_Status = CNTRL_I2C_Master_Mode_Receive(Slave_Address, local_array,7); /* Read single byte address */ + } + for (n = 0; n < 7; n++) + { + RTC_Array[n] = (uint8_t) (local_array[n]); + } + return Ack_Status; + } + + +/* Write the real time clock information */ +sint32_t RSEDP_COM_PCF8583_Write_RTC(uint8_t Slave_Address, uint8_t *RTC_Array) + { + sint32_t Ack_Status = 0; + sint8_t tx_array[8]; + uint8_t n = 0; + + tx_array[0] = 0x01; /* Memory address 0x01 */ + for (n = 1; n < 8; n++) /* Copy data into array */ + { + tx_array[n] = *RTC_Array; + RTC_Array++; + } + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array, 8); /* Transmit the data */ + delay_small(); /* RTC is busy writing */ + return Ack_Status; + } + + +/* Set the clock inside the device */ +sint32_t RSEDP_COM_PCF8583_Set_Clock(uint8_t Slave_Address, uint8_t hours, uint8_t minutes, uint8_t seconds,uint8_t F24hour_flag, uint8_t AMPM_flag) + { + sint32_t Ack_Status = 0; + sint8_t RTC_Array[5] = {0,0,0,0,0}; + uint8_t high = 0; + uint8_t low = 0; + + /* Hundreths */ + RTC_Array[1] = 0x00; /* Hundreths of a second -set to zero */ + + /* Seconds */ /* Convert to BCD */ + low = (seconds % 10); + high = (seconds / 10); + RTC_Array[2] = ((high << 4) + low); + + /* Minutes */ /* Convert to BCD */ + low = (minutes % 10); + high = (minutes / 10); + RTC_Array[3] = ((high << 4) + low); + + /* Hours */ /* Convert to BCD and add in 24 hour and AM/PM flag */ + low = (hours % 10); + high = (hours / 10); + RTC_Array[4] = ((high << 4) + low); + RTC_Array[4] = (RTC_Array[4] & 0x3f); + + F24hour_flag = ((F24hour_flag & 0x01) << 7); + AMPM_flag = ((AMPM_flag & 0x01) << 6); + + RTC_Array[4] += F24hour_flag + AMPM_flag; + + RTC_Array[0] = 0x01; /* Target destination address of data */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, RTC_Array, 5); /* Transmit the data */ + delay_small(); /* RTC is busy writing */ + return Ack_Status; + } + + + +/* Write the time and date to the RTC clock */ +sint32_t RSEDP_COM_PCF8583_Set_Date(uint8_t Slave_Address, uint8_t dow, uint8_t day,uint8_t month, uint16_t year) + { + sint32_t Ack_Status = 0; + sint8_t RTC_Array[5] = {0,0,0,0,0}; + uint8_t high = 0; + uint8_t low = 0; + + /* day of month */ /* Convert to BCD */ + if (day > 31) day = 31; + low = (day % 10); + high = (day / 10); + RTC_Array[1] = (((high << 4) + low) & 0x3f); + + /* year */ + year = ((year - 2008) & 0x03); + RTC_Array[1] += (year << 6); + + /* Day of week */ + if (dow > 6) dow = 6; + dow = (dow << 5); + RTC_Array[2] = dow; + + /* months */ + if (month > 12) month = 12; + low = (month % 10); + high = (month / 10); + RTC_Array[2] += (((high << 4) + low)); + + + RTC_Array[0] = 0x05; /* Target destination address of data */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, RTC_Array, 3); /* Transmit the data */ + delay_small(); /* RTC is busy writing */ + return Ack_Status; + } + + + +/* Start the clock counting */ +sint32_t RSEDP_COM_PCF8583_Start_Clock(uint8_t Slave_Address) + { + sint32_t Ack_Status = 0; + uint8_t status_reg = 0; + + Ack_Status = RSEDP_COM_PCF8583_Read_Status_Register(Slave_Address, &status_reg); + + status_reg = (status_reg & 0x7f); + + if (Ack_Status ==ACK) + { + Ack_Status = RSEDP_COM_PCF8583_Write_Status_Register(Slave_Address, status_reg); + } + return Ack_Status; + } + + + +/* Stop the clock */ +sint32_t RSEDP_COM_PCF8583_Stop_Clock(uint8_t Slave_Address) + { + sint32_t Ack_Status = 0; + uint8_t status_reg = 0; + + Ack_Status = RSEDP_COM_PCF8583_Read_Status_Register(Slave_Address, &status_reg); + + status_reg = (status_reg | 0x80); + + if (Ack_Status == ACK) + { + RSEDP_COM_PCF8583_Write_Status_Register(Slave_Address, status_reg); + } + return Ack_Status; + } + + +/* Read the time component only */ +sint32_t RSEDP_COM_PCF8583_Read_Clock(uint8_t Slave_Address, uint8_t *Time_Array) + { + sint32_t Ack_Status = 0; + uint8_t RTC_Array[6] = {0,0,0,0,0,0}; /* Hundreths, seconds, minutes,hours, year/date, weekday/month */ + uint8_t temp8 = 0; + + Ack_Status = RSEDP_COM_PCF8583_Read_RTC(Slave_Address, RTC_Array); + + /* hours */ + temp8 = (((RTC_Array[3] & 0x30) >> 4) * 10); + *Time_Array = ((RTC_Array[3] & 0x0f) + temp8); + Time_Array++; + + /* Minutes */ + temp8=(((RTC_Array[2] & 0xf0) >> 4) * 10); + *Time_Array = ((RTC_Array[2] & 0x0f) + temp8); + Time_Array++; + + /* Seconds */ + temp8=(((RTC_Array[1] & 0xf0) >> 4) * 10); + *Time_Array = ((RTC_Array[1] & 0x0f) + temp8); + Time_Array++; + + /* Hundreths */ + temp8=(((RTC_Array[0] & 0xf0) >> 4) * 10); + *Time_Array = ((RTC_Array[0] & 0x0f) + temp8); + Time_Array++; + + // 24 Hour Flag + *Time_Array = ((RTC_Array[3] & 0x80) >> 7); + Time_Array++; + + // AMPM Flag + *Time_Array = (( RTC_Array[3] & 0x40) >> 6); + return Ack_Status; + } + + + +/* Read the date component only */ +sint32_t RSEDP_COM_PCF8583_Read_Date(uint8_t Slave_Address, uint8_t *Date_Array) + { + sint32_t Ack_Status = 0; + uint8_t RTC_Array[6] = {0,0,0,0,0,0}; /* Hundreths, seconds, minutes,hours, year/date, weekday/month */ + uint8_t temp8 = 0; + + Ack_Status = RSEDP_COM_PCF8583_Read_RTC(Slave_Address, RTC_Array); + + /* Weekday */ + *Date_Array = ((RTC_Array[5] & 0xe0) >> 5); + Date_Array++; + + /* Date */ + temp8=(((RTC_Array[4] & 0x30) >> 4) * 10); + *Date_Array = ((RTC_Array[4] & 0x0f) + temp8); + Date_Array++; + + /* Month */ + temp8 = (((RTC_Array[5] & 0x10) >> 4) * 10); + *Date_Array = ((RTC_Array[5] & 0x0f) + temp8); + Date_Array++; + + /* Year */ + *Date_Array = ((RTC_Array[4] & 0xc0) >> 6); + return Ack_Status; + } + + +/* Read time and date */ +sint32_t RSEDP_COM_PCF8583_Read_Clock_And_Date(uint8_t Slave_Address, uint8_t *Time_Array,uint8_t *Date_Array) + { + sint32_t Ack_Status = 0; + uint8_t RTC_Array[6] = {0,0,0,0,0,0}; /* Hundreths, seconds, minutes,hours, year/date, weekday/month */ + uint8_t temp8 = 0; + + Ack_Status = RSEDP_COM_PCF8583_Read_RTC(Slave_Address, RTC_Array); + + /* hours */ + temp8 = (((RTC_Array[3] & 0x30) >> 4) * 10); + *Time_Array = ((RTC_Array[3] & 0x0f) + temp8); + Time_Array++; + + /* Minutes */ + temp8 = (((RTC_Array[2] & 0xf0) >> 4) * 10); + *Time_Array = ((RTC_Array[2] & 0x0f) + temp8); + Time_Array++; + + /* Seconds */ + temp8 = (((RTC_Array[1] & 0xf0) >> 4) * 10); + *Time_Array = ((RTC_Array[1] & 0x0f) + temp8); + Time_Array++; + + /* Hundreths */ + temp8 = (((RTC_Array[0] & 0xf0) >> 4) * 10); + *Time_Array = ((RTC_Array[0] & 0x0f) + temp8); + Time_Array++; + + /* 24 Hour Flag */ + *Time_Array = ((RTC_Array[3] & 0x80)>>7); + Time_Array++; + + /* AMPM Flag */ + *Time_Array = (( RTC_Array[3] & 0x40) >> 6); + + + /* Date */ + /* Weekday */ + *Date_Array = ((RTC_Array[5] & 0xe0) >> 5); + Date_Array++; + + /* Date */ + temp8 = (((RTC_Array[4] & 0x30) >> 4) * 10); + *Date_Array = ((RTC_Array[4] & 0x0f) + temp8); + Date_Array++; + + /* Month */ + temp8 = (((RTC_Array[5] & 0x10) >> 4) * 10); + *Date_Array = ((RTC_Array[5] & 0x0f) + temp8); + Date_Array++; + + /* Year */ + *Date_Array = ((RTC_Array[4] & 0xc0) >> 6); + return Ack_Status; + } + + + + + + + +/* Battery Maintained SRAM functions */ + +/* Read data from the battery maintained SRAM */ +sint32_t RSEDP_COM_PCF8583_Read_SRAM(uint8_t Slave_Address, uint8_t *read_data, uint8_t address) + { + sint32_t Ack_Status = 0; + sint8_t tx_array[2]; /* Transmission array of data */ + sint8_t rx_array=0; /* Variable used to receive data from slave */ + + tx_array[0] = address; /* Memory address to read */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array, 1); /* Set the RTC address */ + + if (Ack_Status == ACK) + { + CNTRL_I2C_Master_Mode_Receive(Slave_Address, &rx_array,1); /* Read single byte address */ + } + *read_data=rx_array; /* Load value from RTC into receive pointer */ + return Ack_Status; + } + + +/* Write data to the battery maintained SRAM */ +sint32_t RSEDP_COM_PCF8583_Write_SRAM(uint8_t Slave_Address, uint8_t payload, uint8_t address) + { + sint32_t Ack_Status = 0; + sint8_t tx_array[2]; /* Transmission array */ + + tx_array[0] = address; /* Address */ + tx_array[1] = payload; /* Data */ + + Ack_Status = CNTRL_I2C_Master_Mode_Transmit(Slave_Address, tx_array,2); /* Send the data */ + return Ack_Status; + + } + + + + +/* Print the time, date and year */ +void RSEDP_COM_Print_Time_Date_Year(uint8_t *RTC_Array) + { + uint8_t hundreths = 0; + uint8_t seconds = 0; + uint8_t minutes = 0; + uint8_t hours = 0; + uint8_t date = 0; + uint16_t year = 0; + uint8_t weekday = 0; + uint8_t month = 0; + uint8_t temp8 = 0; + uint8_t AMPM_flag = 0; + uint8_t F24hour_flag=0; + + /* Hundreths */ + temp8 = (((*RTC_Array & 0xf0) >> 4) * 10); + hundreths = ((*RTC_Array & 0x0f) + temp8); + RTC_Array++; + + /* Seconds */ + temp8 = (((*RTC_Array & 0xf0) >> 4) * 10); + seconds = ((*RTC_Array & 0x0f) + temp8); + RTC_Array++; + + /* Minutes */ + temp8 = (((*RTC_Array & 0xf0) >> 4) * 10); + minutes = ((*RTC_Array & 0x0f) + temp8); + RTC_Array++; + + /* hours */ + temp8 = (((*RTC_Array & 0x30) >> 4) * 10); + hours = ((*RTC_Array & 0x0f) + temp8); + F24hour_flag = ((*RTC_Array & 0x80) >> 7); + AMPM_flag = (( *RTC_Array & 0x40) >> 6); + RTC_Array++; + + /* Date */ + temp8 = (((*RTC_Array & 0x30) >> 4) * 10); + date = ((*RTC_Array & 0x0f) + temp8); + + /* Year */ + year = ((*RTC_Array & 0xc0) >> 6); + RTC_Array++; + + /* Weekday */ + weekday = ((*RTC_Array & 0xe0) >> 5); + + /* Month */ + temp8 = (((*RTC_Array & 0x10) >> 4) * 10); + month = ((*RTC_Array & 0x0f) + temp8); + + pc.printf("%.2d:", hours); + pc.printf("%.2d ", minutes); + + if (F24hour_flag==1) + { + if (AMPM_flag == 0) + { + pc.printf("AM "); + } + if (AMPM_flag == 1) + { + pc.printf("PM "); + } + } + + pc.printf("%.2d.",seconds); + pc.printf("%.2d seconds ", hundreths); + + if (weekday == 0) pc.printf("Monday"); + if (weekday == 1) pc.printf("Tuesday"); + if (weekday == 2) pc.printf("Wednesday"); + if (weekday == 3) pc.printf("Thursday"); + if (weekday == 4) pc.printf("Friday"); + if (weekday == 5) pc.printf("Saturday"); + if (weekday == 6) pc.printf("Sunday"); + + pc.printf(" %.2d ",date); + + if (month == 1) pc.printf("January"); + if (month == 2) pc.printf("Febuary"); + if (month == 3) pc.printf("March"); + if (month == 4) pc.printf("April"); + if (month == 5) pc.printf("May"); + if (month == 6) pc.printf("June"); + if (month == 7) pc.printf("July"); + if (month == 8) pc.printf("August"); + if (month == 9) pc.printf("September"); + if (month == 10) pc.printf("October"); + if (month == 11) pc.printf("November"); + if (month == 12) pc.printf("December"); + + year = year + START_YEAR; + pc.printf(" %.4d ", year); + + + } + +/* Print the Time */ +void RSEDP_COM_Print_Time(uint8_t *Time_Array) + { + uint8_t hours = 0; + uint8_t minutes = 0; + uint8_t seconds = 0; + uint8_t hundreths = 0; + uint8_t F24hour_flag=0; + uint8_t AMPM_flag = 0; + + hours = *Time_Array; + Time_Array++; + minutes = *Time_Array; + Time_Array++; + seconds = *Time_Array; + Time_Array++; + hundreths = *Time_Array; + Time_Array++; + F24hour_flag = *Time_Array; + Time_Array++; + AMPM_flag = *Time_Array; + + pc.printf("%.2d:",hours); + pc.printf("%.2d ",minutes); + + if (F24hour_flag == 1) + { + if (AMPM_flag == 0) + { + pc.printf("AM "); + } + if (AMPM_flag == 1) + { + pc.printf("PM "); + } + } + + pc.printf("%.2d.",seconds); + pc.printf("%.2d seconds ",hundreths); + + } + + +/* Print the date */ +void RSEDP_COM_Print_Date(uint8_t *Date_Array) + { + uint8_t date = 0; + uint16_t year = 0; + uint8_t weekday = 0; + uint8_t month = 0; + + weekday = *Date_Array; + Date_Array++; + date = *Date_Array; + Date_Array++; + month = *Date_Array; + Date_Array++; + year = *Date_Array; + Date_Array++; + + if (weekday == 0) pc.printf("Monday"); + if (weekday == 1) pc.printf("Tuesday"); + if (weekday == 2) pc.printf("Wednesday"); + if (weekday == 3) pc.printf("Thursday"); + if (weekday == 4) pc.printf("Friday"); + if (weekday == 5) pc.printf("Saturday"); + if (weekday == 6) pc.printf("Sunday"); + + pc.printf(" %.2d ",date); + + if (month == 1) pc.printf("January"); + if (month == 2) pc.printf("Febuary"); + if (month == 3) pc.printf("March"); + if (month == 4) pc.printf("April"); + if (month == 5) pc.printf("May"); + if (month == 6) pc.printf("June"); + if (month == 7) pc.printf("July"); + if (month == 8) pc.printf("August"); + if (month == 9) pc.printf("September"); + if (month == 10) pc.printf("October"); + if (month == 11) pc.printf("November"); + if (month == 12) pc.printf("December"); + + year = year + START_YEAR; + pc.printf(" %.4d ", year); + } + + + + + + + + + + + +/* Small 5ms delay approx */ +/* Note: Change this delay to suite the write time/busy period of the RTC */ +static void delay_small(void) + { + uint32_t nnnn=0; + + for(nnnn = 0; nnnn < 0x12000; nnnn++) + { + ; + } + }