diff --git a/conf/modules/ins_chimu_spi.xml b/conf/modules/ins_chimu_spi.xml
index 953c253232..cfced9f4c7 100644
--- a/conf/modules/ins_chimu_spi.xml
+++ b/conf/modules/ins_chimu_spi.xml
@@ -6,7 +6,7 @@
-
+
diff --git a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c
index e4397b34f7..c7ac320e07 100644
--- a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c
+++ b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.c
@@ -38,6 +38,8 @@
/* High Speed SPI Slave Circular Buffer */
uint16_t spi_slave_hs_rx_insert_idx, spi_slave_hs_rx_extract_idx;
uint8_t spi_slave_hs_rx_buffer[SPI_SLAVE_HS_RX_BUFFER_SIZE];
+uint16_t spi_slave_hs_tx_insert_idx, spi_slave_hs_tx_extract_idx;
+uint8_t spi_slave_hs_tx_buffer[SPI_SLAVE_HS_TX_BUFFER_SIZE];
/* Prototypes */
// void spi_init( void ); // -> declared in spi.h
@@ -133,8 +135,21 @@ void spi_init(void) {
static void SSP_ISR(void) {
ISR_ENTRY();
- LED_TOGGLE(3);
+ //LED_TOGGLE(3);
+ // If any TX bytes are pending
+ if (spi_slave_hs_tx_insert_idx != spi_slave_hs_tx_extract_idx)
+ {
+ uint8_t ret = spi_slave_hs_tx_buffer[spi_slave_hs_tx_extract_idx];
+ spi_slave_hs_tx_extract_idx = (spi_slave_hs_tx_extract_idx + 1)%SPI_SLAVE_HS_RX_BUFFER_SIZE;
+ SSP_Write(ret);
+ }
+ else
+ {
+ SSP_Write(0x00);
+ }
+
+
//do
{
uint16_t temp;
diff --git a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.h b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.h
index ef73da3a5f..8794123fe8 100644
--- a/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.h
+++ b/sw/airborne/arch/lpc21/mcu_periph/spi_slave_hs_arch.h
@@ -57,6 +57,19 @@ extern uint8_t spi_slave_hs_rx_buffer[SPI_SLAVE_HS_RX_BUFFER_SIZE];
ret; \
})
+#define SPI_SLAVE_HS_TX_BUFFER_SIZE 128
+
+extern uint16_t spi_slave_hs_tx_insert_idx, spi_slave_hs_tx_extract_idx;
+extern uint8_t spi_slave_hs_tx_buffer[SPI_SLAVE_HS_TX_BUFFER_SIZE];
+
+#define SpiSlaveTransmit(data) {\
+ uint16_t temp = (spi_slave_hs_tx_insert_idx + 1) % SPI_SLAVE_HS_TX_BUFFER_SIZE; \
+ if (temp != spi_slave_hs_tx_extract_idx) /* there is room left */ \
+ { \
+ spi_slave_hs_tx_buffer[spi_slave_hs_tx_insert_idx] = (uint8_t)data; \
+ spi_slave_hs_tx_insert_idx = temp; \
+ } \
+}
diff --git a/sw/airborne/modules/ins/ins_chimu_spi.c b/sw/airborne/modules/ins/ins_chimu_spi.c
index 2fff4457f8..978b4456c2 100644
--- a/sw/airborne/modules/ins/ins_chimu_spi.c
+++ b/sw/airborne/modules/ins/ins_chimu_spi.c
@@ -35,17 +35,44 @@ INS_FORMAT ins_pitch_neutral;
volatile uint8_t new_ins_attitude;
+#define INS_LINK SpiSlave
+
void ins_init( void )
{
+ uint8_t rate[12] = {0xae, 0xae, 0x06, 0xaa, 0x10, 0x05, 0xff, 0x79, 0x00, 0x00, 0xab, 0x76 }; // 50Hz attitude only + SPI
+// uint8_t rate[12] = {0xae, 0xae, 0x06, 0xaa, 0x10, 0x04, 0xff, 0x79, 0x00, 0x00, 0xab, 0xd3 }; // 25Hz attitude only + SPI
+// uint8_t euler[7] = {0xae, 0xae, 0x01, 0xaa, 0x09, 0x00, 0xaf }; // 25Hz attitude only + SPI
+ uint8_t quaternions[7] = {0xae, 0xae, 0x01, 0xaa, 0x09, 0x01, 0x39 }; // 25Hz attitude only + SPI
+
+ new_ins_attitude = 0;
+
ins_roll_neutral = INS_ROLL_NEUTRAL_DEFAULT;
ins_pitch_neutral = INS_PITCH_NEUTRAL_DEFAULT;
- new_ins_attitude= 0;
CHIMU_Init(&CHIMU_DATA);
-
+
+ // Quat Filter
+ for (int i=0;i<7;i++)
+ {
+ InsSend1(quaternions[i]);
+ }
+ // Wait a second
+ InsSend1(0);
+ InsSend1(0);
+ InsSend1(0);
+ InsSend1(0);
+ InsSend1(0);
+
+ // 50Hz data: attitude only
+ for (int i=0;i<12;i++)
+ {
+ InsSend1(rate[i]);
+ }
+
}
-#define INS_LINK SpiSlave
+
+//float tempang = 0;
void parse_ins_msg( void )
{
@@ -64,8 +91,9 @@ void parse_ins_msg( void )
{
CHIMU_DATA.m_attitude.euler.phi -= 2 * M_PI;
}
- /*
- if (CHIMU_DATA.m_attitude.euler.phi == tempang)
+
+ LED_TOGGLE(3);
+/* if (CHIMU_DATA.m_attitude.euler.phi == tempang)
{
LED_ON(3);
}
@@ -74,12 +102,12 @@ void parse_ins_msg( void )
LED_OFF(3);
}
tempang = CHIMU_DATA.m_attitude.euler.phi;
- */
+*/
EstimatorSetAtt(CHIMU_DATA.m_attitude.euler.phi, CHIMU_DATA.m_attitude.euler.psi, CHIMU_DATA.m_attitude.euler.theta);
//EstimatorSetRate(ins_p,ins_q);
//DOWNLINK_SEND_AHRS_EULER(DefaultChannel, &CHIMU_DATA.m_attitude.euler.phi, &CHIMU_DATA.m_attitude.euler.theta, &CHIMU_DATA.m_attitude.euler.psi);
-
+
}
}
}
@@ -89,6 +117,13 @@ void parse_ins_msg( void )
//Frequency defined in conf *.xml
void ins_periodic_task( void )
{
+ // Send Centripetal Corrections
+ uint8_t quaternions[7] = {0xae, 0xae, 0x01, 0xaa, 0x09, 0x01, 0x39 }; // 25Hz attitude only + SPI
+ for (int i=0;i<7;i++)
+ {
+ InsSend1(quaternions[i]);
+ }
+
// Downlink Send
}
diff --git a/sw/airborne/modules/ins/ins_module.h b/sw/airborne/modules/ins/ins_module.h
index 0aefdc2e20..aaa8bd1a36 100644
--- a/sw/airborne/modules/ins/ins_module.h
+++ b/sw/airborne/modules/ins/ins_module.h
@@ -84,7 +84,8 @@ void parse_ins_buffer( uint8_t );
#define InsBuffer() InsLink(ChAvailable())
#define ReadInsBuffer() { while (InsLink(ChAvailable())&&!ins_msg_received) parse_ins_buffer(InsLink(Getch())); }
-#define InsUartSend1(c) InsLink(Transmit(c))
+#define InsSend1(c) InsLink(Transmit(c))
+#define InsUartSend1(c) InsSend1(c)
#define InsUartInitParam(_a,_b,_c) InsLink(InitParam(_a,_b,_c))
#define InsUartRunning InsLink(TxRunning)