Forum: Mikrocontroller und Digitale Elektronik TWI/I2C mit XMEGA


von Markus (Gast)


Lesenswert?

Hi,

kann mir jemand sagen ob meine xmega routine für das twi modul so 
richtig und funktionsfähig ist und was ich besser/anderst machen sollte. 
Danke.
1
void init_twie(void)
2
{
3
4
  TWIE.MASTER.BAUD = TWI_BAUD(F_CPU, BAUDRATE);
5
  TWIE.MASTER.CTRLA = TWI_MASTER_INTLVL_OFF_gc | TWI_MASTER_ENABLE_bm;
6
  //TWIE.MASTER.CTRLB
7
  //TWIE.MASTER.CTRLC
8
  TWIE.MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;
9
10
  PORTE.DIRSET |= PIN0_bm;      
11
  PORTE.DIRSET |= PIN1_bm;
12
13
}
14
15
16
17
unsigned char twie_write(unsigned char data)
18
{
19
20
  unsigned char status;
21
22
23
  TWIE.MASTER.DATA = data;
24
25
26
  status = TWIE.MASTER.STATUS;
27
28
  if (status & TWI_MASTER_RXACK_bm) //Sende STOP wenn Slave NACK zurück gibt
29
  {
30
    TWIE.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
31
    return 0;
32
  }
33
  else if ((status & TWI_MASTER_ARBLOST_bm) || (status & TWI_MASTER_BUSERR_bm)) 
34
  {
35
    return 0;
36
  }
37
  else if (status & TWI_MASTER_WIF_bm)
38
  {
39
    return 1;  
40
  }
41
42
  return 1;
43
 
44
}
45
46
47
48
unsigned char twie_read_ack(void)
49
{
50
51
  unsigned char data;
52
53
  data = TWIE.MASTER.DATA;
54
55
  TWIE.MASTER.CTRLC = TWI_MASTER_CMD_RECVTRANS_gc; // Sende ACK
56
57
  return data;
58
59
}
60
61
62
unsigned char twie_read_nack(void)
63
{
64
65
  unsigned char data;
66
67
  data = TWIE.MASTER.DATA;
68
69
  TWIE.MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc; // Sende NACK
70
71
  return data;
72
73
}
74
75
76
unsigned char twie_address(unsigned char device_address)
77
{
78
79
  unsigned char status;
80
81
82
  TWIE.MASTER.ADDR = device_address;    //Deviceadresse senden (START wird automatisch gesendet)
83
84
  status = TWIE.MASTER.STATUS;
85
86
87
  if ((status & TWI_MASTER_ARBLOST_bm) || (status & TWI_MASTER_BUSERR_bm)) 
88
  {
89
    return 0;
90
  }
91
  else if (status & TWI_MASTER_WIF_bm) 
92
  {
93
    return 1;
94
  }
95
  else if (status & TWI_MASTER_RIF_bm) 
96
  {
97
    return 1;
98
  }
99
  else
100
  {
101
    return 0;
102
  }
103
104
}
105
106
107
108
void twie_stop(void)
109
{
110
111
  TWIE.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
112
113
}

PS: Nein ich will nicht die Lib von Atmel verwenden :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.