Subversion Repositories FlightCtrl

Rev

Rev 1010 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
304 ingob 1
// ######################## SPI - FlightCtrl ###################
2
#include "main.h"
1010 salvo 3
 
823 ingob 4
//struct str_ToNaviCtrl_Version   ToNaviCtrl_Version;
5
//struct str_FromNaviCtrl_Version   FromNaviCtrl_Version;
6
struct str_ToNaviCtrl   ToNaviCtrl;
7
struct str_FromNaviCtrl   FromNaviCtrl;
708 ingob 8
 
304 ingob 9
unsigned char              SPI_BufferIndex;
708 ingob 10
unsigned char              SPI_RxBufferIndex;
606 ingob 11
 
882 hbuss 12
volatile unsigned char     SPI_Buffer[sizeof(FromNaviCtrl)];
823 ingob 13
unsigned char *SPI_TX_Buffer;
708 ingob 14
 
617 ingob 15
unsigned char SPITransferCompleted, SPI_ChkSum;
720 ingob 16
unsigned char SPI_RxDataValid;
17
 
921 hbuss 18
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_CAL_COMPASS};
823 ingob 19
unsigned char SPI_CommandCounter = 0;
20
 
597 ingob 21
#ifdef USE_SPI_COMMUNICATION
691 ingob 22
 
304 ingob 23
//------------------------------------------------------
24
void SPI_MasterInit(void)
25
{
26
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);    // Set MOSI and SCK output, all others input 
27
  SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT);
28
 
691 ingob 29
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE);   // Enable SPI, Master, set clock rate fck/64 
723 hbuss 30
  SPSR = 0;//(1<<SPI2X);
691 ingob 31
 
304 ingob 32
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);
606 ingob 33
  SPITransferCompleted = 1;
34
 
708 ingob 35
  //SPDR = 0x00;  // dummy write
606 ingob 36
 
823 ingob 37
  ToNaviCtrl.Sync1 = 0xAA;
38
  ToNaviCtrl.Sync2 = 0x83;
606 ingob 39
 
823 ingob 40
  ToNaviCtrl.Command = SPI_CMD_USER;
41
  ToNaviCtrl.IntegralNick = 0;
42
  ToNaviCtrl.IntegralRoll = 0;
720 ingob 43
  SPI_RxDataValid = 0;
304 ingob 44
}
45
 
46
//------------------------------------------------------
823 ingob 47
void SPI_StartTransmitPacket(void)
304 ingob 48
{
606 ingob 49
   //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return;    // transfer of prev. packet not completed
50
   if (!SPITransferCompleted) return;
723 hbuss 51
//   _delay_us(30); 
304 ingob 52
 
53
   SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
823 ingob 54
   SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl;
617 ingob 55
 
823 ingob 56
   ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
57
   if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
708 ingob 58
 
606 ingob 59
   SPITransferCompleted = 0;
304 ingob 60
   UpdateSPI_Buffer();                              // update buffer
823 ingob 61
 
304 ingob 62
   SPI_BufferIndex = 1;
708 ingob 63
  //ebugOut.Analog[16]++; 
304 ingob 64
   // -- Debug-Output ---
65
   //----
691 ingob 66
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
67
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
68
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
823 ingob 69
   ToNaviCtrl.Chksum = ToNaviCtrl.Sync1;
70
   SPDR = ToNaviCtrl.Sync1;                  // Start transmission 
691 ingob 71
//     SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
72
 
304 ingob 73
}
74
 
