Subversion Repositories FlightCtrl

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
304 ingob 1
// ######################## SPI - FlightCtrl ###################
2
#include "main.h"
3
 
4
 
823 ingob 5
//struct str_ToNaviCtrl_Version   ToNaviCtrl_Version;
6
//struct str_FromNaviCtrl_Version   FromNaviCtrl_Version;
7
struct str_ToNaviCtrl   ToNaviCtrl;
8
struct str_FromNaviCtrl   FromNaviCtrl;
708 ingob 9
 
304 ingob 10
unsigned char              SPI_BufferIndex;
708 ingob 11
unsigned char              SPI_RxBufferIndex;
606 ingob 12
 
823 ingob 13
volatile unsigned char     SPI_Buffer[sizeof(FromNaviCtrl) + 8];
14
unsigned char *SPI_TX_Buffer;
708 ingob 15
 
617 ingob 16
unsigned char SPITransferCompleted, SPI_ChkSum;
720 ingob 17
unsigned char SPI_RxDataValid;
18
 
823 ingob 19
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_CAL_COMPASS };
20
unsigned char SPI_CommandCounter = 0;
21
 
597 ingob 22
#ifdef USE_SPI_COMMUNICATION
691 ingob 23
 
304 ingob 24
//------------------------------------------------------
25
void SPI_MasterInit(void)
26
{
27
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);    // Set MOSI and SCK output, all others input 
28
  SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT);
29
 
691 ingob 30
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE);   // Enable SPI, Master, set clock rate fck/64 
723 hbuss 31
  SPSR = 0;//(1<<SPI2X);
691 ingob 32
 
304 ingob 33
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);
606 ingob 34
  SPITransferCompleted = 1;
35
 
708 ingob 36
  //SPDR = 0x00;  // dummy write
606 ingob 37
 
823 ingob 38
  ToNaviCtrl.Sync1 = 0xAA;
39
  ToNaviCtrl.Sync2 = 0x83;
606 ingob 40
 
823 ingob 41
  ToNaviCtrl.Command = SPI_CMD_USER;
42
  ToNaviCtrl.IntegralNick = 0;
43
  ToNaviCtrl.IntegralRoll = 0;
720 ingob 44
  SPI_RxDataValid = 0;
304 ingob 45
}
46
 
47
//------------------------------------------------------
823 ingob 48
void SPI_StartTransmitPacket(void)
304 ingob 49
{
606 ingob 50
   //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return;    // transfer of prev. packet not completed
51
   if (!SPITransferCompleted) return;
723 hbuss 52
//   _delay_us(30); 
304 ingob 53
 
54
   SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
823 ingob 55
   SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl;
617 ingob 56
 
823 ingob 57
   ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
58
   if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
708 ingob 59
 
606 ingob 60
   SPITransferCompleted = 0;
304 ingob 61
   UpdateSPI_Buffer();                              // update buffer
823 ingob 62
 
304 ingob 63
   SPI_BufferIndex = 1;
708 ingob 64
  //ebugOut.Analog[16]++; 
304 ingob 65
   // -- Debug-Output ---
66
   //----
691 ingob 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");
69
   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 70
   ToNaviCtrl.Chksum = ToNaviCtrl.Sync1;
71
   SPDR = ToNaviCtrl.Sync1;                  // Start transmission 
691 ingob 72
//     SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
73
 
304 ingob 74
}
75
 
76
//------------------------------------------------------
77
//SIGNAL(SIG_SPI)
78
void SPI_TransmitByte(void)
79
{
708 ingob 80
   static unsigned char SPI_RXState = 0;
81
   unsigned char rxdata;
82
   static unsigned char rxchksum;
691 ingob 83
 
84
   if (SPITransferCompleted) return;
304 ingob 85
   if (!(SPSR & (1 << SPIF))) return;
723 hbuss 86
  SendSPI = 4;
691 ingob 87
 
723 hbuss 88
//   _delay_us(30); 
606 ingob 89
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
304 ingob 90
 
708 ingob 91
  rxdata = SPDR;
92
  switch ( SPI_RXState)
93
  {
94
  case 0:
95
 
96
                        SPI_RxBufferIndex = 0;
97
                        //DebugOut.Analog[17]++;
98
                        rxchksum = rxdata;  
99
                        if (rxdata == 0x81 )  { SPI_RXState  = 1;  }   // 1. Syncbyte ok 
100
 
101
           break;
102
 
103
   case 1:
104
                    if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState  = 2;  }   // 2. Syncbyte ok 
105
                 else SPI_RXState  = 0;    
106
                        //DebugOut.Analog[18]++;
107
           break;      
108
 
109
   case 2:
110
                   SPI_Buffer[SPI_RxBufferIndex++]= rxdata;             // get data
111
           //DebugOut.Analog[19]++;
823 ingob 112
           if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl))
