Subversion Repositories NaviCtrl

Rev

Rev 27 | Rev 43 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 27 Rev 41
Line 5... Line 5...
5
// + Copyright (c) 2008 Ingo Busker, Holger Buss
5
// + Copyright (c) 2008 Ingo Busker, Holger Buss
6
// + Nur für den privaten Gebrauch
6
// + Nur für den privaten Gebrauch
7
// + FOR NON COMMERCIAL USE ONLY
7
// + FOR NON COMMERCIAL USE ONLY
8
// + www.MikroKopter.com
8
// + www.MikroKopter.com
9
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
10
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), 
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. 
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 
12
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
13
// + bzgl. der Nutzungsbedingungen aufzunehmen. 
13
// + bzgl. der Nutzungsbedingungen aufzunehmen.
14
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
14
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
15
// + Verkauf von Luftbildaufnahmen, usw.
15
// + Verkauf von Luftbildaufnahmen, usw.
16
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
16
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, 
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
18
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
19
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
19
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
20
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
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"
21
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
22
// + eindeutig als Ursprung verlinkt werden
22
// + eindeutig als Ursprung verlinkt werden
23
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
23
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
24
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
24
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
25
// + Benutzung auf eigene Gefahr
25
// + Benutzung auf eigene Gefahr
26
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
26
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
27
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
27
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
28
// + Die PORTIERUNG der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur 
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
29
// + mit unserer Zustimmung zulässig
30
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
30
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
31
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
31
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
32
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
32
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
33
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, 
33
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
34
// + this list of conditions and the following disclaimer.
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
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.
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 
37
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permitted
38
// +     for non-commercial use (directly or indirectly)
38
// +     for non-commercial use (directly or indirectly)
39
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted 
39
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
40
// +     with our written permission
40
// +     with our written permission
41
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be 
41
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
42
// +     clearly linked as origin 
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
43
// +   * PORTING this software (or part of it) to systems (other than hardware from www.mikrokopter.de) is NOT allowed
44
//
44
//
45
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
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
46
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Line 50... Line 50...
50
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
50
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
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
52
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
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
54
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
// +  POSSIBILITY OF SUCH DAMAGE. 
55
// +  POSSIBILITY OF SUCH DAMAGE.
56
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
56
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
57
 
-
 
58
#include <string.h>
-
 
59
#include "91x_lib.h"
-
 
60
#include "led.h"
-
 
61
#include "GPS.h"
-
 
62
#include "uart1.h"
-
 
63
#include "spi_slave.h"
-
 
64
#include "i2c.h"
-
 
65
#include "timer.h"
57
#include "main.h"
66
#include "main.h"
-
 
67
#include "fifo.h"
Line 58... Line -...
58
 
-
 
59
struct str_FromFlightCtrl   FromFlightCtrl;
-
 
Line -... Line 68...
-
 
68
 
-
 
69
 
-
 
70
#define SPI_RXSYNCBYTE1 0xAA
60
struct str_ToFlightCtrl     ToFlightCtrl;
71
#define SPI_RXSYNCBYTE2 0x83
Line -... Line 72...
-
 
72
#define SPI_TXSYNCBYTE1 0x81
-
 
73
#define SPI_TXSYNCBYTE2 0x55
-
 
74
 
-
 
75
typedef enum
-
 
76
{
-
 
77
        SPI_SYNC1,
-
 
78
        SPI_SYNC2,
-
 
79
        SPI_DATA
61
 
80
} SPI_State_t;
-
 
81
 
-
 
82
//communication packets
-
 
83
volatile FromFlightCtrl_t   FromFlightCtrl;
-
 
84
volatile ToFlightCtrl_t     ToFlightCtrl;
-
 
85
 
62
struct str_ToFlightCtrl     SPI_TxBuffer;
86
// tx packet buffer
-
 
87
#define SPI_TXBUFFER_LEN (2 + sizeof(ToFlightCtrl)) // 2 bytes at start are for synchronization
-
 
88
volatile u8 SPI_TxBuffer[SPI_TXBUFFER_LEN];
-
 