75
//------------------------------------------------------
76
//SIGNAL(SIG_SPI)
77
void SPI_TransmitByte(void)
78
{
708 ingob 79
   static unsigned char SPI_RXState = 0;
80
   unsigned char rxdata;
81
   static unsigned char rxchksum;
691 ingob 82
 
83
   if (SPITransferCompleted) return;
304 ingob 84
   if (!(SPSR & (1 << SPIF))) return;
723 hbuss 85
  SendSPI = 4;
691 ingob 86
 
723 hbuss 87
//   _delay_us(30); 
606 ingob 88
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
304 ingob 89
 
708 ingob 90
  rxdata = SPDR;
91
  switch ( SPI_RXState)
92
  {
93
  case 0:
94
 
95
                        SPI_RxBufferIndex = 0;
96
                        //DebugOut.Analog[17]++;
97
                        rxchksum = rxdata;  
98
                        if (rxdata == 0x81 )  { SPI_RXState  = 1;  }   // 1. Syncbyte ok 
99
 
100
           break;
101
 
102
   case 1:
103
                    if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState  = 2;  }   // 2. Syncbyte ok 
104
                 else SPI_RXState  = 0;    
105
                        //DebugOut.Analog[18]++;
106
           break;      
107
 
108
   case 2:
109
                   SPI_Buffer[SPI_RxBufferIndex++]= rxdata;             // get data
110
           //DebugOut.Analog[19]++;
823 ingob 111
           if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl))
708 ingob 112
                   {  
113
 
114
                if (rxdata == rxchksum)
115
                        {
823 ingob 116
                  unsigned char *ptr = (unsigned char *)&FromNaviCtrl;
708 ingob 117
 
118
                          memcpy(ptr, (unsigned char *) SPI_Buffer,  sizeof(SPI_Buffer));
119
 
720 ingob 120
                          SPI_RxDataValid = 1;
708 ingob 121
                        }
720 ingob 122
                        else SPI_RxDataValid = 0;
708 ingob 123
 
124
                        SPI_RXState  = 0;  
125
                   }
126
                  else rxchksum += rxdata;
127
        break;   
128
 
129
  }            
130
 
823 ingob 131
   if (SPI_BufferIndex < sizeof(ToNaviCtrl))  
606 ingob 132
     {
133
           SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
691 ingob 134
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
135
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
136
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
617 ingob 137
 
708 ingob 138
           SPDR = SPI_TX_Buffer[SPI_BufferIndex];
823 ingob 139
           ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex];
691 ingob 140
        //   SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
141
 
606 ingob 142
         }
708 ingob 143
         else SPITransferCompleted = 1;  
144
 
304 ingob 145
         SPI_BufferIndex++;
146
}
147
 
691 ingob 148
 
304 ingob 149
//------------------------------------------------------
150
void UpdateSPI_Buffer(void)
151
{
691 ingob 152
  static unsigned char i =0;
846 hbuss 153
  signed int tmp;
304 ingob 154
  cli();
823 ingob 155
 
846 hbuss 156
  ToNaviCtrl.IntegralNick = (int) (IntegralNick / 108);
157
  ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / 108);
823 ingob 158
  ToNaviCtrl.GyroCompass = ErsatzKompass / GIER_GRAD_FAKTOR;
159
  ToNaviCtrl.AccNick = (int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc);
846 hbuss 160
  ToNaviCtrl.AccRoll = (int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc);
819 hbuss 161
  NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0;
823 ingob 162
//  ToNaviCtrl.User8 = Parameter_UserParam8;
163
//  ToNaviCtrl.CalState = WinkelOut.CalcState;
164
 
165
   switch(ToNaviCtrl.Command)  // 
166
   {
167
         case SPI_CMD_USER:
168
                                ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1;
169
                                ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2;
170
                                ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3;
171
                                ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4;
172
                                ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5;
173
                                ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6;
174
                                ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7;
921 hbuss 175
                                ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8;
176
                                ToNaviCtrl.Param.Byte[8] = (unsigned char) MikroKopterFlags;
177
                MikroKopterFlags &= ~(FLAG_CALIBRATE | FLAG_START);
178
                    ToNaviCtrl.Param.Byte[9] = (unsigned char) UBat;
179
                    ToNaviCtrl.Param.Byte[10] =(unsigned char) EE_Parameter.UnterspannungsWarnung;
180
                    ToNaviCtrl.Param.Byte[11] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]);
