Subversion Repositories NaviCtrl

Rev

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

Rev Author Line No. Line
1 ingob 1
/*#######################################################################################*/
2
/* !!! THIS IS NOT FREE SOFTWARE !!!                                                     */
3
/*#######################################################################################*/
4
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5
// + Copyright (c) 2008 Ingo Busker, Holger Buss
6
// + Nur für den privaten Gebrauch
7
// + FOR NON COMMERCIAL USE ONLY
8
// + www.MikroKopter.com
9
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
10
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), 
11
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. 
12
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt 
13
// + bzgl. der Nutzungsbedingungen aufzunehmen. 
14
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
15
// + Verkauf von Luftbildaufnahmen, usw.
16
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, 
18
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
19
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
20
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
21
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
22
// + eindeutig als Ursprung verlinkt werden
23
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
24
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
25
// + Benutzung auf eigene Gefahr
26
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
27
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
28
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur 
29
// + mit unserer Zustimmung zulässig
30
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
31
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
32
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
33
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, 
34
// + this list of conditions and the following disclaimer.
35
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
36
// +     from this software without specific prior written permission.
37
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permitted 
38
// +     for non-commercial use (directly or indirectly)
39
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted 
40
// +     with our written permission
41
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be 
42
// +     clearly linked as origin 
43
// +   * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
44
//
45
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
46
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
49
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
50
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
52
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
// +  POSSIBILITY OF SUCH DAMAGE. 
56
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57
#include "main.h"
58
 
59
struct str_FromFlightCtrl   FromFlightCtrl;
60
struct str_ToFlightCtrl     ToFlightCtrl;
61
 
62
struct str_ToFlightCtrl     SPI_TxBuffer;
63
 
64
volatile unsigned char      SPI_Buffer[sizeof(FromFlightCtrl)];
65
volatile unsigned char      SPI_BufferIndex = 0;
66
volatile unsigned char      SPI_TXBufferIndex = 0;
67
 
68
s16 CompassValue;
69
 
70
volatile struct str_MicroMag  MicroMag;
71
 
72
#define SPI_COMMAND_INDEX 0
73
unsigned char *Ptr_buffer_Tx = (unsigned char *) &SPI_TxBuffer;
74
//unsigned char *Ptr_buffer_Tx = (unsigned char *) &ToFlightCtrl;
75
unsigned char *Ptr_buffer_Rx = (unsigned char *) &FromFlightCtrl;
76
volatile unsigned char SPI_state = 0, SPI_TXUpdatebufferRequest = 0, SPI_RXUpdatebufferRequest = 0;
77
 
78
unsigned char SPI_CommandSequence[] = { SPI_CMD_OSD_DATA, SPI_CMD_GPS_POS, SPI_CMD_GPS_TARGET};
79
unsigned char SPI_CommandCounter = 0;
80
 
81
//--------------------------------------------------------------
82
void SSP0_IRQHandler(void)
83
{
84
 static u8 chksum = 0;
85
 u8 data;
86
 
87
 GPIO_ToggleBit(GPIO5, GPIO_Pin_7);
88
 SSP_ClearITPendingBit(SSP0, SSP_IT_RxTimeOut);
89
 
90
 while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
91
 {
92
    if (SPI_TXBufferIndex  < sizeof(ToFlightCtrl))   // still data to send ?  
93
    { SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
94
      SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];    
95
          SPI_TXBufferIndex++;  
96
    }
97
    else    
98
    {
99
      SPI_TXBufferIndex = 0;
100
          SPI_TXUpdatebufferRequest = 1;
101
          ToFlightCtrl.Chksum = 0;  
102
      ToFlightCtrl.BeepTime = BeepTime;
103
          BeepTime = 0;
104
          memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *)     &ToFlightCtrl, sizeof(ToFlightCtrl));
105
   }
106
 }
107
 
108
 while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty)==SET)
