/*
* I2C.c
*
* Created: 11.04.2019 08:39:07
* Author: KTM
*/
#define F_CPU 16000000L
#include <avr/io.h>
#include<util/delay.h>
#define EEDEVADR 0b10100000
#define ERROR 1
#define SUCCESS (!ERROR)
#define D7 7
#define D6 6
#define D5 5
#define D4 4
#define E 3
#define RS 2
#define RW 1
#define SS 2
#define MOSI 3
#define MISO 4
#define SCK 5
void lcd_4bity(unsigned char fourbits)
{
PORTD |= (1<<E);
if( fourbits & 0x01) PORTD |= (1<<D4); else PORTD &= ~(1<<D4);
if( fourbits & 0x02) PORTD |= (1<<D5); else PORTD &= ~(1<<D5);
if( fourbits & 0x04) PORTD |= (1<<D6); else PORTD &= ~(1<<D6);
if( fourbits & 0x08) PORTD |= (1<<D7); else PORTD &= ~(1<<D7);
PORTD &= ~(1<<E);
}
void lcd_bajt(unsigned char bajt)
{
PORTD |= (1<<E);
lcd_4bity(bajt>>4);
PORTD &= ~(1<<E);
_delay_us(5);
PORTD |= (1<<E);
lcd_4bity(bajt);
PORTD &= ~(1<<E);
_delay_ms(1);
}
void ini_lcd(void)
{
lcd_4bity(3);
_delay_ms(10);
lcd_4bity(3);
_delay_ms(1);
lcd_4bity(3);
_delay_ms(1);
lcd_4bity(2);
_delay_ms(1);
lcd_bajt(28);
_delay_ms(1);
lcd_bajt(20);
_delay_ms(1);
lcd_bajt(12);
_delay_ms(1);
lcd_bajt(6);
_delay_ms(1);
lcd_bajt(1);
_delay_ms(10);
lcd_bajt(128);
_delay_ms(5);
}
//////// SPI ///////////
char aData;
char bData;
void SPI_Init(void)
{
DDRB |= (1<<SS);
PORTB &= ~(1<<SS);
/* Set MOSI and SCK output, all others input */
DDRB |= (1<<MOSI)|(1<<SCK);
PORTB |= (1<<MISO);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<CPHA);
}
char SPI_Transmit(char aData, char bData)
{
PORTB |= (1<<SS);
/* Start transmission */
SPDR = aData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
SPDR = bData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
PORTB &= ~(1<<SS);
char z = SPDR;
return(z);
}
void setup(void)
{
DDRD |= (1<<D7);
DDRD |= (1<<D6);
DDRD |= (1<<D5);
DDRD |= (1<<D4);
DDRD |= (1<<E);
DDRD |= (1<<RS);
DDRD |= (1<<RW);
PORTD &= ~(1<<RW);
PORTD &= ~(1<<RS);
PORTD &= ~(1<<E);
ini_lcd();
PORTD |= (1<<RS);
_delay_ms(1);
}
void loop(void)
{
PORTD &= ~(1<<RS);
lcd_bajt(0x80);
PORTD |= (1<<RS);
}
void TWIInit(void)
{
//set SCL to 400kHz
TWSR = 0x00;
TWBR = 0x0C;
//enable TWI
TWCR = (1<<TWEN);
}
void TWIStart(void)
{
TWCR =
(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
}
void TWIStop(void)
{
TWCR =
(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
void TWIWrite(uint8_t u8data)
{
TWDR = u8data;
TWCR = (1<<TWINT)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
}
uint8_t TWIReadACK(void)
{
TWCR =
(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
while ((TWCR & (1<<TWINT)) == 0);
return TWDR;
}
uint8_t TWIReadNACK(void)
{
TWCR = (1<<TWINT)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
return TWDR;
}
uint8_t TWIGetStatus(void)
{
uint8_t status;
//mask status
status = TWSR & 248;
return status;
}
uint8_t EEWriteByte(uint16_t u16addr, uint8_t u8data)
{
TWIStart();
if (TWIGetStatus() != 8)
return ERROR;
//select device and send A2 A1 A0 address bits
TWIWrite((EEDEVADR)|(uint8_t)((u16addr & 0x0700)>>7));
if (TWIGetStatus() != 24)
return ERROR;
//send the rest of address
TWIWrite((uint8_t)(u16addr));
if (TWIGetStatus() != 40)
return ERROR;
//write byte to eeprom
TWIWrite(u8data);
if (TWIGetStatus() != 40)
return ERROR;
TWIStop();
return SUCCESS;
}
uint8_t EEReadByte(uint16_t u16addr)
{
//uint8_t databyte;
uint8_t sdata;
TWIStart();
if (TWIGetStatus() != 8)
return ERROR;
//select device and send A2 A1 A0 address bits
TWIWrite((EEDEVADR)|((uint8_t)((u16addr & 0x0700)>>7)));
if (TWIGetStatus() != 36)
return ERROR;
//send the rest of address
TWIWrite((uint8_t)(u16addr));
if (TWIGetStatus() != 40)
return ERROR;
//send start
TWIStart();
if (TWIGetStatus() != 16)
return ERROR;
//select device and send read bit
TWIWrite((EEDEVADR)|((uint8_t)((u16addr & 0x0700)>>7))|1);
if (TWIGetStatus() != 64)
return ERROR;
sdata = TWIReadNACK();
if (TWIGetStatus() != 88)
return ERROR;
TWIStop();
return sdata;
}
int main(void)
{
TWIInit();
uint8_t ddata = 0;
uint8_t ew;
setup();
ew= EEWriteByte(5, 'b');
if(ew==SUCCESS)
{
lcd_bajt('S');
}
else lcd_bajt('E');
_delay_ms(10);
ddata = EEReadByte(5);
if(ew==ERROR)
{
lcd_bajt('E');
}
else lcd_bajt('S');
lcd_bajt(ddata);
while(1)
loop();
return 0;
}