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; }
/* description:向eeprom读一个页内的部分或者全部数据 return:0--写数据正常结束 1--I2C启动错误 2--无ACK */ uint8_t eeprom_read_sequential(uint16_t addr,uint16_t num,uint8_t *data) { uint8_t result = 0; uint8_t temp = 0; uint16_t i = 0; while(is_eeprom_busy()); result = TWI_START(); if(result != TWI_READY) return 1; #if(MEM_SIZE > SIZE_64K) if(eeprom_num == 1) temp = DEV_ADDR1|0; else temp = DEV_ADDR2|0; #else temp = DEV_ADDR|0; #endif result = TWI_SendByte(temp); if(result != TWI_ACK) return 2; result = TWI_SendByte((uint8_t)(addr>>8)); result = TWI_SendByte((uint8_t)(addr)); if(result != TWI_ACK) return 2; result = TWI_START(); #if(MEM_SIZE > SIZE_64K) if(eeprom_num == 1) temp = DEV_ADDR1|1; else temp = DEV_ADDR2|1; #else temp = DEV_ADDR|1; #endif result = TWI_SendByte(temp); if(result != TWI_ACK) return 2; for(i = 0; i < num; i++) { data[i] = TWI_ReceiveByte(); if(i != num-1) TWI_SendACK(); else TWI_SendNACK(); } TWI_STOP(); // delay_5ms(); return 0; }
/* description:向eeprom读一个字节数据 return:0--写数据正常结束 1--I2C启动错误 2--无ACK */ uint8_t eeprom_read_byte(uint16_t addr,uint8_t *data) { uint8_t result = 0; uint8_t temp = 0; while(is_eeprom_busy()); result = TWI_START(); if(result != TWI_READY) return 1; #if(MEM_SIZE > SIZE_64K) if(eeprom_num == 1) temp = DEV_ADDR1|0; else temp = DEV_ADDR2|0; #else temp = DEV_ADDR|0; #endif result = TWI_SendByte(temp); if(result != TWI_ACK) return 2; result = TWI_SendByte((uint8_t)(addr>>8)); result = TWI_SendByte((uint8_t)(addr)); if(result != TWI_ACK) return 2; result = TWI_START(); #if(MEM_SIZE > SIZE_64K) if(eeprom_num == 1) temp = DEV_ADDR1|1; else temp = DEV_ADDR2|1; #else temp = DEV_ADDR|1; #endif result = TWI_SendByte(temp); if(result != TWI_ACK) return 2; *data = TWI_ReceiveByte(); TWI_SendNACK(); TWI_STOP(); return 0; }
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; }