109
 {
110
 
111
  data =  SSP0->DR;
112
 
113
   while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
114
 {
115
     if (SPI_TXBufferIndex  < sizeof(ToFlightCtrl))   // still data to send ?  
116
     { SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
117
       SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];    
118
           SPI_TXBufferIndex++;  
119
     }
120
     else
121
     {
122
       SPI_TXBufferIndex = 0;
123
           ToFlightCtrl.Chksum = 0;  
124
           SPI_TXUpdatebufferRequest = 1;
125
       ToFlightCtrl.BeepTime = BeepTime;
126
           BeepTime = 0;
127
           memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *)    &ToFlightCtrl, sizeof(ToFlightCtrl));
128
         }
129
 
130
 }  
131
  switch (SPI_state )
132
  {
133
   case 0:
134
                        SPI_BufferIndex = 0;
135
 
136
                        chksum = data;  
137
                        if (data == 0xAA && !SPI_RXUpdatebufferRequest)  { SPI_state  = 1;  }   // 1. Syncbyte ok 
138
 
139
           break;
140
 
141
   case 1:
142
                    if (data == 0x83) { chksum += data; SPI_state  = 2;  }   // 2. Syncbyte ok 
143
                 else SPI_state  = 0;      
144
 
145
           break;
146
 
147
   case 2:
148
                   SPI_Buffer[SPI_BufferIndex++]= data;             // get data
149
 
150
                   if (SPI_BufferIndex >= sizeof(SPI_Buffer))           // end of packet
151
                   {  
152
                if (data == chksum)
153
                        {
154
                          u8 i;
155
              SPI_RXUpdatebufferRequest = 1;
156
                  for (i=0;i<sizeof(SPI_Buffer);i++) { Ptr_buffer_Rx[i] = SPI_Buffer[i]; }
157
 
158
                          DebugOut.Analog[13]++;
159
                        }
160
                         else { DebugOut.Analog[12]++; }
161
 
162
                        SPI_state  = 0;  
163
                   }
164
                 else chksum += data;
165
    break;
166
 
167
        default: SPI_state  = 0;  break;
168
  }
169
 }
170
 
171
 
172
 
173
}
174
 
175
//--------------------------------------------------------------
176
void SPI0_Init(void)
177
{
178
  GPIO_InitTypeDef GPIO_InitStructure;
179
  SSP_InitTypeDef   SSP_InitStructure;
180
 
181
  SerialPutString("SPI init...");
182
 
183
  SCU_APBPeriphClockConfig(__GPIO2 ,ENABLE);
184
  SCU_APBPeriphClockConfig(__SSP0 ,ENABLE);
185
 
186
  GPIO_DeInit(GPIO2);
187
  //SSP0_CLK, SSP0_MOSI, SSP0_SS pins 
188
  GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
189
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
190
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
191
  GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
192
  GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1  ;
193
  GPIO_Init (GPIO2, &GPIO_InitStructure);
194
 
195
  // SSP0_MISO pin GPIO2.6
196
  GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
197
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
198
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
199
  GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
200
  GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2  ;
201
  GPIO_Init (GPIO2, &GPIO_InitStructure);
202
 
203
  SSP_DeInit(SSP0);
204
  SSP_StructInit(&SSP_InitStructure);
205
  SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola;
206
  SSP_InitStructure.SSP_Mode = SSP_Mode_Slave;
207
  SSP_InitStructure.SSP_SlaveOutput = SSP_SlaveOutput_Enable;
208
  SSP_InitStructure.SSP_CPHA = SSP_CPHA_1Edge;
209
  SSP_InitStructure.SSP_CPOL = SSP_CPOL_Low;
210
  SSP_InitStructure.SSP_ClockRate = 0;
211
 
212
  SSP_Init(SSP0, &SSP_InitStructure);
213
 
214
  SSP_ITConfig(SSP0, SSP_IT_RxFifo | SSP_IT_TxFifo | SSP_IT_RxTimeOut, ENABLE);
215
 
216
  SSP_Cmd(SSP0, ENABLE);
217
 
218
  ToFlightCtrl.Sync1 = 0x81;
219
  ToFlightCtrl.Sync2 = 0x55;
220
 
221
  VIC_Config(SSP0_ITLine, VIC_IRQ, 1);
222
  VIC_ITCmd(SSP0_ITLine, ENABLE);  
223
 
224
  SerialPutString("ok\n\r");
225
 
226
 
227
}
228
 
