- DS1307_DateRegs_t CurrentRTCDate;
- CurrentRTCDate.Byte1.Fields.TenDay = (Day / 10);
- CurrentRTCDate.Byte1.Fields.Day = (Day % 10);
- CurrentRTCDate.Byte2.Fields.TenMonth = (Month / 10);
- CurrentRTCDate.Byte2.Fields.Month = (Month % 10);
- CurrentRTCDate.Byte3.Fields.TenYear = (Year / 10);
- CurrentRTCDate.Byte3.Fields.Year = (Year % 10);
-
- if (TWI_StartTransmission(DS1307_ADDRESS_WRITE, 10))
+ DS1307_DateTimeRegs_t NewRegValues;
+ const uint8_t WriteAddress = 0;
+
+ // Convert new time data to the DS1307's time register layout
+ NewRegValues.Byte1.Fields.TenSec = (NewTimeDate->Second / 10);
+ NewRegValues.Byte1.Fields.Sec = (NewTimeDate->Second % 10);
+ NewRegValues.Byte1.Fields.CH = false;
+ NewRegValues.Byte2.Fields.TenMin = (NewTimeDate->Minute / 10);
+ NewRegValues.Byte2.Fields.Min = (NewTimeDate->Minute % 10);
+ NewRegValues.Byte3.Fields.TenHour = (NewTimeDate->Hour / 10);
+ NewRegValues.Byte3.Fields.Hour = (NewTimeDate->Hour % 10);
+ NewRegValues.Byte3.Fields.TwelveHourMode = false;
+
+ // Convert new date data to the DS1307's date register layout
+ NewRegValues.Byte4.Fields.DayOfWeek = 0;
+ NewRegValues.Byte5.Fields.TenDay = (NewTimeDate->Day / 10);
+ NewRegValues.Byte5.Fields.Day = (NewTimeDate->Day % 10);
+ NewRegValues.Byte6.Fields.TenMonth = (NewTimeDate->Month / 10);
+ NewRegValues.Byte6.Fields.Month = (NewTimeDate->Month % 10);
+ NewRegValues.Byte7.Fields.TenYear = (NewTimeDate->Year / 10);
+ NewRegValues.Byte7.Fields.Year = (NewTimeDate->Year % 10);
+
+ // Write the new Time and Date into the DS1307
+ if (TWI_WritePacket(DS1307_ADDRESS, 10, &WriteAddress, sizeof(WriteAddress),
+ (uint8_t*)&NewRegValues, sizeof(DS1307_DateTimeRegs_t)) != TWI_ERROR_NoError)