i2c.c


1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <avr/interrupt.h>
4
#include <avr/signal.h>
5
#include <avr/delay.h>
6
#include <avr/twi.h>
7
#include <stdlib.h> /*für exit*/
8
9
/*SD20 Adresse mit Lese- oder Schreibbit*/
10
#define SD20_W 0xC2
11
#define SD20_R 0xC3
12
13
typedef unsigned char BYTE;
14
typedef unsigned short WORD;
15
16
void i2c_start(BYTE ADRESSE)
17
{
18
  
19
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);   /*Startbedingung senden*/
20
  while (!(TWCR & (1<<TWINT)));            /*Darauf warten dass TWINT gesetzt wurde was aussagt das die Startbedingung gesendet wurde*/
21
  if ((TWSR & 0xF8) != TW_START) PORTA=0x01;      /*Überprüfen  ob  START erfolgreich gesendet wurde sonst abbrechen*/
22
  TWDR = ADRESSE;                        /*Slave Adresse in TWDR laden*/
23
  TWCR = (1<<TWINT)|(1<<TWEN);            /*TWINT und TWEN löschen damit die ADRESSE gesendet wird*/
24
  while (! (TWCR & (1<<TWINT)));            /*Darauf warten dass TWINT gesetzt wurde was aussagt dass die ADRESSE gesendet wurde*/
25
  if ((TWSR & 0xF8) != TW_MT_SLA_ACK) PORTA=0x02;   /*Überprüfen ob ADRESSE erfolgreich gesendet wirde sonst abbrechen*/
26
27
}
28
void i2c_data(BYTE DATA)
29
{
30
  
31
  TWDR = DATA;                        /*DATA in TWDR laden*/
32
  TWCR = (1<<TWINT)|(1<<TWEN);            /*TWINT und TWEN löschen damit die DATA gesendet wird*/
33
  while (! (TWCR & (1<<TWINT)));         /*Darauf warten dass TWINT gesetzt wurde was aussagt dass die DATA gesendet wurde*/
34
  if ((TWSR & 0xF8) != TW_MT_DATA_ACK) PORTA=0x04;   /*Überprüfen ob DATA erfolgreich gesendet wirde sonst abbrechen*/
35
36
}
37
void i2c_stop(void)
38
{
39
  
40
  TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);   /*Stopbedingung senden*/
41
42
}
43
int main(void)
44
{
45
  
46
  DDRA=0xFF;
47
  PORTA=0x0;
48
  
49
  i2c_start(0xC2);
50
  i2c_data(0x01);
51
  i2c_data(0x7F);
52
  i2c_stop();
53
  
54
  while(1)
55
  {}
56
    
57
}