229
//------------------------------------------------------
230
void SPI_CheckSlaveSelect(void)
231
{
232
 
233
 //if (SS_PIN)  { SPI_BufferIndex = 0;  }
234
 
235
   DebugOut.Analog[0] = FromFlightCtrl.IntegralNick;
236
   DebugOut.Analog[1] = FromFlightCtrl.IntegralRoll;
237
   DebugOut.Analog[2] = (30*FromFlightCtrl.AccNick)/108;
238
   DebugOut.Analog[3] = (30*FromFlightCtrl.AccRoll)/108;
239
 
240
/* DebugOut.Analog[2] = FromFlightCtrl.StickNick;
241
 DebugOut.Analog[3] = FromFlightCtrl.Command;
242
 DebugOut.Analog[4] = FromFlightCtrl.StickRoll;
243
 DebugOut.Analog[5] = FromFlightCtrl.StickGier;
244
 */
245
 DebugOut.Analog[25] = FromFlightCtrl.GyroCompass;
246
 
247
}
248
//------------------------------------------------------
249
void UpdateSPI_Buffer(void)
250
{
27 holgerb 251
   if(CompassUpdateActiv) return;  // testweise deaktiviert
252
   if(SPI_RXUpdatebufferRequest)
1 ingob 253
   {
27 holgerb 254
 
1 ingob 255
          VIC_ITCmd(SSP0_ITLine, DISABLE);  
256
 
257
          ToFlightCtrl.CompassValue = I2C_Heading.Heading;
258
          ToFlightCtrl.GPS_Nick = GPS_Nick;
259
          ToFlightCtrl.GPS_Roll = GPS_Roll;
260
      DebugOut.Analog[26] = I2C_Heading.Heading;
261
 
262
      ToFlightCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
263
      if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
264
 
265
          switch (ToFlightCtrl.Command)
266
          {
267
            case  SPI_CMD_OSD_DATA:
268
                                  ToFlightCtrl.Param.Byte[0] = OsdBar;
269
                                  ToFlightCtrl.Param.Int[1]  = OsdDistance;
270
                  break;
271
 
272
            case  SPI_CMD_GPS_POS:
273
                                  ToFlightCtrl.Param.Long[0]  = GPS_Data.Longitude;
274
                                  ToFlightCtrl.Param.Long[1]  = GPS_Data.Latitude;
275
                  break;
276
 
277
            case  SPI_CMD_GPS_TARGET:
278
                                  ToFlightCtrl.Param.Long[0]  = GPS_Data.TargetLongitude;
279
                                  ToFlightCtrl.Param.Long[1]  = GPS_Data.TargetLatitude;
280
                  break;
281
 
282
                default:
283
                  break;
284
          }
285
          VIC_ITCmd(SSP0_ITLine, ENABLE);  
286
 
287
         if (I2C_Heading.Heading <= 359)
288
         {
289
         }    
290
         else
291
         {
292
           if (I2C_Version.Hauptversion != 0xff) TimerCompassUpdate = SetDelay(1);
293
           return;
294
         }
295
 
296
         SPI_TXUpdatebufferRequest = 0;
297
 
298
 //----------------
299
 
300
//      DebugOut.Analog[11] = FromFlightCtrl.Command;
301
         switch(FromFlightCtrl.Command)
302
         {
303
           case SPI_CMD_USER:
304
           DebugOut.Analog[7]++;
305
                                    Parameter_UserParam1 = FromFlightCtrl.Param.Byte[0];
306
                                    Parameter_UserParam2 = FromFlightCtrl.Param.Byte[1];
307
                                    Parameter_UserParam3 = FromFlightCtrl.Param.Byte[2];
308
                                    Parameter_UserParam4 = FromFlightCtrl.Param.Byte[3];
309
                                    Parameter_UserParam5 = FromFlightCtrl.Param.Byte[4];
310
                                    Parameter_UserParam6 = FromFlightCtrl.Param.Byte[5];
311
                                    Parameter_UserParam7 = FromFlightCtrl.Param.Byte[6];
27 holgerb 312
                                    Parameter_UserParam8 = FromFlightCtrl.Param.Byte[7];
313
                                        if(ClearFlags) {MikroKopterFlags = 0; ClearFlags = 0;};
314
                                        MikroKopterFlags |= (s32) FromFlightCtrl.Param.Byte[8];
315
                                        UBat = FromFlightCtrl.Param.Byte[9];
316
                                        UndervoltageLevel = FromFlightCtrl.Param.Byte[10];
317
                                        ActiveSetting = FromFlightCtrl.Param.Byte[11];
318
           //DebugOut.Analog[7] = MikroKopterFlags;
319
       if(MikroKopterFlags & 0x004) DebugOut.Analog[8]++;
320
                     break;
321
 
322
           case SPI_CMD_PARAMETER1:
323
                                   Parameter_NaviGpsModeControl = FromFlightCtrl.Param.Byte[0];
324
                   Parameter_NaviGpsGain = FromFlightCtrl.Param.Byte[1];
325
                   Parameter_NaviGpsP   = FromFlightCtrl.Param.Byte[2];
326
                   Parameter_NaviGpsI   = FromFlightCtrl.Param.Byte[3];
327
                   Parameter_NaviGpsD   = FromFlightCtrl.Param.Byte[4];
328
                   Parameter_NaviGpsACC = FromFlightCtrl.Param.Byte[5];
329
                                   Parameter_NaviGpsMinSat = FromFlightCtrl.Param.Byte[6];
330
                                   Parameter_NaviStickThreshold = FromFlightCtrl.Param.Byte[7];
331
                                   Parameter_RadiusAlert = FromFlightCtrl.Param.Byte[8];
1 ingob 332
             break;
333
       case SPI_CMD_STICK:
334
                                    FC_StickGas  = (s32) FromFlightCtrl.Param.sByte[0];
335
                                    FC_StickGier = (s32) FromFlightCtrl.Param.sByte[1];
336
                                        FC_StickNick = (s32) FromFlightCtrl.Param.sByte[2];
337
                                    FC_StickRoll = (s32) FromFlightCtrl.Param.sByte[3];
338
                                    FC_Poti1     = (s32) FromFlightCtrl.Param.Byte[4];
339
                                    FC_Poti2     = (s32) FromFlightCtrl.Param.Byte[5];
340
                                        FC_Poti3         = (s32) FromFlightCtrl.Param.Byte[6];
341
                                    FC_Poti4     = (s32) FromFlightCtrl.Param.Byte[7];
342
                                        SenderOkay       = (s32) FromFlightCtrl.Param.Byte[8];
343
             break;
344
 
345
                case SPI_CMD_CAL_COMPASS:
346
                DebugOut.Analog[9]++;
347
                                        CompassCalState =  FromFlightCtrl.Param.Byte[0];
348
                 break;
349
 
350
       default:
351
             break;
352
         }
353
 
354
 
355
   //------------
356
    I2C_WriteNickRoll.Roll = FromFlightCtrl.IntegralRoll;
357
    I2C_WriteNickRoll.Nick = FromFlightCtrl.IntegralNick;
358
 
359
        Navigation();
360
 
361
    SPI_RXUpdatebufferRequest = 0;
362
  }  
363
}
364