181
        break;
182
 
183
         case SPI_CMD_PARAMETER1:
184
                                ToNaviCtrl.Param.Byte[0] = Parameter_NaviGpsModeControl;     // Parameters for the Naviboard
185
                                ToNaviCtrl.Param.Byte[1] = Parameter_NaviGpsGain;    
186
                                ToNaviCtrl.Param.Byte[2] = Parameter_NaviGpsP;        
187
                                ToNaviCtrl.Param.Byte[3] = Parameter_NaviGpsI;        
188
                                ToNaviCtrl.Param.Byte[4] = Parameter_NaviGpsD;        
189
                                ToNaviCtrl.Param.Byte[5] = Parameter_NaviGpsACC;        
190
                                ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat;        
191
                ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold;        
192
                ToNaviCtrl.Param.Byte[8] = 15; // MaxRadius
823 ingob 193
            break;
194
 
195
         case SPI_CMD_STICK:
871 hbuss 196
                tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]];  if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127;
846 hbuss 197
                                ToNaviCtrl.Param.Byte[0] = (char) tmp;
871 hbuss 198
                tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127;
846 hbuss 199
                                ToNaviCtrl.Param.Byte[1] = (char) tmp;
871 hbuss 200
                tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127;
846 hbuss 201
                                ToNaviCtrl.Param.Byte[2] = (char) tmp;
871 hbuss 202
                tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127;
846 hbuss 203
                                ToNaviCtrl.Param.Byte[3] = (char) tmp;
204
                                ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti1;
205
                                ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2;
206
                                ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3;
207
                    ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4;
855 hbuss 208
                    ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay;
823 ingob 209
            break;
210
         case SPI_CMD_CAL_COMPASS:
855 hbuss 211
                if(WinkelOut.CalcState > 5)  
212
                  {
213
                    WinkelOut.CalcState = 0;    
214
                    ToNaviCtrl.Param.Byte[0] = 5;
215
                  }  
216
                                else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState;
823 ingob 217
            break;
218
   }
219
 
304 ingob 220
  sei();
855 hbuss 221
 
720 ingob 222
  if (SPI_RxDataValid)
223
  {
855 hbuss 224
   if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV))
854 hbuss 225
   {
823 ingob 226
    GPS_Nick = FromNaviCtrl.GPS_Nick;
227
    GPS_Roll = FromNaviCtrl.GPS_Roll;
854 hbuss 228
   }
229
    if(FromNaviCtrl.CompassValue <= 360)   KompassValue = FromNaviCtrl.CompassValue;
720 ingob 230
    KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
231
 
855 hbuss 232
    if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime;
823 ingob 233
 
234
          switch (FromNaviCtrl.Command)
235
          {
236
            case  SPI_CMD_OSD_DATA:
237
//                                ToFlightCtrl.Param.Byte[0] = OsdBar;
238
//                                ToFlightCtrl.Param.Int[1]  = Distance;
239
                  break;
240
 
241
            case  SPI_CMD_GPS_POS:
242
//                                ToFlightCtrl.Param.Long[0]  = GPS_Data.Longitude;
243
//                                ToFlightCtrl.Param.Long[1]  = GPS_Data.Latitude;
244
                  break;
245
 
246
            case  SPI_CMD_GPS_TARGET:
247
//                                ToFlightCtrl.Param.Long[0]  = GPS_Data.TargetLongitude;
248
//                                ToFlightCtrl.Param.Long[1]  = GPS_Data.TargetLatitude;
249
                  break;
250
 
251
                default:
252
                  break;
253
          }
720 ingob 254
  }
255
  else
256
  {
819 hbuss 257
//    KompassValue = 0;
258
//    KompassRichtung = 0;
720 ingob 259
 
260
        GPS_Nick = 0;
261
    GPS_Roll = 0;
262
  }
304 ingob 263
}
264
 
597 ingob 265
#endif
304 ingob 266
 
267