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 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; }
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(); } }
/* 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; }
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_write_page(uint16_t page_num,uint8_t offshit,uint8_t num,uint8_t *data) { uint8_t result = 0; uint8_t temp = 0; uint8_t i = 0; uint16_t addr = page_num*PAGE_SIZE+offshit; 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)); if(result != TWI_ACK) return 2; result = TWI_SendByte((uint8_t)(addr)); if(result != TWI_ACK) return 2; for(i = 0; i < num; i++) { result = TWI_SendByte(data[i]); if(result != TWI_ACK) return 2; } TWI_STOP(); // delay_5ms(); return 0; }
/* description:向eeprom写一个字节数据 return:0--写数据正常结束 1--I2C启动错误 2--无ACK */ uint8_t eeprom_write_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)); if(result != TWI_ACK) return 2; result = TWI_SendByte((uint8_t)(addr)); if(result != TWI_ACK) return 2; result = TWI_SendByte(data); if(result != TWI_ACK) return 2; TWI_STOP(); // delay_5ms(); 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; }
/* description:查询eeprom写周期是否结束 return:0-写周期结束 1-写周期没有结束 */ uint8_t is_eeprom_busy(void) { uint8_t result = 0; uint8_t temp = 0; 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; return 0; }