Subversion Repositories NaviCtrl

Compare Revisions

Ignore whitespace Rev 78 → Rev 79

/trunk/i2c.c
195,7 → 195,7
//--------------------------------------------------------------
void I2C1_Deinit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
 
SerialPutString("\r\n I2C deinit...");
I2C_GenerateStart(I2C1, DISABLE);
205,19 → 205,19
I2C_Cmd(I2C1, DISABLE);
I2C_DeInit(I2C1);
SCU_APBPeriphClockConfig(__I2C1, DISABLE);
 
// set ports to input
SCU_APBPeriphClockConfig(__GPIO2, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull;
GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Disable;
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO2, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
GPIO_Init(GPIO2, &GPIO_InitStructure);
 
I2C_TxBuffer = NULL;
Tx_Idx = 0;
Tx_Idx = 0;
I2C_TxBufferSize = 0;
 
I2C_RxBuffer = NULL;
242,7 → 242,7
status = I2C_GetLastEvent(I2C1);
 
if(status & (I2C_FLAG_AF|I2C_FLAG_BERR)) // if an acknowledge failure or bus error occured
{ // Set and subsequently clear the STOP bit while BTF is set.
{ // Set and subsequently clear the STOP bit while BTF is set.
while(I2C_GetFlagStatus (I2C1, I2C_FLAG_BTF) != RESET)
{
I2C_GenerateSTOP (I2C1, ENABLE); // free the bus
264,7 → 264,7
case I2C_MODE_TRANSMITTER:
I2C_State = I2C_TX_PROGRESS;
break;
 
case I2C_MODE_RECEIVER:
if ((I2C_RxBuffer == NULL) || (I2C_RxBufferSize == 0))
{
277,7 → 277,7
I2C_State = I2C_RX_PROGRESS;
}
break;
 
default: // invalid direction
I2C_GenerateSTOP (I2C1, ENABLE);
I2C_State = I2C_IDLE;
289,17 → 289,17
// send address/direction byte on the bus
I2C_Send7bitAddress(I2C1, I2C_SLAVE_ADDRESS, I2C_Direction);
break;
 
// the address byte was send
case I2C_EVENT_MASTER_MODE_SELECTED:
// Clear EV6 by set again the PE bit
I2C_Cmd(I2C1, ENABLE);
I2C_Cmd(I2C1, ENABLE);
// reset checksum
crc = 0;
switch(I2C_State)
{
case I2C_TX_PROGRESS:
// send command 1st data byte (allways the command id)
// send command 1st data byte (allways the command id)
I2C_SendData(I2C1, I2C_Command);
crc += I2C_Command;
Tx_Idx = 0;
306,11 → 306,11
// reset timeout
I2C1_Timeout = SetDelay(500); // after 500 ms of inactivity the I2C1 bus will be reset
break;
 
case I2C_RX_PROGRESS:
Rx_Idx = 0;
break;
 
default: // unknown I2C state
// should never happen
I2C_GenerateSTOP (I2C1, ENABLE);
318,10 → 318,10
break;
}
break;
 
// the master has transmitted a byte and slave has been acknowledged
case I2C_EVENT_MASTER_BYTE_TRANSMITTED:
 
// some bytes have to be transmitted
if(Tx_Idx < I2C_TxBufferSize)
{
342,8 → 342,8
// generate stop or repeated start condition
if ((I2C_RxBuffer != NULL) && (I2C_RxBufferSize > 0)) // is any answer byte expected?
{
I2C_Direction = I2C_MODE_RECEIVER; // switch to master receiver after repeated start condition
I2C_GenerateStart(I2C1, ENABLE); // initiate repeated start condition on the bus
I2C_Direction = I2C_MODE_RECEIVER; // switch to master receiver after repeated start condition
I2C_GenerateStart(I2C1, ENABLE); // initiate repeated start condition on the bus
}
else
{ // stop communication
353,11 → 353,11
DebugOut.Analog[15]++;
}
}
Tx_Idx++;
Tx_Idx++;
break;
 
// the master has received a byte from the slave
case I2C_EVENT_MASTER_BYTE_RECEIVED:
case I2C_EVENT_MASTER_BYTE_RECEIVED:
// some bytes have to be received
if (Rx_Idx < I2C_RxBufferSize)
{ // copy received byte from the data register to the rx-buffer
366,7 → 366,7
crc += I2C_PrimRxBuffer[Rx_Idx];
}
// if the last byte (crc) was received
else if ( Rx_Idx == I2C_RxBufferSize)
else if ( Rx_Idx == I2C_RxBufferSize)
{
// generate a STOP condition on the bus before reading data register
I2C_GenerateSTOP(I2C1, ENABLE);
385,7 → 385,7
DebugOut.Analog[14]++;
}
I2C_State = I2C_IDLE;
LED_GRN_OFF;
LED_GRN_OFF;
}
Rx_Idx++;
// if the 2nd last byte was received disable acknowledge for the last one
394,7 → 394,7
I2C_AcknowledgeConfig (I2C1, DISABLE);
}
break;
 
default:
break;
}
413,7 → 413,7
// set pointers to data area with respect to the command id
switch (command)
{
case I2C_CMD_VERSION:
case I2C_CMD_VERSION:
I2C_RxBuffer = (u8 *)&MK3MAG_Version;
I2C_RxBufferSize = sizeof(MK3MAG_Version);
I2C_TxBuffer = NULL;
425,13 → 425,13
I2C_TxBuffer = (u8 *)&I2C_WriteCal;
I2C_TxBufferSize = sizeof(I2C_WriteCal);
break;
case I2C_CMD_READ_MAG:
case I2C_CMD_READ_MAG:
I2C_RxBuffer = (u8 *)&I2C_Mag;
I2C_RxBufferSize = sizeof(I2C_Mag);
I2C_TxBuffer = NULL;
I2C_TxBufferSize = 0;
break;
case I2C_CMD_READ_HEADING:
case I2C_CMD_READ_HEADING:
DebugOut.Analog[10] = I2C_Heading.Heading;
I2C_RxBuffer = (u8 *)&I2C_Heading;
I2C_RxBufferSize = sizeof(I2C_Heading);
452,14 → 452,11
I2C_ITConfig(I2C1, ENABLE);
// set direction to master transmitter
I2C_Direction = I2C_MODE_TRANSMITTER;
// test on busy flag and clear it
// test on busy flag and clear it
I2C_CheckEvent( I2C1, I2C_FLAG_BUSY );
// initiale start condition on the bus
// initiale start condition on the bus
I2C_GenerateStart(I2C1, ENABLE);
// to be continued in the I2C1_IRQHandler() above
 
}
 
//----------------------------------------------------------------
466,7 → 463,7
void I2C1_GetMK3MagVersion(void)
{
u8 msg[64];
u8 repeat = 10;
u8 repeat = 10;
 
MK3MAG_Version.Major = 0xFF;
MK3MAG_Version.Minor = 0xFF;
475,19 → 472,19
 
while ((MK3MAG_Version.Major == 0xFF) && (repeat != 0))
{
I2C1_SendCommand(I2C_CMD_VERSION);
I2C1_Timeout = SetDelay(500);
I2C1_SendCommand(I2C_CMD_VERSION);
I2C1_Timeout = SetDelay(500);
while (!CheckDelay(I2C1_Timeout)) if (MK3MAG_Version.Major != 0xFF) break;
repeat--;
}
 
if (MK3MAG_Version.Major != 0xFF)
{
{
sprintf(msg, "\n\r MK3Mag V%d.%d%c", MK3MAG_Version.Major, MK3MAG_Version.Minor, 'a' + MK3MAG_Version.Patch);
SerialPutString(msg);
SerialPutString(msg);
sprintf(msg, " Compatible: %d", MK3MAG_Version.Compatible);
SerialPutString(msg);
SerialPutString(msg);
}
else SerialPutString("\n\rNo version information from MK3Mag.");
else SerialPutString("\n\rNo version information from MK3Mag.");
 
}
/trunk/main.c
78,7 → 78,7
{
LOGFILE_IDLE,
LOGFILE_START,
LOGFILE_CLOSED,
LOGFILE_CLOSED,
LOGFILE_OPENED,
LOGFILE_ERROR,
} logfilestate_t;
224,7 → 224,7
int main(void)
{
KML_Document_t gpslogfile;
logfilestate_t logfilestate = LOGFILE_IDLE;
logfilestate_t logfilestate = LOGFILE_IDLE;
s8* gpslogfilename = NULL;
/* Configure the system clocks */
SCU_Config();
282,7 → 282,7
/*
ReadSetting(1);
*/
SerialPutString("\r\n---------------------------------------------\r\n\r\n ");
SerialPutString("\r\n---------------------------------------------\r\n\r\n");
 
for (;;)
{
342,16 → 342,18
{
TimerKmlAddPointDelay = SetDelay(500); // every 500 ms
 
if(FC.MKFlags & MKFLAG_MOTOR_RUN)
if(FC.MKFlags & MKFLAG_MOTOR_RUN)
{
switch(logfilestate)
{
case LOGFILE_IDLE:
case LOGFILE_CLOSED:
if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D) && (FC.MKFlags & MKFLAG_FLY))
logfilestate = LOGFILE_START;
break;
case LOGFILE_START:
if((GPSData.Status != INVALID) && (GPSData.Flags & FLAG_GPSFIXOK) && (GPSData.SatFix == SATFIX_3D) && (FC.MKFlags & MKFLAG_FLY))
{
logfilestate = LOGFILE_START;
}
break;
case LOGFILE_START:
// find unused logfile name
do
{ // try to generate a new logfile name
390,7 → 392,7
logfilestate = LOGFILE_ERROR;
}
else DebugOut.Analog[26]++; // count SD-Logs
}
}
break;
 
case LOGFILE_ERROR:
407,7 → 409,7
}
break;
 
default:
default:
break;
}
} // EOF model is flying
/trunk/spi_slave.c
138,29 → 138,29
// copy contents of ToFlightCtrl->SPI_TxBuffer
memcpy( (u8 *) &(SPI_TxBuffer[2]), (u8 *) &ToFlightCtrl, sizeof(ToFlightCtrl));
}
}
// while RxFIFO not empty
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty) == SET)
{
}
// while RxFIFO not empty
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_RxFifoNotEmpty) == SET)
{
rxdata = SSP0->DR; // catch the received byte
// Fill TxFIFO while its not full or end of packet is reached
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
while (SSP_GetFlagStatus(SSP0, SSP_FLAG_TxFifoNotFull) == SET)
{
if (SPI_TxBufferIndex < SPI_TXBUFFER_LEN) // still data to send ?
{
if (SPI_TxBufferIndex < SPI_TXBUFFER_LEN) // still data to send ?
{
SSP0->DR = SPI_TxBuffer[SPI_TxBufferIndex]; // send a byte
*Ptr_TxChksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum
SPI_TxBufferIndex++; // pointer to next byte
}
else // end of packet is reached reset and copy data to tx buffer
{
SPI_TxBufferIndex = 0; // reset buffer index
ToFlightCtrl.Chksum = 0; // initialize checksum
ToFlightCtrl.BeepTime = BeepTime; // set beeptime
BeepTime = 0; // reset local beeptime
*Ptr_TxChksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum
SPI_TxBufferIndex++; // pointer to next byte
}
else // end of packet is reached reset and copy data to tx buffer
{
SPI_TxBufferIndex = 0; // reset buffer index
ToFlightCtrl.Chksum = 0; // initialize checksum
ToFlightCtrl.BeepTime = BeepTime; // set beeptime
BeepTime = 0; // reset local beeptime
// copy contents of ToFlightCtrl->SPI_TxBuffer
memcpy((u8 *) &(SPI_TxBuffer[2]), (u8 *) &ToFlightCtrl, sizeof(ToFlightCtrl));
}
memcpy((u8 *) &(SPI_TxBuffer[2]), (u8 *) &ToFlightCtrl, sizeof(ToFlightCtrl));
}
}
switch (SPI_State)
{
172,7 → 172,7
SPI_State = SPI_SYNC2; // step to sync2
}
break;
case SPI_SYNC2:
case SPI_SYNC2:
if (rxdata == SPI_RXSYNCBYTE2)
{ // 2nd Syncbyte ok
rxchksum += rxdata;
324,7 → 324,7
FC.UBat = FromFlightCtrl.Param.Byte[9];
Parameter.LowVoltageWarning = FromFlightCtrl.Param.Byte[10];
Parameter.ActiveSetting = FromFlightCtrl.Param.Byte[11];
DebugOut.Analog[5] = FC.MKFlags;
DebugOut.Analog[5] = FC.MKFlags;
break;
 
#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;}
365,11 → 365,11
fifo_put(&CompassCalcStateFiFo, CompassCalState);
}
Parameter.NaviPH_LoginTime = FromFlightCtrl.Param.Byte[1];
NaviData.Variometer = (NaviData.Variometer + 2 * ((s16) FromFlightCtrl.Param.Int[1] - NaviData.Altimeter)) / 2; // provisorisch
NaviData.Variometer = (NaviData.Variometer + 2 * ((s16) FromFlightCtrl.Param.Int[1] - NaviData.Altimeter)) / 2; // provisorisch
NaviData.Altimeter = (s16) FromFlightCtrl.Param.Int[1]; // is located at byte 2 and 3
CHK_POTI_MM(Parameter.NaviGpsPLimit,FromFlightCtrl.Param.Byte[4],0,255);
CHK_POTI_MM(Parameter.NaviGpsILimit,FromFlightCtrl.Param.Byte[5],0,255);
CHK_POTI_MM(Parameter.NaviGpsDLimit,FromFlightCtrl.Param.Byte[6],0,255);
CHK_POTI_MM(Parameter.NaviGpsPLimit,FromFlightCtrl.Param.Byte[4],0,255);
CHK_POTI_MM(Parameter.NaviGpsILimit,FromFlightCtrl.Param.Byte[5],0,255);
CHK_POTI_MM(Parameter.NaviGpsDLimit,FromFlightCtrl.Param.Byte[6],0,255);
break;
 
case SPI_CMD_VERSION:
395,10 → 395,10
DebugOut.Analog[2] = FromFlightCtrl.AccNick;
DebugOut.Analog[3] = FromFlightCtrl.AccRoll;
DebugOut.Analog[11] = FromFlightCtrl.GyroHeading/10;// in deg
Data3D.AngleNick = FromFlightCtrl.AngleNick; // in 0.1 deg
Data3D.AngleRoll = FromFlightCtrl.AngleRoll; // in 0.1 deg
Data3D.Heading = FromFlightCtrl.GyroHeading; // in 0.1 deg
} // EOF if(SPI_RxBuffer_Request)
Data3D.AngleNick = FromFlightCtrl.AngleNick; // in 0.1 deg
Data3D.AngleRoll = FromFlightCtrl.AngleRoll; // in 0.1 deg
Data3D.Heading = FromFlightCtrl.GyroHeading; // in 0.1 deg
} // EOF if(SPI_RxBuffer_Request)
}
 
//------------------------------------------------------