Subversion Repositories FlightCtrl

Rev

Rev 691 | Rev 709 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 691 Rev 708
1
// ######################## SPI - FlightCtrl ###################
1
// ######################## SPI - FlightCtrl ###################
2
#include "main.h"
2
#include "main.h"
3
 
3
 
-
 
4
 
-
 
5
struct str_ToNaviCtrl_Version   ToNaviCtrl_Version;
4
 
6
struct str_FromNaviCtrl_Version   FromNaviCtrl_Version;
5
struct str_ToNaviCtrl      ToNaviCtrl;
7
struct str_ToNaviCtrl_Value   ToNaviCtrl_Value;
-
 
8
struct str_FromNaviCtrl_Value   FromNaviCtrl_Value;
6
struct str_FromNaviCtrl    FromNaviCtrl;
9
 
-
 
10
unsigned char              SPI_BufferIndex;
-
 
11
unsigned char              SPI_RxBufferIndex;
7
unsigned char              SPI_BufferIndex;
12
 
8
volatile unsigned char     SPI_Buffer[sizeof(FromNaviCtrl)];
13
volatile unsigned char     SPI_Buffer[sizeof(FromNaviCtrl_Value)];
9
unsigned char *Ptr_buffer = (unsigned char *) &ToNaviCtrl;
14
unsigned char *SPI_TX_Buffer, *ToNaviCtrl_Chksum;
10
 
15
 
11
unsigned char SPITransferCompleted, SPI_ChkSum;
16
unsigned char SPITransferCompleted, SPI_ChkSum;
12
#ifdef USE_SPI_COMMUNICATION
17
#ifdef USE_SPI_COMMUNICATION
13
 
18
 
14
//------------------------------------------------------
19
//------------------------------------------------------
15
void SPI_MasterInit(void)
20
void SPI_MasterInit(void)
16
{
21
{
17
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);    // Set MOSI and SCK output, all others input 
22
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);    // Set MOSI and SCK output, all others input 
18
  SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT);
23
  SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT);
19
   
24
   
20
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE);   // Enable SPI, Master, set clock rate fck/64 
25
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE);   // Enable SPI, Master, set clock rate fck/64 
21
  SPSR = 0;  // SPI2X
26
  SPSR = 0;  // SPI2X
22
 
27
 
23
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);
28
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);
24
  SPITransferCompleted = 1;
29
  SPITransferCompleted = 1;
25
 
-
 
26
  ToNaviCtrl.Sync1 = 0x81;
30
 
-
 
31
  //SPDR = 0x00;  // dummy write
27
  ToNaviCtrl.Sync2 = 0x55;
32
 
-
 
33
  ToNaviCtrl_Value.Sync1 = 0x81;
-
 
34
  ToNaviCtrl_Value.Sync2 = 0x55;
28
 
35
 
29
  ToNaviCtrl.Comp = 12;
36
  ToNaviCtrl_Value.Command = SPI_CMD_VALUE;
30
  ToNaviCtrl.IntegralNick = 12345;
37
  ToNaviCtrl_Value.IntegralNick = 12345;
31
  ToNaviCtrl.IntegralRoll = 56789;
38
  ToNaviCtrl_Value.IntegralRoll = 56789;
32
  ToNaviCtrl.StickNick = 100;
39
  ToNaviCtrl_Value.StickNick = 100;
33
  ToNaviCtrl.StickRoll = 150;//(char) StickRoll;
40
  ToNaviCtrl_Value.StickRoll = 150;//(char) StickRoll;
34
  ToNaviCtrl.StickGier = 200;//(char) StickGier;
41
  ToNaviCtrl_Value.StickGier = 200;//(char) StickGier;
35
 
42
 
36
}
43
}
37
 
44
 
38
//------------------------------------------------------
45
//------------------------------------------------------
39
void SPI_StartTransmitPacket(void)
46
void SPI_StartTransmitPacket(unsigned char command)
40
{
47
{
41
   //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return;    // transfer of prev. packet not completed
48
   //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return;    // transfer of prev. packet not completed
42
   if (!SPITransferCompleted) return;
49
   if (!SPITransferCompleted) return;
-
 
50
   //if (!(SPSR & (1 << SPIF))) return;
-
 
51
   _delay_us(30);
43
   
52
   
44
   SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
53
   SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
-
 
54
   
-
 
55
   switch(command)
-
 
56
   {
-
 
57
     case SPI_CMD_VERSION: SPI_TX_Buffer  = (unsigned char *) &ToNaviCtrl_Version;
-
 
58
                                                   ToNaviCtrl_Chksum = (unsigned char *) &ToNaviCtrl_Version.Chksum;
-
 
59
            break;       
-
 
60
       
-
 
61
         case SPI_CMD_VALUE: SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl_Value;
-
 
62
                             ToNaviCtrl_Chksum = (unsigned char *) &ToNaviCtrl_Value.Chksum;
-
 
63
            break;
-
 
64
 
-
 
65
   }
-
 
66
   
45
   
67
   
46
   SPITransferCompleted = 0;
68
   SPITransferCompleted = 0;
47
   UpdateSPI_Buffer();                              // update buffer
69
   UpdateSPI_Buffer();                              // update buffer
48
   SPI_BufferIndex = 1;
70
   SPI_BufferIndex = 1;
49
   DebugOut.Analog[16]++;
71
  //ebugOut.Analog[16]++; 
50
   // -- Debug-Output ---
72
   // -- Debug-Output ---
51
   //----
73
   //----
52
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
74
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
53
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
75
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
54
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
76
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
55
   SPDR = ToNaviCtrl.Sync1;                  // Start transmission 
77
   SPDR = ToNaviCtrl_Value.Sync1;                  // Start transmission 
56
   ToNaviCtrl.ChkSum = ToNaviCtrl.Sync1;
78
   *ToNaviCtrl_Chksum = ToNaviCtrl_Value.Sync1;
57
//     SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
79
//     SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
58
 
80
 
59
}
81
}
60
 
