Subversion Repositories MK3Mag

Rev

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