89
volatile u8 SPI_TxBufferIndex = 0;
-
 
90
u8 *Ptr_TxChksum = NULL ;  // pointer to checksum in TxBuffer
-
 
91
 
63
 
92
// rx packet buffer
-
 
93
#define SPI_RXBUFFER_LEN sizeof(FromFlightCtrl)
-
 
94
volatile u8 SPI_RxBuffer[SPI_RXBUFFER_LEN];
Line 64... Line 95...
64
volatile unsigned char      SPI_Buffer[sizeof(FromFlightCtrl)];
95
volatile u8 SPI_RxBufferIndex = 0;
-
 
96
volatile u8 SPI_RxBuffer_Request = 0;
-
 
97
#define SPI_COMMAND_INDEX 0
-
 
98
 
Line -... Line 99...
-
 
99
s32 FC_Kalman_K = 32;
65
volatile unsigned char      SPI_BufferIndex = 0;
100
s32 Kalman_MaxDrift = 5 * 16;
Line 66... Line 101...
66
volatile unsigned char      SPI_TXBufferIndex = 0;
101
s32 Kalman_MaxFusion = 64;
67
 
-
 
68
s16 CompassValue;
-
 
69
 
-
 
70
volatile struct str_MicroMag  MicroMag;
-
 
Line 71... Line 102...
71
 
102
u32 CheckSPIOkay = 0;
-
 
103
 
-
 
104
u8 SPI_CommandSequence[] = { SPI_KALMAN, SPI_CMD_OSD_DATA, SPI_CMD_GPS_POS, SPI_KALMAN, SPI_CMD_GPS_TARGET};
72
#define SPI_COMMAND_INDEX 0
105
u8 SPI_CommandCounter = 0;
Line 73... Line 106...
73
unsigned char *Ptr_buffer_Tx = (unsigned char *) &SPI_TxBuffer;
106
 
74
//unsigned char *Ptr_buffer_Tx = (unsigned char *) &ToFlightCtrl;
107
SPI_Version_t FC_Version;
75
unsigned char *Ptr_buffer_Rx = (unsigned char *) &FromFlightCtrl;
108
 
76
volatile unsigned char SPI_state = 0, SPI_TXUpdatebufferRequest = 0, SPI_RXUpdatebufferRequest = 0;
109
u8 CompassCalStateQueue[10];
77
 
110
fifo_t CompassCalcStateFiFo;
-
 
111
 
78
unsigned char SPI_CommandSequence[] = { SPI_CMD_OSD_DATA, SPI_CMD_GPS_POS, SPI_CMD_GPS_TARGET};
112
u8 CompassCalState = 0;
79
unsigned char SPI_CommandCounter = 0;
113
 
80
 
114
//--------------------------------------------------------------
81
//--------------------------------------------------------------
-
 
-
 
115
void SSP0_IRQHandler(void)
82
void SSP0_IRQHandler(void)
116
{
83
{
117
        static u8 rxchksum = 0;
84
 static u8 chksum = 0;
118
        u8 rxdata;
-
 
119
        static SPI_State_t SPI_State = SPI_SYNC1;
85
 u8 data;
120
 
86
 
121
        // clear pending bit
87
 GPIO_ToggleBit(GPIO5, GPIO_Pin_7);
122
        SSP_ClearITPendingBit(SSP0, SSP_IT_RxTimeOut);
88
 SSP_ClearITPendingBit(SSP0, SSP_IT_RxTimeOut);
123
        // Fill TxFIFO while its not full or end of packet is reached
89
 
124
        while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
90
 while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
125
        {
91
 {
126
                if (SPI_TxBufferIndex < SPI_TXBUFFER_LEN)   // still data to send ?
92
    if (SPI_TXBufferIndex  < sizeof(ToFlightCtrl))   // still data to send ?  
-
 
93
    { SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
127
                {
94
      SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];    
128
                        SSP0->DR = SPI_TxBuffer[SPI_TxBufferIndex];       // send a byte
95
          SPI_TXBufferIndex++;  
129
                        *Ptr_TxChksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum
-
 
130
                        SPI_TxBufferIndex++;  // pointer to next byte
96
    }
131
                }
97
    else    
132
                else // TxBuffer end is reached then reset and copy data to tx buffer
98
    {
133
                {
99
      SPI_TXBufferIndex = 0;
-
 
-
 
134
                        SPI_TxBufferIndex = 0;   // reset buffer index
100
          SPI_TXUpdatebufferRequest = 1;
135
                        ToFlightCtrl.Chksum = 0;  // initialize checksum
101
          ToFlightCtrl.Chksum = 0;  
136
                        ToFlightCtrl.BeepTime = BeepTime; // set beeptime
102
      ToFlightCtrl.BeepTime = BeepTime;
-
 
103
          BeepTime = 0;
137
                        BeepTime = 0; // reset local beeptime
104
          memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *)     &ToFlightCtrl, sizeof(ToFlightCtrl));
-
 
-
 
138
                        // copy contents of ToFlightCtrl->SPI_TxBuffer
105
   }
139
                        memcpy( (u8 *) &(SPI_TxBuffer[2]), (u8 *) &ToFlightCtrl, sizeof(ToFlightCtrl));
106
 }
140
                }