82
 
61
//------------------------------------------------------
83
//------------------------------------------------------
62
//SIGNAL(SIG_SPI)
84
//SIGNAL(SIG_SPI)
63
void SPI_TransmitByte(void)
85
void SPI_TransmitByte(void)
64
{
86
{
-
 
87
   static unsigned char SPI_RXState = 0;
-
 
88
   unsigned char rxdata;
-
 
89
   static unsigned char rxchksum;
65
   
90
   
66
   if (SPITransferCompleted) return;
91
   if (SPITransferCompleted) return;
67
   if (!(SPSR & (1 << SPIF))) return;
92
   if (!(SPSR & (1 << SPIF))) return;
-
 
93
   
-
 
94
  _delay_us(30);
68
   
95
   
69
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
-
 
70
   
-
 
71
          if (SPI_BufferIndex < sizeof(FromNaviCtrl))
-
 
72
      {
-
 
73
            SPI_Buffer[SPI_BufferIndex]= SPDR;             // get data 
-
 
74
               
-
 
75
//              if (SPI_BufferIndex < 32 ) DebugOut.Analog[26+SPI_BufferIndex] = SPI_Buffer[SPI_BufferIndex];
-
 
76
       
-
 
77
        //if(SPDR!= 0x00) DebugOut.Analog[19]++; ;             
-
 
-
 
96
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
-
 
97
 
-
 
98
  rxdata = SPDR;
-
 
99
  switch ( SPI_RXState)
-
 
100
  {
-
 
101
  case 0:
-
 
102
           
-
 
103
                        SPI_RxBufferIndex = 0;
-
 
104
                        //DebugOut.Analog[17]++;
-
 
105
                        rxchksum = rxdata;  
-
 
106
                        if (rxdata == 0x81 )  { SPI_RXState  = 1;  }   // 1. Syncbyte ok 
-
 
107
                       
-
 
108
           break;
-
 
109
 
-
 
110
   case 1:
-
 
111
                    if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState  = 2;  }   // 2. Syncbyte ok 
-
 
112
                 else SPI_RXState  = 0;    
-
 
113
                        //DebugOut.Analog[18]++;
-
 
114
           break;      
-
 
115
           
-
 
116
   case 2:
-
 
117
                   SPI_Buffer[SPI_RxBufferIndex++]= rxdata;             // get data
-
 
118
           //DebugOut.Analog[19]++;
-
 
119
           if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl_Value))
-
 
120
                   {  
-
 
121
                         
-
 
122
                if (rxdata == rxchksum)
-
 
123
                        {
-
 
124
                  unsigned char *ptr = (unsigned char *)&FromNaviCtrl_Value;
-
 
125
     
-
 
126
                          memcpy(ptr, (unsigned char *) SPI_Buffer,  sizeof(SPI_Buffer));
-
 
127
                         
-
 
128
                          DebugOut.Analog[20]++;
-
 
129
                        }
-
 
130
                        else DebugOut.Analog[21]++;
-
 
131
                       
-
 
132
                        SPI_RXState  = 0;  
-
 
133
                   }
-
 
134
                  else rxchksum += rxdata;
-
 
135
        break;   
-
 
136
         
78
          }
137
  }            
79
 
138
 
80
   if (SPI_BufferIndex < sizeof(ToNaviCtrl))  
139
   if (SPI_BufferIndex < sizeof(ToNaviCtrl_Value))  
81
     {
140
     {
82
           SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
141
           SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
83
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
142
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
84
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
143
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
85
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
144
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
86
           
145
           
87
           SPDR = Ptr_buffer[SPI_BufferIndex];
146
           SPDR = SPI_TX_Buffer[SPI_BufferIndex];
88
           ToNaviCtrl.ChkSum += Ptr_buffer[SPI_BufferIndex];
147
           *ToNaviCtrl_Chksum += SPI_TX_Buffer[SPI_BufferIndex];
89
        //   SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
148
        //   SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
90
 
149
 
91
         }
150
         }
92
   else
-
 
