void DS1307_GetTime(uint8_t* const Hour, uint8_t* const Minute, uint8_t* const Second) { #if defined(DUMMY_RTC) *Hour = 1; *Minute = 1; *Second = 1; return; #endif if (TWI_StartTransmission(DS1307_ADDRESS_WRITE, 10)) { TWI_SendByte(DS1307_TIMEREG_START); TWI_StopTransmission(); } DS1307_TimeRegs_t CurrentRTCTime; if (TWI_StartTransmission(DS1307_ADDRESS_READ, 10)) { TWI_ReceiveByte(&CurrentRTCTime.Byte1.IntVal, false); TWI_ReceiveByte(&CurrentRTCTime.Byte2.IntVal, false); TWI_ReceiveByte(&CurrentRTCTime.Byte3.IntVal, true); TWI_StopTransmission(); } *Second = (CurrentRTCTime.Byte1.Fields.TenSec * 10) + CurrentRTCTime.Byte1.Fields.Sec; *Minute = (CurrentRTCTime.Byte2.Fields.TenMin * 10) + CurrentRTCTime.Byte2.Fields.Min; *Hour = (CurrentRTCTime.Byte3.Fields.TenHour * 10) + CurrentRTCTime.Byte3.Fields.Hour; }
void DS1307_GetDate(uint8_t* const Day, uint8_t* const Month, uint8_t* const Year) { #if defined(DUMMY_RTC) *Day = 1; *Month = 1; *Year = 1; return; #endif if (TWI_StartTransmission(DS1307_ADDRESS_WRITE, 10)) { TWI_SendByte(DS1307_DATEREG_START); TWI_StopTransmission(); } DS1307_DateRegs_t CurrentRTCDate; if (TWI_StartTransmission(DS1307_ADDRESS_READ, 10)) { TWI_ReceiveByte(&CurrentRTCDate.Byte1.IntVal, false); TWI_ReceiveByte(&CurrentRTCDate.Byte2.IntVal, false); TWI_ReceiveByte(&CurrentRTCDate.Byte3.IntVal, true); TWI_StopTransmission(); } *Day = (CurrentRTCDate.Byte1.Fields.TenDay * 10) + CurrentRTCDate.Byte1.Fields.Day; *Month = (CurrentRTCDate.Byte2.Fields.TenMonth * 10) + CurrentRTCDate.Byte2.Fields.Month; *Year = (CurrentRTCDate.Byte3.Fields.TenYear * 10) + CurrentRTCDate.Byte3.Fields.Year; }
void Output_data() { //Set the IO-Pins for the analog Multiplexer PORTD = DeviceConfig[10]; //Send the frequency and formdata to the AD9833 SPI_Send2Byte(DeviceConfig[0], DeviceConfig[1]); //Controllregister SPI_Send2Byte(DeviceConfig[4], DeviceConfig[5]); //Freg, LSB SPI_Send2Byte(DeviceConfig[2], DeviceConfig[3]); //Freg, MSB //Send the TWI-Data, but only if device is responding. if (TWI_StartTransmission(DigiPoti, 1) == 0) { for (int i = 0; i < 4; i++) { int PotiWert = i + 6; TWI_SendByte(0x10 | i); TWI_SendByte(DeviceConfig[PotiWert]); } TWI_SendByte(0x78); TWI_SendByte(0x01); TWI_StopTransmission(); } else { ReturnError(0x03); } return; }
uint8_t TWI_WritePacket(const uint8_t SlaveAddress, const uint8_t TimeoutMS, const uint8_t* InternalAddress, uint8_t InternalAddressLen, const uint8_t* Buffer, uint8_t Length) { uint8_t ErrorCode; if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE, TimeoutMS)) == TWI_ERROR_NoError) { while (InternalAddressLen--) { if (!(TWI_SendByte(*(InternalAddress++)))) { ErrorCode = TWI_ERROR_SlaveNAK; break; } } while (Length--) { if (!(TWI_SendByte(*(Buffer++)))) { ErrorCode = TWI_ERROR_SlaveNAK; break; } } TWI_StopTransmission(); } return ErrorCode; }
void DS1307_SetDate(const uint8_t Day, const uint8_t Month, const uint8_t Year) { #if defined(DUMMY_RTC) return; #endif 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)) { TWI_SendByte(DS1307_DATEREG_START); TWI_SendByte(CurrentRTCDate.Byte1.IntVal); TWI_SendByte(CurrentRTCDate.Byte2.IntVal); TWI_SendByte(CurrentRTCDate.Byte3.IntVal); TWI_StopTransmission(); } }
void DS1307_SetTime(const uint8_t Hour, const uint8_t Minute, const uint8_t Second) { #if defined(DUMMY_RTC) return; #endif DS1307_TimeRegs_t CurrentRTCTime; CurrentRTCTime.Byte1.Fields.TenSec = (Second / 10); CurrentRTCTime.Byte1.Fields.Sec = (Second % 10); CurrentRTCTime.Byte1.Fields.CH = false; CurrentRTCTime.Byte2.Fields.TenMin = (Minute / 10); CurrentRTCTime.Byte2.Fields.Min = (Minute % 10); CurrentRTCTime.Byte3.Fields.TenHour = (Hour / 10); CurrentRTCTime.Byte3.Fields.Hour = (Hour % 10); CurrentRTCTime.Byte3.Fields.TwelveHourMode = false; if (TWI_StartTransmission(DS1307_ADDRESS_WRITE, 10)) { TWI_SendByte(DS1307_TIMEREG_START); TWI_SendByte(CurrentRTCTime.Byte1.IntVal); TWI_SendByte(CurrentRTCTime.Byte2.IntVal); TWI_SendByte(CurrentRTCTime.Byte3.IntVal); TWI_StopTransmission(); } }
uint8_t TWI_StartTransmission(TWI_t* const TWI, const uint8_t SlaveAddress, const uint8_t TimeoutMS) { uint16_t TimeoutRemaining; TWI->MASTER.ADDR = SlaveAddress; TimeoutRemaining = (TimeoutMS * 100); while (TimeoutRemaining) { uint8_t status = TWI->MASTER.STATUS; if ((status & (TWI_MASTER_WIF_bm | TWI_MASTER_ARBLOST_bm)) == (TWI_MASTER_WIF_bm | TWI_MASTER_ARBLOST_bm)) { TWI->MASTER.ADDR = SlaveAddress; } else if ((status & (TWI_MASTER_WIF_bm | TWI_MASTER_RXACK_bm)) == (TWI_MASTER_WIF_bm | TWI_MASTER_RXACK_bm)) { TWI_StopTransmission(TWI); return TWI_ERROR_SlaveResponseTimeout; } else if (status & (TWI_MASTER_WIF_bm | TWI_MASTER_RIF_bm)) { return TWI_ERROR_NoError; } _delay_us(10); TimeoutRemaining--; } if (!(TimeoutRemaining)) { if (TWI->MASTER.STATUS & TWI_MASTER_CLKHOLD_bm) { TWI_StopTransmission(TWI); } } return TWI_ERROR_BusCaptureTimeout; }
uint8_t TWI_ReadPacket(TWI_t* const TWI, const uint8_t SlaveAddress, const uint8_t TimeoutMS, const uint8_t* InternalAddress, uint8_t InternalAddressLen, uint8_t* Buffer, uint16_t Length) { uint8_t ErrorCode; if ((ErrorCode = TWI_StartTransmission(TWI, (SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE, TimeoutMS)) == TWI_ERROR_NoError) { while (InternalAddressLen--) { if (!(TWI_SendByte(TWI, *(InternalAddress++)))) { ErrorCode = TWI_ERROR_SlaveNAK; break; } } if ((ErrorCode = TWI_StartTransmission(TWI, (SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_READ, TimeoutMS)) == TWI_ERROR_NoError) { while (Length--) { if (!(TWI_ReceiveByte(TWI, Buffer++, (Length == 0)))) { ErrorCode = TWI_ERROR_SlaveNAK; break; } } } TWI_StopTransmission(TWI); } return ErrorCode; }