Rev 662 |
Blame |
Last modification |
View Log
| RSS feed
// ######################## SPI - FlightCtrl ###################
#include "main.h"
struct str_ToNaviCtrl ToNaviCtrl
;
struct str_FromNaviCtrl FromNaviCtrl
;
unsigned char SPI_BufferIndex
;
volatile unsigned char SPI_Buffer
[sizeof(FromNaviCtrl
)];
unsigned char *Ptr_buffer
= (unsigned char *) &ToNaviCtrl
;
//------------------------------------------------------
void SPI_MasterInit
(void)
{
DDR_SPI
|= (1<<DD_MOSI
)|(1<<DD_SCK
); // Set MOSI and SCK output, all others input
SLAVE_SELECT_DDR_PORT
|= (1 << SPI_SLAVE_SELECT
);
SPCR
= (1<<SPE
)|(1<<MSTR
)|(1<<SPR1
)|(0<<SPIE
); // Enable SPI, Master, set clock rate fck/64
SLAVE_SELECT_PORT
|= (1 << SPI_SLAVE_SELECT
);
}
//------------------------------------------------------
void SPI_StartTransmitPacket
(void)
{
if ((SLAVE_SELECT_PORT
& (1 << SPI_SLAVE_SELECT
)) == 0) return; // transfer of prev. packet not completed
SLAVE_SELECT_PORT
&= ~
(1 << SPI_SLAVE_SELECT
); // SelectSlave
UpdateSPI_Buffer
(); // update buffer
SPI_BufferIndex
= 1;
DebugOut.
Analog[16]++;
// -- Debug-Output ---
cli
();
DebugOut.
Analog[20] = FromNaviCtrl.
Comp;
DebugOut.
Analog[21] = FromNaviCtrl.
GPS_Nick;
DebugOut.
Analog[22] = FromNaviCtrl.
GPS_Roll;
DebugOut.
Analog[23] = FromNaviCtrl.
CompassValue;
sei
();
//----
SPDR
= ToNaviCtrl.
Comp; // Start transmission
}
//------------------------------------------------------
//SIGNAL(SIG_SPI)
void SPI_TransmitByte
(void)
{
if (!(SPSR
& (1 << SPIF
))) return;
if (SPI_BufferIndex
< sizeof(FromNaviCtrl
))
{ SPI_Buffer
[SPI_BufferIndex
]= SPDR
; // get data
//if(SPDR!= 0x00) DebugOut.Analog[19]++; ;
}
if (SPI_BufferIndex
< sizeof(ToNaviCtrl
))
{ SPDR
= Ptr_buffer
[SPI_BufferIndex
];
}
else
{
unsigned char *ptr
= (unsigned char *)&FromNaviCtrl
;
unsigned char i
;
SLAVE_SELECT_PORT
|= (1 << SPI_SLAVE_SELECT
); // DeselectSlave
memcpy(ptr
, (unsigned char *) SPI_Buffer
, sizeof(SPI_Buffer
));
}
SPI_BufferIndex
++;
}
//------------------------------------------------------
void UpdateSPI_Buffer
(void)
{
cli
();
ToNaviCtrl.
Comp = SPI_PROTOCOL_COMP
;
ToNaviCtrl.
IntegralNick = (int) (IntegralNick
>> 4);
ToNaviCtrl.
IntegralRoll = (int) (IntegralRoll
>> 4);
ToNaviCtrl.
StickNick = (char) StickNick
;
ToNaviCtrl.
StickRoll = (char) StickRoll
;
ToNaviCtrl.
StickGier = (char) StickGier
;
sei
();
}