93
     {
-
 
94
           unsigned char *ptr = (unsigned char *)&FromNaviCtrl;
-
 
95
           
-
 
96
       SPITransferCompleted = 1;  
151
         else SPITransferCompleted = 1;  
97
       memcpy(ptr, (unsigned char *) SPI_Buffer,  sizeof(SPI_Buffer));
-
 
98
         }
-
 
99
         
152
       
100
         SPI_BufferIndex++;
153
         SPI_BufferIndex++;
101
}
154
}
102
 
-
 
103
/*
-
 
104
void SPI_MasterInit(void)
-
 
105
{
-
 
106
  DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK);    // Set MOSI and SCK output, all others input
-
 
107
  SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT);
-
 
108
   
-
 
109
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPIE);   // Enable SPI, Master, set clock rate fck/64
-
 
110
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);
-
 
111
  SPITransferCompleted = 1;
-
 
112
 
-
 
113
  ToNaviCtrl.Sync1 = 0x81;
-
 
114
  ToNaviCtrl.Sync2 = 0x55;
-
 
115
 
-
 
116
 
-
 
117
}
155
 
118
 
-
 
119
//------------------------------------------------------
-
 
120
void SPI_StartTransmitPacket(void)
-
 
121
{
-
 
122
   //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return;    // transfer of prev. packet not completed
-
 
123
   if (!SPITransferCompleted) return;
-
 
124
   
-
 
125
   SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
-
 
126
   SPITransferCompleted = 0;
-
 
127
   UpdateSPI_Buffer();                              // update buffer
-
 
128
   SPI_BufferIndex = 1;
-
 
129
   DebugOut.Analog[16]++;
-
 
130
   // -- Debug-Output ---
-
 
131
   //----
-
 
132
   SPDR = ToNaviCtrl.Sync1;                  // Start transmission
-
 
133
}
-
 
134
 
-
 
135
//------------------------------------------------------
-
 
136
//SIGNAL(SIG_SPI)
-
 
137
void SPI_TransmitByte(void)
-
 
138
{
-
 
139
   if (!(SPSR & (1 << SPIF))) return;
-
 
140
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
-
 
141
   
-
 
142
          if (SPI_BufferIndex < sizeof(FromNaviCtrl))
-
 
143
      {
-
 
144
            SPI_Buffer[SPI_BufferIndex]= SPDR;             // get data
-
 
145
//              if (SPI_BufferIndex < 32 ) DebugOut.Analog[26+SPI_BufferIndex] = SPI_Buffer[SPI_BufferIndex];
-
 
146
       
-
 
147
        //if(SPDR!= 0x00) DebugOut.Analog[19]++; ;            
-
 
148
          }
-
 
149
 
-
 
150
   if (SPI_BufferIndex < sizeof(ToNaviCtrl))  
-
 
151
     {
-
 
152
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
-
 
153
           SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
-
 
154
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
-
 
155
           SPDR = Ptr_buffer[SPI_BufferIndex];
-
 
156
         }
-
 
157
   else
-
 
158
     {
-
 
159
           unsigned char *ptr = (unsigned char *)&FromNaviCtrl;
-
 
160
           
-
 
161
       SPITransferCompleted = 1;  
-
 
162
       memcpy(ptr, (unsigned char *) SPI_Buffer,  sizeof(SPI_Buffer));
-
 
163
         }
-
 
164
         
-
 
165
         SPI_BufferIndex++;
-
 
166
}
-
 
167
*/
156
 
168
//------------------------------------------------------
157
//------------------------------------------------------
169
void UpdateSPI_Buffer(void)
158
void UpdateSPI_Buffer(void)
170
{
159
{
171
  static unsigned char i =0;
160
  static unsigned char i =0;
172
  cli();
161
  cli();
173
  ToNaviCtrl.Comp = SPI_PROTOCOL_COMP;
162
  ToNaviCtrl_Value.Command = SPI_CMD_VALUE;
174
  ToNaviCtrl.IntegralNick = (int) (IntegralNick >> 4);
163
  ToNaviCtrl_Value.IntegralNick = (int) (IntegralNick >> 4);
175
  ToNaviCtrl.IntegralRoll = (int) (IntegralRoll >> 4);
164
  ToNaviCtrl_Value.IntegralRoll = (int) (IntegralRoll >> 4);
176
  ToNaviCtrl.StickNick = 4;
165
  ToNaviCtrl_Value.StickNick = 4;
177
  ToNaviCtrl.StickRoll = 5;//(char) StickRoll;
166
  ToNaviCtrl_Value.StickRoll = 5;//(char) StickRoll;
178
  ToNaviCtrl.StickGier = 6;//(char) StickGier;
167
  ToNaviCtrl_Value.StickGier = 6;//(char) StickGier;
179
  sei();
168
  sei();
-
 
169
 
-
 
170
DebugOut.Analog[30] = FromNaviCtrl_Value.GPS_Nick;
180
 
171
DebugOut.Analog[31] = FromNaviCtrl_Value.GPS_Roll;
181
}
172
}
182
 
173
 
183
#endif
174
#endif
184
 
175
 
185
 
176
 
186
 
177