Rev 701 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 701 | Rev 898 | ||
---|---|---|---|
1 | // ######################## SPI - FlightCtrl ################### |
1 | // ######################## SPI - FlightCtrl ################### |
2 | #include "main.h" |
2 | #include "main.h" |
3 | #include "spi.h" |
3 | #include "spi.h" |
4 | 4 | ||
5 | 5 | ||
6 | struct str_ToNaviCtrl ToNaviCtrl; |
6 | struct str_ToNaviCtrl ToNaviCtrl; |
7 | struct str_FromNaviCtrl FromNaviCtrl; |
7 | struct str_FromNaviCtrl FromNaviCtrl; |
8 | unsigned char SPI_BufferIndex; |
8 | unsigned char SPI_BufferIndex; |
9 | volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
9 | volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
10 | unsigned char *Ptr_buffer = (unsigned char *) &ToNaviCtrl; |
10 | unsigned char *Ptr_buffer = (unsigned char *) &ToNaviCtrl; |
11 | 11 | ||
12 | unsigned char SPITransferCompleted, SPI_ChkSum; |
12 | unsigned char SPITransferCompleted, SPI_ChkSum; |
13 | #ifdef USE_SPI_COMMUNICATION |
13 | #ifdef USE_SPI_COMMUNICATION |
14 | //------------------------------------------------------ |
14 | //------------------------------------------------------ |
15 | void SPI_MasterInit(void) |
15 | void SPI_MasterInit(void) |
16 | { |
16 | { |
17 | DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
17 | 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); |
18 | SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
19 | 19 | ||
20 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
20 | SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
21 | SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
21 | SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
22 | SPITransferCompleted = 1; |
22 | SPITransferCompleted = 1; |
23 | 23 | ||
24 | ToNaviCtrl.Sync1 = 0x81; |
24 | ToNaviCtrl.Sync1 = 0x81; |
25 | ToNaviCtrl.Sync2 = 0x55; |
25 | ToNaviCtrl.Sync2 = 0x55; |
26 | 26 | ||
27 | ToNaviCtrl.Comp = 12; |
27 | ToNaviCtrl.Comp = 12; |
28 | ToNaviCtrl.IntegralPitch = 12345; |
28 | ToNaviCtrl.IntegralPitch = 12345; |
29 | ToNaviCtrl.IntegralRoll = 56789; |
29 | ToNaviCtrl.IntegralRoll = 56789; |
30 | ToNaviCtrl.StickPitch = 100; |
30 | ToNaviCtrl.StickPitch = 100; |
31 | ToNaviCtrl.StickRoll = 150;//(char) StickRoll; |
31 | ToNaviCtrl.StickRoll = 150;//(char) StickRoll; |
32 | ToNaviCtrl.StickYaw = 200;//(char) StickYaw; |
32 | ToNaviCtrl.StickYaw = 200;//(char) StickYaw; |
33 | 33 | ||
34 | } |
34 | } |
35 | 35 | ||
36 | //------------------------------------------------------ |
36 | //------------------------------------------------------ |
37 | void SPI_StartTransmitPacket(void) |
37 | void SPI_StartTransmitPacket(void) |
38 | { |
38 | { |
39 | //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
39 | //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
40 | if (!SPITransferCompleted) return; |
40 | if (!SPITransferCompleted) return; |
41 | 41 | ||
42 | SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
42 | SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
43 | 43 | ||
44 | SPITransferCompleted = 0; |
44 | SPITransferCompleted = 0; |
45 | UpdateSPI_Buffer(); // update buffer |
45 | UpdateSPI_Buffer(); // update buffer |
46 | SPI_BufferIndex = 1; |
46 | SPI_BufferIndex = 1; |
47 | DebugOut.Analog[16]++; |
47 | // DebugOut.Analog[16]++; |
48 | // -- Debug-Output --- |
48 | // -- Debug-Output --- |
49 | /* DebugOut.Analog[20] = FromNaviCtrl.Comp; |
49 | /* DebugOut.Analog[20] = FromNaviCtrl.Comp; |
50 | DebugOut.Analog[21] = FromNaviCtrl.GPS_Pitch; |
50 | DebugOut.Analog[21] = FromNaviCtrl.GPS_Pitch; |
51 | DebugOut.Analog[22] = FromNaviCtrl.GPS_Roll; |
51 | DebugOut.Analog[22] = FromNaviCtrl.GPS_Roll; |
52 | DebugOut.Analog[23] = FromNaviCtrl.CompassHeading; |
52 | DebugOut.Analog[23] = FromNaviCtrl.CompassHeading; |
53 | */ |
53 | */ |
54 | //---- |
54 | //---- |
55 | SPDR = ToNaviCtrl.Sync1; // Start transmission |
55 | SPDR = ToNaviCtrl.Sync1; // Start transmission |
56 | ToNaviCtrl.ChkSum = ToNaviCtrl.Sync1; |
56 | ToNaviCtrl.ChkSum = ToNaviCtrl.Sync1; |
57 | } |
57 | } |
58 | 58 | ||
59 | //------------------------------------------------------ |
59 | //------------------------------------------------------ |
60 | //SIGNAL(SIG_SPI) |
60 | //SIGNAL(SIG_SPI) |
61 | void SPI_TransmitByte(void) |
61 | void SPI_TransmitByte(void) |
62 | { |
62 | { |
63 | if (!(SPSR & (1 << SPIF))) return; |
63 | if (!(SPSR & (1 << SPIF))) return; |
64 | SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
64 | SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
65 | 65 | ||
66 | if (SPI_BufferIndex < sizeof(FromNaviCtrl)) |
66 | if (SPI_BufferIndex < sizeof(FromNaviCtrl)) |
67 | { |
67 | { |
68 | SPI_Buffer[SPI_BufferIndex]= SPDR; // get data |
68 | SPI_Buffer[SPI_BufferIndex]= SPDR; // get data |
69 | 69 | ||
70 | // if (SPI_BufferIndex < 32 ) DebugOut.Analog[26+SPI_BufferIndex] = SPI_Buffer[SPI_BufferIndex]; |
70 | // if (SPI_BufferIndex < 32 ) DebugOut.Analog[26+SPI_BufferIndex] = SPI_Buffer[SPI_BufferIndex]; |
71 | 71 | ||
72 | //if(SPDR!= 0x00) DebugOut.Analog[19]++; ; |
72 | //if(SPDR!= 0x00) DebugOut.Analog[19]++; ; |
73 | } |
73 | } |
74 | 74 | ||
75 | if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
75 | if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
76 | { |
76 | { |
77 | asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
77 | asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
78 | asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
78 | asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
79 | SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
79 | SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
80 | asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
80 | asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
81 | asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
81 | asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
82 | 82 | ||
83 | SPDR = Ptr_buffer[SPI_BufferIndex]; |
83 | SPDR = Ptr_buffer[SPI_BufferIndex]; |
84 | ToNaviCtrl.ChkSum += Ptr_buffer[SPI_BufferIndex]; |
84 | ToNaviCtrl.ChkSum += Ptr_buffer[SPI_BufferIndex]; |
85 | } |
85 | } |
86 | else |
86 | else |
87 | { |
87 | { |
88 | unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
88 | unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
89 | 89 | ||
90 | SPITransferCompleted = 1; |
90 | SPITransferCompleted = 1; |
91 | memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
91 | memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
92 | } |
92 | } |
93 | 93 | ||
94 | SPI_BufferIndex++; |
94 | SPI_BufferIndex++; |
95 | } |
95 | } |
96 | 96 | ||
97 | //------------------------------------------------------ |
97 | //------------------------------------------------------ |
98 | void UpdateSPI_Buffer(void) |
98 | void UpdateSPI_Buffer(void) |
99 | { |
99 | { |
100 | /*static unsigned char i =0; |
100 | /*static unsigned char i =0; |
101 | cli(); |
101 | cli(); |
102 | ToNaviCtrl.Comp = SPI_PROTOCOL_COMP; |
102 | ToNaviCtrl.Comp = SPI_PROTOCOL_COMP; |
103 | ToNaviCtrl.IntegralPitch = (int) (IntegralPitch >> 4); |
103 | ToNaviCtrl.IntegralPitch = (int) (IntegralPitch >> 4); |
104 | ToNaviCtrl.IntegralRoll = (int) (IntegralRoll >> 4); |
104 | ToNaviCtrl.IntegralRoll = (int) (IntegralRoll >> 4); |
105 | ToNaviCtrl.StickPitch = 4; |
105 | ToNaviCtrl.StickPitch = 4; |
106 | ToNaviCtrl.StickRoll = 5;//(char) StickRoll; |
106 | ToNaviCtrl.StickRoll = 5;//(char) StickRoll; |
107 | ToNaviCtrl.StickYaw = 6;//(char) StickYaw; |
107 | ToNaviCtrl.StickYaw = 6;//(char) StickYaw; |
108 | sei(); |
108 | sei(); |
109 | */ |
109 | */ |
110 | } |
110 | } |
111 | 111 | ||
112 | #endif |
112 | #endif |
113 | 113 | ||
114 | 114 | ||
115 | 115 |