You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
extr/i2c.c

62 lines
1.4 KiB
C

/*
* i2c.c
*
* Created: 20.01.2018 12:50:54
* Author: Ulrich
*/
#include "i2c.h"
void i2c_init(void){
I2C_PORT |= (1 << SDA_PIN | 1 << SCL_PIN); //Port Pullup
TWCR = 0;
TWSR = 0;
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
_delay_ms(50);
}
//***************************************************************************************
uint8_t i2c_start (uint8_t addr){
uint16_t timeout = 0;
TWCR = (1 << TWINT | 1 << TWSTA | 1 << TWEN);
while(!(TWCR & (1<<TWINT))){
if((timeout++) > 1000) return 1;
}
TWDR = addr;
TWCR = (1 << TWINT | 1 << TWEN);
timeout = 0;
while(!(TWCR & (1<<TWINT))){
if((timeout++) > 1000) return 1;
}
return 0;
}
//***************************************************************************************
uint8_t i2c_byte (uint8_t byte){
uint16_t timeout = 0;
TWDR = byte;
TWCR = (1 << TWINT | 1 << TWEN);
while(!(TWCR & (1<<TWINT))){
if((timeout++) > 1000) return 1;
}
return 0;
}
//***************************************************************************************
uint8_t i2c_readNak(void)
{
uint16_t timeout = 0;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))){
if((timeout++) > 1000) return 0;
}
return TWDR;
}
//***************************************************************************************
void i2c_stop (void){
TWCR = (1 << TWINT | 1 << TWSTO | 1 << TWEN);
TWCR = 0;
}