107
 
141
        }
-
 
142
        // while RxFIFO not empty
108
 while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty)==SET)
143
        while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty)==SET)
109
 {
144
        {
110
 
145
                rxdata =  SSP0->DR; // catch the received byte
111
  data =  SSP0->DR;
146
                // Fill TxFIFO while its not full or end of packet is reached
112
 
147
                while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
113
   while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
148
                {
114
 {
149
                if (SPI_TxBufferIndex  < SPI_TXBUFFER_LEN)   // still data to send ?
115
     if (SPI_TXBufferIndex  < sizeof(ToFlightCtrl))   // still data to send ?  
150
                {
116
     { SSP0->DR = Ptr_buffer_Tx[SPI_TXBufferIndex];
-
 
117
       SPI_TxBuffer.Chksum += Ptr_buffer_Tx[SPI_TXBufferIndex];    
151
                                SSP0->DR = SPI_TxBuffer[SPI_TxBufferIndex];       // send a byte
118
           SPI_TXBufferIndex++;  
152
                        *Ptr_TxChksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum
-
 
153
                                SPI_TxBufferIndex++; // pointer to next byte
119
     }
154
                }
120
     else
155
                else // end of packet is reached reset and copy data to tx buffer
121
     {
-
 
122
       SPI_TXBufferIndex = 0;
156
                {
123
           ToFlightCtrl.Chksum = 0;  
157
                        SPI_TxBufferIndex = 0;  // reset buffer index
124
           SPI_TXUpdatebufferRequest = 1;
158
                                ToFlightCtrl.Chksum = 0;  // initialize checksum
125
       ToFlightCtrl.BeepTime = BeepTime;
159
                        ToFlightCtrl.BeepTime = BeepTime;  // set beeptime
126
           BeepTime = 0;
160
                                BeepTime = 0; // reset local beeptime
127
           memcpy((unsigned char *) &SPI_TxBuffer, (unsigned char *)    &ToFlightCtrl, sizeof(ToFlightCtrl));
-
 
128
         }
161
                                // copy contents of ToFlightCtrl->SPI_TxBuffer
-
 
162
                                memcpy((u8 *) &(SPI_TxBuffer[2]), (u8 *) &ToFlightCtrl, sizeof(ToFlightCtrl));
-
 
163
                        }
129
 
164
                }
130
 }  
165
                switch (SPI_State)
131
  switch (SPI_state )
166
                {
132
  {
-
 
133
   case 0:
167
                        case SPI_SYNC1:
134
                        SPI_BufferIndex = 0;
168
                                SPI_RxBufferIndex = 0; // reset buffer index
135
                       
169
                                rxchksum = rxdata;     // init checksum
-
 
170
                                if (rxdata == SPI_RXSYNCBYTE1)
-
 
171
                                {   // 1st syncbyte ok
-
 
172
                                        SPI_State = SPI_SYNC2;  // step to sync2
-
 
173
                                }
-
 
174
                                break;
-
 
175
                        case SPI_SYNC2:
136
                        chksum = data;  
176
                                if (rxdata == SPI_RXSYNCBYTE2)
137
                        if (data == 0xAA && !SPI_RXUpdatebufferRequest)  { SPI_state  = 1;  }   // 1. Syncbyte ok 
177
                                {  // 2nd Syncbyte ok
138
                       
-
 
139
           break;
178
                                        rxchksum += rxdata;
140
 
179
                                        SPI_State = SPI_DATA;
141
   case 1:
-
 
142
                    if (data == 0x83) { chksum += data; SPI_state  = 2;  }   // 2. Syncbyte ok 
180
                                }  // 2nd Syncbyte does not match
143
                 else SPI_state  = 0;      
181
                                else
144
                       
182
                                {
145
           break;
183
                                        SPI_State  = SPI_SYNC1; //jump back to sync1
-
 
184
                                }
-
 
185
                                break;
146
   
186
                        case SPI_DATA:
-
 
187
                                SPI_RxBuffer[SPI_RxBufferIndex++]= rxdata; // copy databyte to rx buffer
147
   case 2:
188
                                if (SPI_RxBufferIndex >= SPI_RXBUFFER_LEN) // end of packet is reached
148
                   SPI_Buffer[SPI_BufferIndex++]= data;             // get data
-
 
149
 
189
                                {
-
 
190
                                        if (rxdata == rxchksum) // verify checksum byte
150
                   if (SPI_BufferIndex >= sizeof(SPI_Buffer))           // end of packet
191
                                        {
151
                   {  
192
                                                // copy SPI_RxBuffer -> FromFlightCtrl
152
                if (data == chksum)
193
                                                if(!SPI_RxBuffer_Request) // block writing to FromFlightCtrl on reading access
-
 
194
                                                {
-
 
195
                                                        memcpy((u8 *) &FromFlightCtrl, (u8 *) SPI_RxBuffer, sizeof(FromFlightCtrl));
153
                        {
196
                                                        SPI_RxBuffer_Request = 1;
154
                          u8 i;
197
                                                }
155
              SPI_RXUpdatebufferRequest = 1;
198
                                                CheckSPIOkay++;
156
                  for (i=0;i<sizeof(SPI_Buffer);i++) { Ptr_buffer_Rx[i] = SPI_Buffer[i]; }
199
                                                DebugOut.Analog[13]++;
-
 
200
                                        }
-
 
201
                                        else // bad checksum byte
-
 
202
                                        {
157
 
203
                                                DebugOut.Analog[12]++; // increase SPI chksum error counter
158
                          DebugOut.Analog[13]++;
204
                                        }
159
                        }
205
                                        SPI_State  = SPI_SYNC1; // reset state
-
 
206
                                }
160
                         else { DebugOut.Analog[12]++; }
207
                                else // end of packet not reached
161
                       
208
                                {
162
                        SPI_state  = 0;  
-
 
163
                   }
-
 
164
                 else chksum += data;
-
 
165
    break;
209
                                        rxchksum += rxdata;      // update checksum
Line 166... Line 210...
166
 
210
                                }
167
        default: SPI_state  = 0;  break;
211
                                break;
168
  }
212
                        default:
169
 }
213
                                SPI_State  = SPI_SYNC1;
170
 
214
                                break;
-
 
215
                }
-
 
216
        }
