Subversion Repositories NaviCtrl

Rev

Rev 23 | 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
171 ingob 6
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY
1 ingob 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
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
171 ingob 28
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur 
1 ingob 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 
171 ingob 43
// +   * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
1 ingob 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
//--------------------------------------------------------------
83
void SSP0_IRQHandler(void)
84
{
85
 static u8 chksum = 0;
86
 u8 data;
87
 
88
 GPIO_ToggleBit(GPIO5, GPIO_Pin_7);
89
 SSP_ClearITPendingBit(SSP0, SSP_IT_RxTimeOut);
90
 
91
 while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
92
 {
93
    if (SPI_TXBufferIndex  < sizeof(ToFlightCtrl))   // still data to send ?  
94
    { SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
95
      SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];    
96
          SPI_TXBufferIndex++;  
97
    }
98
    else    
99
    {
100
      SPI_TXBufferIndex = 0;
101
          SPI_TXUpdatebufferRequest = 1;
102
          ToFlightCtrl.Chksum = 0;  
103
      ToFlightCtrl.BeepTime = BeepTime;
104
          BeepTime = 0;
105
          memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *)     &ToFlightCtrl, sizeof(ToFlightCtrl));
106
   }
107
 }
108
 
109
 while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty)==SET)
110
 {
111
 
112
  data =  SSP0->DR;
113
 
114
   while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
115
 {
116
     if (SPI_TXBufferIndex  < sizeof(ToFlightCtrl))   // still data to send ?  
117
     { SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
118
       SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];    
119
           SPI_TXBufferIndex++;  
120
     }
121
     else
122
     {
123
       SPI_TXBufferIndex = 0;
124
           ToFlightCtrl.Chksum = 0;  
125
           SPI_TXUpdatebufferRequest = 1;
126
       ToFlightCtrl.BeepTime = BeepTime;
127
           BeepTime = 0;
128
           memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *)    &ToFlightCtrl, sizeof(ToFlightCtrl));
129
         }
130
 
131
 }  
132
  switch (SPI_state )
133
  {
134
   case 0:
135
                        SPI_BufferIndex = 0;
136
 
137
                        chksum = data;  
138
                        if (data == 0xAA && !SPI_RXUpdatebufferRequest)  { SPI_state  = 1;  }   // 1. Syncbyte ok 
139
 
140
           break;
141
 
142
   case 1:
143
                    if (data == 0x83) { chksum += data; SPI_state  = 2;  }   // 2. Syncbyte ok 
144
                 else SPI_state  = 0;      
145
 
146
           break;
147
 
148
   case 2:
149
                   SPI_Buffer[SPI_BufferIndex++]= data;             // get data
150
 
151
                   if (SPI_BufferIndex >= sizeof(SPI_Buffer))           // end of packet
152
                   {  
153
                if (data == chksum)
154
                        {
155
                          u8 i;
156
              SPI_RXUpdatebufferRequest = 1;
157
                  for (i=0;i<sizeof(SPI_Buffer);i++) { Ptr_buffer_Rx[i] = SPI_Buffer[i]; }
158
 
159
                          DebugOut.Analog[13]++;
160
                        }
161
                         else { DebugOut.Analog[12]++; }
162
 
163
                        SPI_state  = 0;  
164
                   }
165
                 else chksum += data;
166
    break;
167
 
168
        default: SPI_state  = 0;  break;
169
  }
170
 }
171
 
172
 
173
 
174
}
175
 
176
//--------------------------------------------------------------
177
void SPI0_Init(void)
178
{
179
  GPIO_InitTypeDef GPIO_InitStructure;
180
  SSP_InitTypeDef   SSP_InitStructure;
181
 
182
  SerialPutString("SPI init...");
183
 
184
  SCU_APBPeriphClockConfig(__GPIO2 ,ENABLE);
185
  SCU_APBPeriphClockConfig(__SSP0 ,ENABLE);
186
 
187
  GPIO_DeInit(GPIO2);
188
  //SSP0_CLK, SSP0_MOSI, SSP0_SS pins 
189
  GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
190
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
191
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
192
  GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
193
  GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1  ;
194
  GPIO_Init (GPIO2, &GPIO_InitStructure);
195
 
196
  // SSP0_MISO pin GPIO2.6
197
  GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
198
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
199
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
200
  GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
201
  GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2  ;
202
  GPIO_Init (GPIO2, &GPIO_InitStructure);
203
 
204
  SSP_DeInit(SSP0);
205
  SSP_StructInit(&SSP_InitStructure);
206
  SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola;
207
  SSP_InitStructure.SSP_Mode = SSP_Mode_Slave;
208
  SSP_InitStructure.SSP_SlaveOutput = SSP_SlaveOutput_Enable;
209
  SSP_InitStructure.SSP_CPHA = SSP_CPHA_1Edge;
210
  SSP_InitStructure.SSP_CPOL = SSP_CPOL_Low;
211
  SSP_InitStructure.SSP_ClockRate = 0;
212
 
213
  SSP_Init(SSP0, &SSP_InitStructure);
214
 
215
  SSP_ITConfig(SSP0, SSP_IT_RxFifo | SSP_IT_TxFifo | SSP_IT_RxTimeOut, ENABLE);
216
 
217
  SSP_Cmd(SSP0, ENABLE);
218
 
219
  ToFlightCtrl.Sync1 = 0x81;
220
  ToFlightCtrl.Sync2 = 0x55;
221
 
222
  VIC_Config(SSP0_ITLine, VIC_IRQ, 1);
223
  VIC_ITCmd(SSP0_ITLine, ENABLE);  
224
 
225
  SerialPutString("ok\n\r");
226
 
227
 
228
}
229
 
