Rev 1 | Rev 4 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1 | Rev 3 | ||
---|---|---|---|
Line 1... | Line -... | ||
1 | /*############################################################################ |
- | |
2 | Slaveadr = 0x52 = Vorne, 0x54 = Hinten, 0x56 = Rechts, 0x58 = Links |
- | |
3 | ############################################################################*/ |
- | |
Line 4... | Line 1... | ||
4 | 1 | ||
5 | #include <avr/io.h> |
2 | #include <avr/io.h> |
6 | #include <util/twi.h> |
3 | #include <util/twi.h> |
Line -... | Line 4... | ||
- | 4 | #include "main.h" |
|
- | 5 | ||
- | 6 | unsigned char I2C_RxBufferSize, I2C_TxBufferSize; |
|
7 | #include "main.h" |
7 | unsigned char *I2C_TxBuffer, *I2C_RxBuffer; |
8 | 8 | unsigned char Tx_Idx=0, Rx_Idx=0, I2C_Direction; |
|
- | 9 | unsigned char I2C_Command; |
|
- | 10 | unsigned char Tx_Idx, Rx_Idx; |
|
- | 11 | ||
- | 12 | struct str_I2C_Heading I2C_Heading; |
|
- | 13 | struct str_I2C_WriteNickRoll I2C_WriteNickRoll; |
|
- | 14 | struct str_I2C_Mag I2C_Mag; |
|
- | 15 | struct str_I2C_EEPROM I2C_ReadEEPROM, I2C_WriteEEPROM; |
|
- | 16 | struct str_I2C_Version I2C_Version; |
|
Line 9... | Line 17... | ||
9 | unsigned char I2C_RXBuffer; |
17 | |
10 | unsigned char Byte_Counter=0; |
18 | |
11 | 19 | ||
12 | //############################################################################ |
20 | //############################################################################ |
13 | //I2C (TWI) Interface Init |
21 | //I2C (TWI) Interface Init |
14 | void InitIC2_Slave(uint8_t adr) |
22 | void InitIC2_Slave(void) |
15 | //############################################################################ |
23 | //############################################################################ |
- | 24 | { |
|
- | 25 | TWAR = I2C_SLAVE_ADDRESS; // Eigene Adresse setzen |
|
- | 26 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
|
- | 27 | ||
- | 28 | ||
- | 29 | I2C_Version.Hauptversion = VersionInfo.Hauptversion; |
|
16 | { |
30 | I2C_Version.Nebenversion = VersionInfo.Nebenversion; |
17 | TWAR = adr; // Eigene Adresse setzen |
- | |
- | 31 | I2C_Version.Comp = 1; |
|
18 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
32 | |
19 | } |
33 | } |
20 | 34 | #define TWCR_ACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC) |
|
21 | //############################################################################ |
35 | //############################################################################ |
22 | //ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet |
36 | //ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet |
23 | //sich dann ein Statuscode, anhand dessen die Situation festgestellt werden kann. |
37 | //sich dann ein Statuscode, anhand dessen die Situation festgestellt werden kann. |
24 | ISR (TWI_vect) |
38 | ISR (TWI_vect) |
25 | //############################################################################ |
39 | //############################################################################ |
26 | { |
40 | { |
27 | switch (TWSR & 0xF8) |
41 | switch (TWSR & 0xF8) |
28 | { |
42 | { |
- | 43 | case SR_SLA_ACK: |
|
- | 44 | //TWCR |= (1<<TWINT); |
|
29 | case SR_SLA_ACK: |
45 | Rx_Idx = 0; |
30 | TWCR |= (1<<TWINT); |
46 | |
31 | Byte_Counter=0; |
47 | TWCR_ACK; |
- | 48 | return; |
|
- | 49 | // Daten Empfangen |
|
32 | return; |
50 | case SR_PREV_ACK: |
- | 51 | ||
- | 52 | if (Rx_Idx == 0) |
|
- | 53 | { I2C_Command = TWDR; |
|
- | 54 | ||
- | 55 | switch(I2C_Command) |
|
- | 56 | { |
|
- | 57 | case I2C_CMD_VERSION: |
|
- | 58 | I2C_TxBuffer = (unsigned char *)&I2C_Version; |
|
- | 59 | I2C_TxBufferSize = sizeof(I2C_Version); |
|
- | 60 | I2C_RxBufferSize = 0; |
|
- | 61 | break; |
|
- | 62 | case I2C_CMD_WRITE_EEPROM: |
|
- | 63 | I2C_TxBufferSize = 0; |
|
- | 64 | I2C_RxBuffer = (unsigned char *)&I2C_WriteEEPROM; |
|
- | 65 | I2C_RxBufferSize = sizeof(I2C_WriteEEPROM); |
|
- | 66 | break; |
|
- | 67 | case I2C_CMD_READ_EEPROM: |
|
- | 68 | I2C_TxBuffer = (unsigned char *)&I2C_ReadEEPROM.Inhalt; |
|
- | 69 | I2C_TxBufferSize = 2; |
|
- | 70 | I2C_RxBuffer = (unsigned char *)&I2C_ReadEEPROM; |
|
- | 71 | I2C_RxBufferSize = 1; |
|
- | 72 | break; |
|
- | 73 | case I2C_CMD_READ_MAG: |
|
- | 74 | I2C_TxBuffer = (unsigned char *)&I2C_Mag; |
|
- | 75 | I2C_TxBufferSize = sizeof(I2C_Mag); |
|
- | 76 | I2C_RxBufferSize = 0; |
|
- | 77 | ||
- | 78 | I2C_Mag.MagX = MagnetN; |
|
- | 79 | I2C_Mag.MagY = MagnetR; |
|
- | 80 | I2C_Mag.MagZ = MagnetZ; |
|
- | 81 | ||
- | 82 | break; |
|
- | 83 | case I2C_CMD_READ_HEADING: |
|
- | 84 | I2C_TxBuffer = (unsigned char *)&I2C_Heading; |
|
- | 85 | I2C_TxBufferSize = sizeof(I2C_Heading); |
|
- | 86 | I2C_RxBuffer = (unsigned char *)&I2C_WriteNickRoll; |
|
- | 87 | I2C_RxBufferSize = sizeof(I2C_WriteNickRoll); |
|
- | 88 | ||
- | 89 | I2C_Heading.Heading = Heading; |
|
- | 90 | WinkelOut.Winkel[NICK] = I2C_WriteNickRoll.Nick; |
|
- | 91 | WinkelOut.Winkel[ROLL] = I2C_WriteNickRoll.Roll; |
|
- | 92 | break; |
|
- | 93 | } |
|
- | 94 | } |
|
- | 95 | else |
|
- | 96 | { |
|
- | 97 | if (Rx_Idx < I2C_RxBufferSize) I2C_RxBuffer[Rx_Idx] = TWDR; |
|
- | 98 | } |
|
- | 99 | ||
33 | // Daten Empfangen |
100 | Rx_Idx++; |
34 | case SR_PREV_ACK: |
101 | |
- | 102 | ||
35 | I2C_RXBuffer = TWDR; |
103 | I2C_Timeout = 500; |
36 | I2C_Timeout = 500; |
104 | //TWCR |= (1<<TWINT); |
- | 105 | TWCR_ACK; |
|
37 | TWCR |= (1<<TWINT); |
106 | return; |
38 | return; |
- | |
39 | // Daten Senden |
107 | // Daten Senden |
- | 108 | ||
40 | case SW_SLA_ACK: |
109 | case SW_SLA_ACK: |
41 | if (Byte_Counter==0) |
- | |
42 | { |
- | |
43 | TWDR = 0;//Mittelstrom; |
- | |
44 | Byte_Counter++; |
- | |
- | 110 | Tx_Idx = 0; |
|
45 | } |
111 | |
46 | else |
112 | if (I2C_TxBufferSize > 0) TWDR = I2C_TxBuffer[Tx_Idx++]; |
47 | { |
- | |
48 | TWDR = 0;//MaxPWM; |
113 | |
49 | } |
114 | // TWCR |= (1<<TWINT) | (1<< TWEA); |
50 | TWCR |= (1<<TWINT); |
115 | TWCR_ACK; |
51 | return; |
- | |
52 | // Daten Senden |
- | |
53 | case SW_DATA_ACK: |
116 | return; |
54 | if (Byte_Counter==0) |
- | |
55 | { |
- | |
56 | TWDR = 0;//Mittelstrom; |
- | |
57 | Byte_Counter++; |
117 | // Daten Senden |
58 | } |
118 | case SW_DATA_ACK: |
59 | else |
119 | if (Tx_Idx < I2C_TxBufferSize) TWDR = I2C_TxBuffer[Tx_Idx++]; |
60 | { |
- | |
61 | TWDR = 0;//MaxPWM; |
120 | else TWDR = 0x00; |
62 | } |
121 | //TWCR |= (1<<TWINT) | (1<< TWEA); |
63 | TWCR |= (1<<TWINT); |
122 | TWCR_ACK; |
64 | return; |
123 | return; |
65 | // Bus-Fehler zurücksetzen |
124 | // Bus-Fehler zurücksetzen |