-
 
217
}
-
 
218
 
-
 
219
//--------------------------------------------------------------
Line 171... Line -...
171
 
-
 
172
 
-
 
173
}
-
 
174
 
-
 
175
//--------------------------------------------------------------
-
 
176
void SPI0_Init(void)
220
void SPI0_Init(void)
177
{
221
{
-
 
222
        GPIO_InitTypeDef GPIO_InitStructure;
178
  GPIO_InitTypeDef GPIO_InitStructure;
223
        SSP_InitTypeDef   SSP_InitStructure;
179
  SSP_InitTypeDef   SSP_InitStructure;
224
 
180
 
225
        SerialPutString("\r\n SPI init...");
181
  SerialPutString("SPI init...");
226
 
182
 
227
        SCU_APBPeriphClockConfig(__GPIO2 ,ENABLE);
183
  SCU_APBPeriphClockConfig(__GPIO2 ,ENABLE);
228
        SCU_APBPeriphClockConfig(__SSP0 ,ENABLE);
184
  SCU_APBPeriphClockConfig(__SSP0 ,ENABLE);
229
 
185
   
230
        GPIO_DeInit(GPIO2);
-
 
231
        //SSP0_CLK, SSP0_MOSI, SSP0_NSS pins
186
  GPIO_DeInit(GPIO2);
232
        GPIO_StructInit(&GPIO_InitStructure);
187
  //SSP0_CLK, SSP0_MOSI, SSP0_SS pins 
233
        GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
188
  GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
234
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
189
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
235
        GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
190
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
236
        GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
191
  GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
237
        GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1; //SSP0_SCLK, SSP0_MOSI, SSP0_NSS
192
  GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1  ;
238
        GPIO_Init (GPIO2, &GPIO_InitStructure);
193
  GPIO_Init (GPIO2, &GPIO_InitStructure);
239
 
194
 
240
        // SSP0_MISO pin GPIO2.6
195
  // SSP0_MISO pin GPIO2.6
241
        GPIO_StructInit(&GPIO_InitStructure);
196
  GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
242
        GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
197
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
243
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
198
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
244
        GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
199
  GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
245
        GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
200
  GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2  ;
246
        GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt2; //SSP0_MISO
201
  GPIO_Init (GPIO2, &GPIO_InitStructure);
247
        GPIO_Init (GPIO2, &GPIO_InitStructure);
202
 
248
 
203
  SSP_DeInit(SSP0);
249
        SSP_DeInit(SSP0);
204
  SSP_StructInit(&SSP_InitStructure);
250
        SSP_StructInit(&SSP_InitStructure);
205
  SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola;
251
        SSP_InitStructure.SSP_FrameFormat = SSP_FrameFormat_Motorola;
206
  SSP_InitStructure.SSP_Mode = SSP_Mode_Slave;
252
        SSP_InitStructure.SSP_Mode = SSP_Mode_Slave;
207
  SSP_InitStructure.SSP_SlaveOutput = SSP_SlaveOutput_Enable;
253
        SSP_InitStructure.SSP_SlaveOutput = SSP_SlaveOutput_Enable;
208
  SSP_InitStructure.SSP_CPHA = SSP_CPHA_1Edge;
254
        SSP_InitStructure.SSP_CPHA = SSP_CPHA_1Edge;
209
  SSP_InitStructure.SSP_CPOL = SSP_CPOL_Low;
255
        SSP_InitStructure.SSP_CPOL = SSP_CPOL_Low;
-
 
256
        SSP_InitStructure.SSP_ClockRate = 0;
-
 
257
 
-
 
258
        SSP_Init(SSP0, &SSP_InitStructure);
-
 
259
 
210
  SSP_InitStructure.SSP_ClockRate = 0;
260
        SSP_ITConfig(SSP0, SSP_IT_RxFifo | SSP_IT_TxFifo | SSP_IT_RxTimeOut, ENABLE);
211
 
261
 
212
  SSP_Init(SSP0, &SSP_InitStructure);
262
        fifo_init(&CompassCalcStateFiFo, CompassCalStateQueue, sizeof(CompassCalStateQueue));
213
 
263
 
214
  SSP_ITConfig(SSP0, SSP_IT_RxFifo | SSP_IT_TxFifo | SSP_IT_RxTimeOut, ENABLE);
264
        SSP_Cmd(SSP0, ENABLE);
215
 
-
 
216
  SSP_Cmd(SSP0, ENABLE);
-
 
217
 
265
        // initialize the syncbytes in the tx buffer
Line 218... Line 266...
218
  ToFlightCtrl.Sync1 = 0x81;
266
        SPI_TxBuffer[0] = SPI_TXSYNCBYTE1;
219
  ToFlightCtrl.Sync2 = 0x55;
267
        SPI_TxBuffer[1] = SPI_TXSYNCBYTE2;
220
   
268
        // set the pointer to the checksum byte in the tx buffer
-
 
269
        Ptr_TxChksum = (u8 *) &(((ToFlightCtrl_t *) &(SPI_TxBuffer[2]))->Chksum);
-
 
270
 
-
 
271
        VIC_Config(SSP0_ITLine, VIC_IRQ, 1);
-
 
272
        VIC_ITCmd(SSP0_ITLine, ENABLE);
-
 
273
 
-
 
274
        SerialPutString("ok");
-
 
275
}
-
 
276
 
-
 
277
//------------------------------------------------------
-
 
278
void SPI0_UpdateBuffer(void)
-
 
279
{
-
 
280
        if (SPI_RxBuffer_Request)
-
 
281
        {
-
 
282
                // avoid sending data via SPI during the update of the  ToFlightCtrl structure
-
 
283
                VIC_ITCmd(SSP0_ITLine, DISABLE); // disable SPI interrupt
-
 
284
 
-
 
285
                ToFlightCtrl.CompassHeading = I2C_Heading.Heading;
-
 
286
                ToFlightCtrl.GPS_Nick   = GPS_Stick.Nick;
-
 
287
                ToFlightCtrl.GPS_Roll   = GPS_Stick.Roll;
-
 
288
                ToFlightCtrl.GPS_Yaw    = GPS_Stick.Yaw;
-
 
289
                // cycle spi commands
-
 
290
                ToFlightCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
-
 
291
                if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
-
 
292
 
-
 
293
                switch (ToFlightCtrl.Command)
-
 
294
                {
-
 
295
                        case  SPI_KALMAN:
-
 
296
                                ToFlightCtrl.Param.Byte[0] = (char) FC_Kalman_K;
-
 
297
                                ToFlightCtrl.Param.Byte[1] = (char) Kalman_MaxFusion;
-
 
298
                                ToFlightCtrl.Param.Byte[2] = (char) Kalman_MaxDrift;
-
 
299
                                break;
-
 
300
 
-
 
301
                        case  SPI_CMD_GPS_POS:
-
 
302
                                ToFlightCtrl.Param.Long[0]  = GPSData.Position.Longitude;
-
 
303
                                ToFlightCtrl.Param.Long[1]  = GPSData.Position.Latitude;
-
 
304
                                break;
-
 
305
 
-
 
306
                        case  SPI_CMD_GPS_TARGET:
-
 
307
                                if(GPS_pTargetPosition != NULL)
-
 
308
                                {
-
 
309
                                        if(GPS_pTargetPosition->Status != INVALID)
-
 
310
                                        {
-
 
311
                                                ToFlightCtrl.Param.Long[0]  = GPS_pTargetPosition->Longitude;
-
 
312
                                                ToFlightCtrl.Param.Long[1]  = GPS_pTargetPosition->Latitude;
-
 
313
                                        }
-
 
314
                                        else
-
 
315
                                        {
-
 
316
                                                ToFlightCtrl.Param.Long[0]  = 0;
-
 
317
                                                ToFlightCtrl.Param.Long[1]  = 0;
-
 
318
                                        }
-
 
319
                                }
-
 
320
                                else
-
 
321
                                {
-
 
322
                                        ToFlightCtrl.Param.Long[0]  = 0;
-
 
323
                                        ToFlightCtrl.Param.Long[1]  = 0;
-
 
324
                                }
-
 
325
                                break;
-
 
326
 
-
 
327
                        default:
-
 
328
                                break;
-
 
329
                }
-
 
330
                VIC_ITCmd(SSP0_ITLine, ENABLE);         // enable SPI interrupt
-
 
331
 
-
 
332
 
-
 
333
                switch(FromFlightCtrl.Command)
-
 
334
                {
-
 
335
                        case SPI_CMD_USER:
-
 
336
                                Parameter.User1 = FromFlightCtrl.Param.Byte[0];
-
 
337
                                Parameter.User2 = FromFlightCtrl.Param.Byte[1];
-
 
338
                                Parameter.User3 = FromFlightCtrl.Param.Byte[2];
-
 
339
                                Parameter.User4 = FromFlightCtrl.Param.Byte[3];
-
 
340
                                Parameter.User5 = FromFlightCtrl.Param.Byte[4];
-
 
341
                                Parameter.User6 = FromFlightCtrl.Param.Byte[5];
-
 
342
                                Parameter.User7 = FromFlightCtrl.Param.Byte[6];
-
 
343
                                Parameter.User8 = FromFlightCtrl.Param.Byte[7];
-
 
344
                                if(ClearMKFlags)
-
 
345
                                {
-
 
346
                                        FC.MKFlags = 0;
-
 
347
                                        ClearMKFlags = 0;
-
 
348
                                }
-
 
349
                                FC.MKFlags         |= FromFlightCtrl.Param.Byte[8];
-
 
350
                                FC.UBat                 = FromFlightCtrl.Param.Byte[9];
-
 
351
                                Parameter.LowVoltageWarning = FromFlightCtrl.Param.Byte[10];
-
 
352
                                Parameter.ActiveSetting         = FromFlightCtrl.Param.Byte[11];
-
 
353
                                break;
-
 
354
 
-
 
355
 #define CHK_POTI_MM(b,a,min,max) { if(a > 250) { if(a == 251) b = FC.Poti1; else if(a == 252) b = FC.Poti2; else if(a == 253) b = FC.Poti3; else if(a == 254) b = FC.Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;}
-
 
356
                        case SPI_CMD_PARAMETER1:
-
 
357
                                CHK_POTI_MM(Parameter.NaviGpsModeControl,FromFlightCtrl.Param.Byte[0],0,255);
-
 
358
                                CHK_POTI_MM(Parameter.NaviGpsGain,FromFlightCtrl.Param.Byte[1],0,255);
-
 
359
                                CHK_POTI_MM(Parameter.NaviGpsP,FromFlightCtrl.Param.Byte[2],0,255);
-
 
360
                                CHK_POTI_MM(Parameter.NaviGpsI,FromFlightCtrl.Param.Byte[3],0,255);
-
 
361
                                CHK_POTI_MM(Parameter.NaviGpsD,FromFlightCtrl.Param.Byte[4],0,255);
-
 
362
                                CHK_POTI_MM(Parameter.NaviGpsACC,FromFlightCtrl.Param.Byte[5],0,255);
-
 
363
                                Parameter.NaviGpsMinSat = FromFlightCtrl.Param.Byte[6];
-
 
364
                                Parameter.NaviStickThreshold = FromFlightCtrl.Param.Byte[7];
-
 
365
                                CHK_POTI_MM(Parameter.NaviOperatingRadius,FromFlightCtrl.Param.Byte[8],10,255);
-
 
366
                                CHK_POTI_MM(Parameter.NaviWindCorrection,FromFlightCtrl.Param.Byte[9],0,255);
-
 
367
                                CHK_POTI_MM(Parameter.NaviSpeedCompensation,FromFlightCtrl.Param.Byte[10],0,255);
-
 
368
                                CHK_POTI_MM(Parameter.NaviAngleLimitation,FromFlightCtrl.Param.Byte[11],0,255);
-
 
369
//              DebugOut.Analog[4] = Parameter.NaviRadiusAlert;
-
 
370
//              DebugOut.Analog[5] = Parameter.NaviWindCorrection;
-
 
371
//              DebugOut.Analog[6] = Parameter.NaviSpeedCompensation;
-
 
372
                        break;
-
 
373
 
-
 
374
                        case SPI_CMD_STICK:
-
 
375
                                FC.StickGas     = FromFlightCtrl.Param.sByte[0];
-
 
376
                                FC.StickYaw     = FromFlightCtrl.Param.sByte[1];
-
 
377
                                FC.StickRoll    = FromFlightCtrl.Param.sByte[2];
-
 
378
                                FC.StickNick    = FromFlightCtrl.Param.sByte[3];
-
 
379
                                FC.Poti1                = FromFlightCtrl.Param.Byte[4];
-
 
380
                                FC.Poti2                = FromFlightCtrl.Param.Byte[5];
-
 
381
                                FC.Poti3                = FromFlightCtrl.Param.Byte[6];
-
 
382
                                FC.Poti4                = FromFlightCtrl.Param.Byte[7];
-
 
383
                                FC.RC_Quality   = FromFlightCtrl.Param.Byte[8];
-
 
384
                                break;
-
 
385
 
-
 
386
                        case SPI_CMD_MISC:
-
 
387
                                if(CompassCalState != FromFlightCtrl.Param.Byte[0])
-
 
388
                                {       // put only new CompassCalState into queue to send via I2C
-
 
389
                                        CompassCalState = FromFlightCtrl.Param.Byte[0];
-
 
390
                                        fifo_put(&CompassCalcStateFiFo, CompassCalState);
-
 
391
                                }
-
 
392
                                NaviData.Altimeter = (s16) FromFlightCtrl.Param.Int[1];
-
 
393
                                break;
-
 
394
 
-
 
395
                        case SPI_CMD_VERSION:
-
 
396
                                FC_Version.Major = FromFlightCtrl.Param.Byte[0];
-
 
397
                                FC_Version.Minor = FromFlightCtrl.Param.Byte[1];
-
 
398
                                FC_Version.Patch = FromFlightCtrl.Param.Byte[2];
-
 
399
                                FC_Version.Compatible = FromFlightCtrl.Param.Byte[3];
-
 
400
                                break;
-
 
401
 
-
 
402
                        default:
-
 
403
                        break;
-
 
404
                }
-
 
405
 
Line 221... Line 406...
221
  VIC_Config(SSP0_ITLine, VIC_IRQ, 1);
406
                // every time we got new data from the FC via SPI call the navigation routine
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;
407
                GPS_Navigation();
-
 
408
                ClearMKFlags = 1;
236
   DebugOut.Analog[1] = FromFlightCtrl.IntegralRoll;
409
 
237
   DebugOut.Analog[2] = (30*FromFlightCtrl.AccNick)/108;
410
                SPI_RxBuffer_Request = 0;
238
   DebugOut.Analog[3] = (30*FromFlightCtrl.AccRoll)/108;
411
 
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
{
-
 
251
   if(CompassUpdateActiv) return;  // testweise deaktiviert
-
 
252
   if(SPI_RXUpdatebufferRequest)
-
 
253
   {
-
 
254
                                 
-
 
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];
-
 
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];
412
                DebugOut.Analog[0] = FromFlightCtrl.IntegralNick;
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];
413
                DebugOut.Analog[1] = FromFlightCtrl.IntegralRoll;
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];
-
 
Line -... Line 414...
-
 
414
                DebugOut.Analog[2] = (30*FromFlightCtrl.AccNick)/108;
-
 
415
                DebugOut.Analog[3] = (30*FromFlightCtrl.AccRoll)/108;
-
 
416
                DebugOut.Analog[25] = FromFlightCtrl.GyroHeading;
-
 
417
 
-
 
418
        }  // EOF if(SPI_RxBuffer_Request)
-
 
419
}
-
 
420
 
-
 
421
//------------------------------------------------------
-
 
422
void SPI0_GetFlightCtrlVersion(void)
348
                 break;
423
{
-
 
424
        u16 timeout;
-
 
425
        u8 msg[20];
-
 
426
 
-
 
427
        FC_Version.Major = 0xFF;
-
 
428
        FC_Version.Minor = 0xFF;
-
 
429
        FC_Version.Patch = 0xFF;
-
 
430
        FC_Version.Compatible = 0xFF;
-
 
431
 
-
 
432
        // polling FC version info for 2 second
349
 
433
        timeout = SetDelay(2000);
-
 
434
        do
350
       default:
435
        {
Line -... Line 436...
-
 
436
                SPI0_UpdateBuffer();