708 ingob 113
                   {  
114
 
115
                if (rxdata == rxchksum)
116
                        {
823 ingob 117
                  unsigned char *ptr = (unsigned char *)&FromNaviCtrl;
708 ingob 118
 
119
                          memcpy(ptr, (unsigned char *) SPI_Buffer,  sizeof(SPI_Buffer));
120
 
720 ingob 121
                          SPI_RxDataValid = 1;
708 ingob 122
                        }
720 ingob 123
                        else SPI_RxDataValid = 0;
708 ingob 124
 
125
                        SPI_RXState  = 0;  
126
                   }
127
                  else rxchksum += rxdata;
128
        break;   
129
 
130
  }            
131
 
823 ingob 132
   if (SPI_BufferIndex < sizeof(ToNaviCtrl))  
606 ingob 133
     {
134
           SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
691 ingob 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");
137
           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 138
 
708 ingob 139
           SPDR = SPI_TX_Buffer[SPI_BufferIndex];
823 ingob 140
           ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex];
691 ingob 141
        //   SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
142
 
606 ingob 143
         }
708 ingob 144
         else SPITransferCompleted = 1;  
145
 
304 ingob 146
         SPI_BufferIndex++;
147
}
148
 
691 ingob 149
 
304 ingob 150
//------------------------------------------------------
151
void UpdateSPI_Buffer(void)
152
{
691 ingob 153
  static unsigned char i =0;
304 ingob 154
  cli();
823 ingob 155
 
156
  ToNaviCtrl.IntegralNick = (int) (IntegralNick / 1024);
157
  ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / 1024);
158
  ToNaviCtrl.GyroCompass = ErsatzKompass / GIER_GRAD_FAKTOR;
159
  ToNaviCtrl.AccNick = (int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc);
160
  ToNaviCtrl.AccRoll = (int) ACC_AMPLIFY * (Mittelwert_AccRoll / 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;
175
            break;
176
 
177
         case SPI_CMD_STICK:
178
                                ToNaviCtrl.Param.Byte[0] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_GAS]];
179
                                ToNaviCtrl.Param.Byte[1] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
180
                                ToNaviCtrl.Param.Byte[2] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]];
181
                    ToNaviCtrl.Param.Byte[3] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_NICK]];
182
                                ToNaviCtrl.Param.Byte[4] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]];
183
                                ToNaviCtrl.Param.Byte[5] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]];
184
                                ToNaviCtrl.Param.Byte[6] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]];
185
                    ToNaviCtrl.Param.Byte[7] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]];
186
 
187
            break;
188
         case SPI_CMD_CAL_COMPASS:
189
                                ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState;
190
            break;
191
   }
192
 
193
 
304 ingob 194
  sei();
691 ingob 195
 
823 ingob 196
 
197
 
720 ingob 198
  if (SPI_RxDataValid)
199
  {
823 ingob 200
    GPS_Nick = FromNaviCtrl.GPS_Nick;
201
    GPS_Roll = FromNaviCtrl.GPS_Roll;
202
    KompassValue = FromNaviCtrl.CompassValue;
720 ingob 203
    KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
204
 
823 ingob 205
    if (FromNaviCtrl.BeepTime > beeptime) beeptime = FromNaviCtrl.BeepTime;
206
 
207
          switch (FromNaviCtrl.Command)
208
          {
209
            case  SPI_CMD_OSD_DATA:
210
//                                ToFlightCtrl.Param.Byte[0] = OsdBar;
211
//                                ToFlightCtrl.Param.Int[1]  = Distance;
212
                  break;
213
 
214
            case  SPI_CMD_GPS_POS:
215
//                                ToFlightCtrl.Param.Long[0]  = GPS_Data.Longitude;
216
//                                ToFlightCtrl.Param.Long[1]  = GPS_Data.Latitude;
217
                  break;
218
 
219
            case  SPI_CMD_GPS_TARGET:
220
//                                ToFlightCtrl.Param.Long[0]  = GPS_Data.TargetLongitude;
221
//                                ToFlightCtrl.Param.Long[1]  = GPS_Data.TargetLatitude;
222
                  break;
223
 
224
                default:
225
                  break;
226
          }
720 ingob 227
  }
228
  else
229
  {
819 hbuss 230
//    KompassValue = 0;
231
//    KompassRichtung = 0;
720 ingob 232
 
233
        GPS_Nick = 0;
234
    GPS_Roll = 0;
235
  }
304 ingob 236
}
237
 
597 ingob 238
#endif
304 ingob 239
 
240