230
//------------------------------------------------------
231
void SPI_CheckSlaveSelect(void)
232
{
233
 
234
 //if (SS_PIN)  { SPI_BufferIndex = 0;  }
235
 
236
   DebugOut.Analog[0] = FromFlightCtrl.IntegralNick;
237
   DebugOut.Analog[1] = FromFlightCtrl.IntegralRoll;
238
   DebugOut.Analog[2] = (30*FromFlightCtrl.AccNick)/108;
239
   DebugOut.Analog[3] = (30*FromFlightCtrl.AccRoll)/108;
240
 
241
/* DebugOut.Analog[2] = FromFlightCtrl.StickNick;
242
 DebugOut.Analog[3] = FromFlightCtrl.Command;
243
 DebugOut.Analog[4] = FromFlightCtrl.StickRoll;
244
 DebugOut.Analog[5] = FromFlightCtrl.StickGier;
245
 */
246
 DebugOut.Analog[25] = FromFlightCtrl.GyroCompass;
247
 
248
}
249
//------------------------------------------------------
250
void UpdateSPI_Buffer(void)
251
{
252
   if (SPI_RXUpdatebufferRequest)
253
   {
254
     if (CompassUpdateActiv) return;  // testweise deaktiviert
255
 
256
          VIC_ITCmd(SSP0_ITLine, DISABLE);  
257
 
258
          ToFlightCtrl.CompassValue = I2C_Heading.Heading;
259
          ToFlightCtrl.GPS_Nick = GPS_Nick;
260
          ToFlightCtrl.GPS_Roll = GPS_Roll;
261
      DebugOut.Analog[26] = I2C_Heading.Heading;
262
 
263
      ToFlightCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
264
      if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
265
 
266
          switch (ToFlightCtrl.Command)
267
          {
268
            case  SPI_CMD_OSD_DATA:
269
                                  ToFlightCtrl.Param.Byte[0] = OsdBar;
270
                                  ToFlightCtrl.Param.Int[1]  = OsdDistance;
271
                  break;
272
 
273
            case  SPI_CMD_GPS_POS:
274
                                  ToFlightCtrl.Param.Long[0]  = GPS_Data.Longitude;
275
                                  ToFlightCtrl.Param.Long[1]  = GPS_Data.Latitude;
276
                  break;
277
 
278
            case  SPI_CMD_GPS_TARGET:
279
                                  ToFlightCtrl.Param.Long[0]  = GPS_Data.TargetLongitude;
280
                                  ToFlightCtrl.Param.Long[1]  = GPS_Data.TargetLatitude;
281
                  break;
282
 
283
                default:
284
                  break;
285
          }
286
          VIC_ITCmd(SSP0_ITLine, ENABLE);  
287
 
288
         if (I2C_Heading.Heading <= 359)
289
         {
290
         }    
291
         else
292
         {
293
           if (I2C_Version.Hauptversion != 0xff) TimerCompassUpdate = SetDelay(1);
294
           return;
295
         }
296
 
297
         SPI_TXUpdatebufferRequest = 0;
298
 
299
 //----------------
300
 
301
//      DebugOut.Analog[11] = FromFlightCtrl.Command;
302
         switch(FromFlightCtrl.Command)
303
         {
304
           case SPI_CMD_USER:
305
           DebugOut.Analog[7]++;
306
                                    Parameter_UserParam1 = FromFlightCtrl.Param.Byte[0];
307
                                    Parameter_UserParam2 = FromFlightCtrl.Param.Byte[1];
308
                                    Parameter_UserParam3 = FromFlightCtrl.Param.Byte[2];
309
                                    Parameter_UserParam4 = FromFlightCtrl.Param.Byte[3];
310
                                    Parameter_UserParam5 = FromFlightCtrl.Param.Byte[4];
311
                                    Parameter_UserParam6 = FromFlightCtrl.Param.Byte[5];
312
                                    Parameter_UserParam7 = FromFlightCtrl.Param.Byte[6];
313
             break;
314
       case SPI_CMD_STICK:
315
           DebugOut.Analog[8]++;
316
                                    FC_StickGas  = (s32) FromFlightCtrl.Param.sByte[0];
317
                                    FC_StickGier = (s32) FromFlightCtrl.Param.sByte[1];
318
                                        FC_StickNick = (s32) FromFlightCtrl.Param.sByte[2];
319
                                    FC_StickRoll = (s32) FromFlightCtrl.Param.sByte[3];
320
                                    FC_Poti1     = (s32) FromFlightCtrl.Param.Byte[4];
321
                                    FC_Poti2     = (s32) FromFlightCtrl.Param.Byte[5];
322
                                        FC_Poti3         = (s32) FromFlightCtrl.Param.Byte[6];
323
                                    FC_Poti4     = (s32) FromFlightCtrl.Param.Byte[7];
324
                                        SenderOkay       = (s32) FromFlightCtrl.Param.Byte[8];
325
             break;
326
 
327
                case SPI_CMD_CAL_COMPASS:
328
                DebugOut.Analog[9]++;
329
                                        CompassCalState =  FromFlightCtrl.Param.Byte[0];
330
                 break;
331
 
332
       default:
333
             break;
334
         }
335
 
336
 
337
   //------------
338
    I2C_WriteNickRoll.Roll = FromFlightCtrl.IntegralRoll;
339
    I2C_WriteNickRoll.Nick = FromFlightCtrl.IntegralNick;
340
 
341
        Navigation();
342
 
343
    SPI_RXUpdatebufferRequest = 0;
344
  }  
345
}
346