TWI/I2C mit XMEGA

Gast #2292672
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren