Subversion Repositories FlightCtrl

Rev

Rev 744 | Rev 819 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 744 Rev 805
1
// ######################## SPI - FlightCtrl ###################
1
// ######################## SPI - FlightCtrl ###################
2
#include "main.h"
2
#include "main.h"
3
 
3
 
4
 
4
 
5
struct str_ToNaviCtrl_Version   ToNaviCtrl_Version;
5
struct str_ToNaviCtrl_Version   ToNaviCtrl_Version;
6
struct str_FromNaviCtrl_Version   FromNaviCtrl_Version;
6
struct str_FromNaviCtrl_Version   FromNaviCtrl_Version;
7
struct str_ToNaviCtrl_Value   ToNaviCtrl_Value;
7
struct str_ToNaviCtrl_Value   ToNaviCtrl_Value;
8
struct str_FromNaviCtrl_Value   FromNaviCtrl_Value;
8
struct str_FromNaviCtrl_Value   FromNaviCtrl_Value;
9
 
9
 
10
unsigned char              SPI_BufferIndex;
10
unsigned char              SPI_BufferIndex;
11
unsigned char              SPI_RxBufferIndex;
11
unsigned char              SPI_RxBufferIndex;
12
 
12
 
13
volatile unsigned char     SPI_Buffer[sizeof(FromNaviCtrl_Value)];
13
volatile unsigned char     SPI_Buffer[sizeof(FromNaviCtrl_Value)];
14
unsigned char *SPI_TX_Buffer, *ToNaviCtrl_Chksum;
14
unsigned char *SPI_TX_Buffer, *ToNaviCtrl_Chksum;
15
 
15
 
16
unsigned char SPITransferCompleted, SPI_ChkSum;
16
unsigned char SPITransferCompleted, SPI_ChkSum;
17
unsigned char SPI_RxDataValid;
17
unsigned char SPI_RxDataValid;
18
 
18
 
19
#ifdef USE_SPI_COMMUNICATION
19
#ifdef USE_SPI_COMMUNICATION
20
 
20
 
21
//------------------------------------------------------
21
//------------------------------------------------------
22
void SPI_MasterInit(void)
22
void SPI_MasterInit(void)
23
{
23
{
24
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);    // Set MOSI and SCK output, all others input 
24
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);    // Set MOSI and SCK output, all others input 
25
  SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT);
25
  SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT);
26
   
26
   
27
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE);   // Enable SPI, Master, set clock rate fck/64 
27
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE);   // Enable SPI, Master, set clock rate fck/64 
28
  SPSR = 0;//(1<<SPI2X);
28
  SPSR = 0;//(1<<SPI2X);
29
 
29
 
30
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);
30
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);
31
  SPITransferCompleted = 1;
31
  SPITransferCompleted = 1;
32
 
32
 
33
  //SPDR = 0x00;  // dummy write
33
  //SPDR = 0x00;  // dummy write
34
 
34
 
35
  ToNaviCtrl_Value.Sync1 = 0xAA;
35
  ToNaviCtrl_Value.Sync1 = 0xAA;
36
  ToNaviCtrl_Value.Sync2 = 0x83;
36
  ToNaviCtrl_Value.Sync2 = 0x83;
37
 
37
 
38
  ToNaviCtrl_Value.Command = SPI_CMD_VALUE;
38
  ToNaviCtrl_Value.Command = SPI_CMD_VALUE;
39
  ToNaviCtrl_Value.IntegralNick = 12345;
39
  ToNaviCtrl_Value.IntegralNick = 12345;
40
  ToNaviCtrl_Value.IntegralRoll = 56789;
40
  ToNaviCtrl_Value.IntegralRoll = 56789;
41
  ToNaviCtrl_Value.StickNick = 100;
41
  ToNaviCtrl_Value.StickNick = 100;
42
  ToNaviCtrl_Value.StickRoll = 150;//(char) StickRoll;
42
  ToNaviCtrl_Value.StickRoll = 150;//(char) StickRoll;
43
  ToNaviCtrl_Value.StickGier = 200;//(char) StickGier;
43
  ToNaviCtrl_Value.StickGier = 200;//(char) StickGier;
44
   
44
   
45
  SPI_RxDataValid = 0;
45
  SPI_RxDataValid = 0;
46
}
46
}
47
 
47
 
48
//------------------------------------------------------
48
//------------------------------------------------------
49
void SPI_StartTransmitPacket(unsigned char command)
49
void SPI_StartTransmitPacket(unsigned char command)
50
{
50
{
51
   //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return;    // transfer of prev. packet not completed
51
   //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return;    // transfer of prev. packet not completed
52
   if (!SPITransferCompleted) return;
52
   if (!SPITransferCompleted) return;
53
//   _delay_us(30); 
53
//   _delay_us(30); 
54
   
54
   
55
   SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
55
   SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
56
   
56
   
57
   switch(command)
57
   switch(command)
58
   {
58
   {
59
     case SPI_CMD_VERSION: SPI_TX_Buffer  = (unsigned char *) &ToNaviCtrl_Version;
59
     case SPI_CMD_VERSION: SPI_TX_Buffer  = (unsigned char *) &ToNaviCtrl_Version;
60
                                                   ToNaviCtrl_Chksum = (unsigned char *) &ToNaviCtrl_Version.Chksum;
60
                                                   ToNaviCtrl_Chksum = (unsigned char *) &ToNaviCtrl_Version.Chksum;
61
            break;       
61
            break;       
62
       
62
       
63
         case SPI_CMD_VALUE: SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl_Value;
63
         case SPI_CMD_VALUE: SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl_Value;
64
                             ToNaviCtrl_Chksum = (unsigned char *) &ToNaviCtrl_Value.Chksum;
64
                             ToNaviCtrl_Chksum = (unsigned char *) &ToNaviCtrl_Value.Chksum;
65
            break;
65
            break;
66
 
66
 
67
   }
67
   }
68
   
68
   
69
   
69
   
70
   SPITransferCompleted = 0;
70
   SPITransferCompleted = 0;
71
   UpdateSPI_Buffer();                              // update buffer
71
   UpdateSPI_Buffer();                              // update buffer
72
   SPI_BufferIndex = 1;
72
   SPI_BufferIndex = 1;
73
  //ebugOut.Analog[16]++; 
73
  //ebugOut.Analog[16]++; 
74
   // -- Debug-Output ---
74
   // -- Debug-Output ---
75
   //----
75
   //----
76
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
76
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
77
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
77
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
78
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
78
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
79
   SPDR = ToNaviCtrl_Value.Sync1;                  // Start transmission 
79
   SPDR = ToNaviCtrl_Value.Sync1;                  // Start transmission 
80
   *ToNaviCtrl_Chksum = ToNaviCtrl_Value.Sync1;
80
   *ToNaviCtrl_Chksum = ToNaviCtrl_Value.Sync1;
81
//     SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
81
//     SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
82
 
82
 
83
}
83
}
84
 
84
 
85
//------------------------------------------------------
85
//------------------------------------------------------
86
//SIGNAL(SIG_SPI)
86
//SIGNAL(SIG_SPI)
87
void SPI_TransmitByte(void)
87
void SPI_TransmitByte(void)
88
{
88
{
89
   static unsigned char SPI_RXState = 0;
89
   static unsigned char SPI_RXState = 0;
90
   unsigned char rxdata;
90
   unsigned char rxdata;
91
   static unsigned char rxchksum;
91
   static unsigned char rxchksum;
92
   
92
   
93
   if (SPITransferCompleted) return;
93
   if (SPITransferCompleted) return;
94
   if (!(SPSR & (1 << SPIF))) return;
94
   if (!(SPSR & (1 << SPIF))) return;
95
  SendSPI = 4;
95
  SendSPI = 4;
96
   
96
   
97
//   _delay_us(30); 
97
//   _delay_us(30); 
98
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
98
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
99
 
99
 
100
  rxdata = SPDR;
100
  rxdata = SPDR;
101
  switch ( SPI_RXState)
101
  switch ( SPI_RXState)
102
  {
102
  {
103
  case 0:
103
  case 0:
104
           
104
           
105
                        SPI_RxBufferIndex = 0;
105
                        SPI_RxBufferIndex = 0;
106
                        //DebugOut.Analog[17]++;
106
                        //DebugOut.Analog[17]++;
107
                        rxchksum = rxdata;  
107
                        rxchksum = rxdata;  
108
                        if (rxdata == 0x81 )  { SPI_RXState  = 1;  }   // 1. Syncbyte ok 
108
                        if (rxdata == 0x81 )  { SPI_RXState  = 1;  }   // 1. Syncbyte ok 
109
                       
109
                       
110
           break;
110
           break;
111
 
111
 
112
   case 1:
112
   case 1:
113
                    if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState  = 2;  }   // 2. Syncbyte ok 
113
                    if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState  = 2;  }   // 2. Syncbyte ok 
114
                 else SPI_RXState  = 0;    
114
                 else SPI_RXState  = 0;    
115
                        //DebugOut.Analog[18]++;
115
                        //DebugOut.Analog[18]++;
116
           break;      
116
           break;      
117
           
117
           
118
   case 2:
118
   case 2:
119
                   SPI_Buffer[SPI_RxBufferIndex++]= rxdata;             // get data
119
                   SPI_Buffer[SPI_RxBufferIndex++]= rxdata;             // get data
120
           //DebugOut.Analog[19]++;
120
           //DebugOut.Analog[19]++;
121
           if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl_Value))
121
           if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl_Value))
122
                   {  
122
                   {  
123
                         
123
                         
124
                if (rxdata == rxchksum)
124
                if (rxdata == rxchksum)
125
                        {
125
                        {
126
                  unsigned char *ptr = (unsigned char *)&FromNaviCtrl_Value;
126
                  unsigned char *ptr = (unsigned char *)&FromNaviCtrl_Value;
127
     
127
     
128
                          memcpy(ptr, (unsigned char *) SPI_Buffer,  sizeof(SPI_Buffer));
128
                          memcpy(ptr, (unsigned char *) SPI_Buffer,  sizeof(SPI_Buffer));
129
                         
129
                         
130
                          SPI_RxDataValid = 1;
130
                          SPI_RxDataValid = 1;
131
                        }
131
                        }
132
                        else SPI_RxDataValid = 0;
132
                        else SPI_RxDataValid = 0;
133
                       
133
                       
134
                        SPI_RXState  = 0;  
134
                        SPI_RXState  = 0;  
135
                   }
135
                   }
136
                  else rxchksum += rxdata;
136
                  else rxchksum += rxdata;
137
        break;   
137
        break;   
138
         
138
         
139
  }            
139
  }            
140
 
140
 
141
   if (SPI_BufferIndex < sizeof(ToNaviCtrl_Value))  
141
   if (SPI_BufferIndex < sizeof(ToNaviCtrl_Value))  
142
     {
142
     {
143
           SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
143
           SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
144
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
144
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
145
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
145
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
146
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
146
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
147
           
147
           
148
           SPDR = SPI_TX_Buffer[SPI_BufferIndex];
148
           SPDR = SPI_TX_Buffer[SPI_BufferIndex];
149
           *ToNaviCtrl_Chksum += SPI_TX_Buffer[SPI_BufferIndex];
149
           *ToNaviCtrl_Chksum += SPI_TX_Buffer[SPI_BufferIndex];
150
        //   SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
150
        //   SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
151
 
151
 
152
         }
152
         }
153
         else SPITransferCompleted = 1;  
153
         else SPITransferCompleted = 1;  
154
       
154
       
155
         SPI_BufferIndex++;
155
         SPI_BufferIndex++;
156
}
156
}
157
 
157
 
158
 
158
 
159
//------------------------------------------------------
159
//------------------------------------------------------
160
void UpdateSPI_Buffer(void)
160
void UpdateSPI_Buffer(void)
161
{
161
{
162
  static unsigned char i =0;
162
  static unsigned char i =0;
163
  cli();
163
  cli();
164
  ToNaviCtrl_Value.Command = SPI_CMD_VALUE;
164
  ToNaviCtrl_Value.Command = SPI_CMD_VALUE;
165
  ToNaviCtrl_Value.IntegralNick = (int) ( IntegralNick / 1024);
165
  ToNaviCtrl_Value.IntegralNick = (int) (IntegralNick / 1024);
166
  ToNaviCtrl_Value.IntegralRoll = (int) (IntegralRoll / 1024);
166
  ToNaviCtrl_Value.IntegralRoll = (int) (IntegralRoll / 1024);
-
 
167
  ToNaviCtrl_Value.AccNick = (int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc);
-
 
168
  ToNaviCtrl_Value.AccRoll = (int) ACC_AMPLIFY * (Mittelwert_AccRoll / NaviCntAcc);
-
 
169
  NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0;
167
  ToNaviCtrl_Value.StickNick = (char) PPM_in[EE_Parameter.Kanalbelegung[K_NICK]];
170
  ToNaviCtrl_Value.StickNick = (char) PPM_in[EE_Parameter.Kanalbelegung[K_NICK]];
168
  ToNaviCtrl_Value.StickRoll = (char) PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]];
171
  ToNaviCtrl_Value.StickRoll = (char) PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]];
169
  ToNaviCtrl_Value.StickGier = (char) PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
172
  ToNaviCtrl_Value.StickGier = (char) PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
170
  ToNaviCtrl_Value.GyroCompass = ErsatzKompass / GIER_GRAD_FAKTOR;
173
  ToNaviCtrl_Value.GyroCompass = ErsatzKompass / GIER_GRAD_FAKTOR;
171
  ToNaviCtrl_Value.User1 = Parameter_UserParam1;
174
  ToNaviCtrl_Value.User1 = Parameter_UserParam1;
172
  ToNaviCtrl_Value.User2 = Parameter_UserParam2;
175
  ToNaviCtrl_Value.User2 = Parameter_UserParam2;
173
  ToNaviCtrl_Value.User3 = Parameter_UserParam3;
176
  ToNaviCtrl_Value.User3 = Parameter_UserParam3;
174
  ToNaviCtrl_Value.User4 = Parameter_UserParam4;
177
  ToNaviCtrl_Value.User4 = Parameter_UserParam4;
175
  ToNaviCtrl_Value.User5 = Parameter_UserParam5;
178
  ToNaviCtrl_Value.User5 = Parameter_UserParam5;
176
  ToNaviCtrl_Value.User6 = Parameter_UserParam6;
179
  ToNaviCtrl_Value.User6 = Parameter_UserParam6;
177
  ToNaviCtrl_Value.User7 = Parameter_UserParam7;
180
  ToNaviCtrl_Value.User7 = Parameter_UserParam7;
178
  ToNaviCtrl_Value.User8 = Parameter_UserParam8;
181
  ToNaviCtrl_Value.User8 = Parameter_UserParam8;
179
  sei();
182
  sei();
180
 
183
 
181
  if (SPI_RxDataValid)
184
  if (SPI_RxDataValid)
182
  {
185
  {
183
    GPS_Nick = FromNaviCtrl_Value.GPS_Nick;
186
    GPS_Nick = FromNaviCtrl_Value.GPS_Nick;
184
    GPS_Roll = FromNaviCtrl_Value.GPS_Roll;
187
    GPS_Roll = FromNaviCtrl_Value.GPS_Roll;
185
    KompassValue = FromNaviCtrl_Value.CompassValue;
188
    KompassValue = FromNaviCtrl_Value.CompassValue;
186
    KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
189
    KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
187
 
190
 
188
    if (FromNaviCtrl_Value.BeepTime > beeptime) beeptime = FromNaviCtrl_Value.BeepTime;
191
    if (FromNaviCtrl_Value.BeepTime > beeptime) beeptime = FromNaviCtrl_Value.BeepTime;
189
  }
192
  }
190
  else
193
  else
191
  {
194
  {
192
    KompassValue = 0;
195
    KompassValue = 0;
193
    KompassRichtung = 0;
196
    KompassRichtung = 0;
194
       
197
       
195
        GPS_Nick = 0;
198
        GPS_Nick = 0;
196
    GPS_Roll = 0;
199
    GPS_Roll = 0;
197
  }
200
  }
198
}
201
}
199
 
202
 
200
#endif
203
#endif
201
 
204
 
202
 
205
 
203
 
206