diff --git a/include/ADXL345_accel.h b/include/ADXL345_accel.h deleted file mode 100644 index d9a2ba199fd8d45fba6dd8e11afb549cc73190b4..0000000000000000000000000000000000000000 --- a/include/ADXL345_accel.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef ADXL345_ACCEL_H -#define ADXL345_ACCEL_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stm32f4xx.h" - -// public functions -void imu_accel_get_config(void); -void imu_accel_start(void); -void imu_accel_stop(void); -void imu_accel_get_data(void); -void imu_accel_set_config(void); -uint8_t imu_accel_detect(void); -void imu_accel_process_data(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/HMC5843_compass.h b/include/HMC5843_compass.h deleted file mode 100644 index 2a24978ccb6f059e18b083a1a9359fdcc6648025..0000000000000000000000000000000000000000 --- a/include/HMC5843_compass.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _HMC5843_compass_h -#define _HMC5843_compass_h - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stm32f4xx.h" - -uint8_t imu_compass_detect(void); -void imu_compass_get_config(void); -void imu_compass_start(void); -void imu_compass_stop(void); -void imu_compass_get_data(void); -void imu_compass_set_config(void); -void imu_compass_process_data(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/ITG3200_gyro.h b/include/ITG3200_gyro.h deleted file mode 100644 index 6540e77a62fb325aa86933971f586ba26721b6ed..0000000000000000000000000000000000000000 --- a/include/ITG3200_gyro.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _ITG3200_GYRO_H -#define _ITG3200_GYRO_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stm32f4xx.h" - -// public functions -uint8_t imu_gyro_detect(void); -void imu_gyro_get_config(void); -void imu_gyro_start(void); -void imu_gyro_stop(void); -void imu_gyro_get_data(void); -void imu_gyro_set_config(void); -void imu_gyro_process_data(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/imu_9dof_dma.h b/include/imu_9dof_dma.h deleted file mode 100644 index 6b22fb67a6128c2d4c1f84143a30b21328393190..0000000000000000000000000000000000000000 --- a/include/imu_9dof_dma.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _IMU_9DOF_DMA_H -#define _IMU_9DOF_DMA_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stm32f4xx.h" - -// general IMU public functions -void imu_init(void); -void imu_start(void); -void imu_stop(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/include/imu_int.h b/include/imu_int.h deleted file mode 100644 index 32b77838eac40835c12477d7249cd1dc3478b8dd..0000000000000000000000000000000000000000 --- a/include/imu_int.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef _IMU_INT_H -#define _IMU_INT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define I2C_IMU_DMA DMA1 -#define I2C_IMU_DMA_CHANNEL DMA_Channel_3 -#define I2C_IMU_DR_ADDRESS ((uint32_t)I2C3+0x10) -#define I2C_IMU_DMA_STREAM_TX DMA1_Stream4 -#define I2C_IMU_DMA_STREAM_RX DMA1_Stream2 -#define I2C_IMU_TX_DMA_TCFLAG DMA_FLAG_TCIF4 -#define I2C_IMU_TX_DMA_FEIFLAG DMA_FLAG_FEIF4 -#define I2C_IMU_TX_DMA_DMEIFLAG DMA_FLAG_DMEIF4 -#define I2C_IMU_TX_DMA_TEIFLAG DMA_FLAG_TEIF4 -#define I2C_IMU_TX_DMA_HTIFLAG DMA_FLAG_HTIF4 -#define I2C_IMU_RX_DMA_TCFLAG DMA_FLAG_TCIF2 -#define I2C_IMU_RX_DMA_FEIFLAG DMA_FLAG_FEIF2 -#define I2C_IMU_RX_DMA_DMEIFLAG DMA_FLAG_DMEIF2 -#define I2C_IMU_RX_DMA_TEIFLAG DMA_FLAG_TEIF2 -#define I2C_IMU_RX_DMA_HTIFLAG DMA_FLAG_HTIF2 -#define DMA_IMU_CLK RCC_AHB1Periph_DMA1 - -#define I2C_IMU_TX_DMA_IRQn DMA1_Stream4_IRQn -#define I2C_IMU_RX_DMA_IRQn DMA1_Stream2_IRQn -#define I2C_IMU_TX_DMA_IRQHandler DMA1_Stream4_IRQHandler -#define I2C_IMU_RX_DMA_IRQHandler DMA1_Stream2_IRQHandler - -#define I2C_IMU I2C3 -#define I2C_IMU_CLK RCC_APB1Periph_I2C3 -#define I2C_IMU_SDA_GPIO_CLK RCC_AHB1Periph_GPIOC -#define I2C_IMU_SDA_PIN GPIO_Pin_9 -#define I2C_IMU_SDA_GPIO_PORT GPIOC -#define I2C_IMU_SDA_SOURCE GPIO_PinSource9 -#define I2C_IMU_SDA_AF GPIO_AF_I2C3 - -#define I2C_IMU_SCL_GPIO_CLK RCC_AHB1Periph_GPIOA -#define I2C_IMU_SCL_PIN GPIO_Pin_8 -#define I2C_IMU_SCL_GPIO_PORT GPIOA -#define I2C_IMU_SCL_SOURCE GPIO_PinSource8 -#define I2C_IMU_SCL_AF GPIO_AF_I2C3 - -#define I2C_IMU_EV_IRQn I2C3_EV_IRQn -#define I2C_IMU_ER_IRQn I2C3_ER_IRQn -#define I2C_IMU_EV_IRQHandler I2C3_EV_IRQHandler -#define I2C_IMU_ER_IRQHandler I2C3_ER_IRQHandler - -#define IMU_TIMER TIM4 -#define IMU_TIMER_IRQn TIM4_IRQn -#define IMU_TIMER_IRQHandler TIM4_IRQHandler -#define IMU_TIMER_CLK RCC_APB1Periph_TIM4 - -typedef enum {I2C_OP_DONE,I2C_WR_OP,I2C_RD_OP_CMD,I2C_RD_OP_DATA} i2c_op_t; -typedef enum {IMU_GET_ACCEL,IMU_GET_GYRO,IMU_GET_COMPASS} imu_state_t; - -// I2C private variables -extern volatile uint8_t i2c_error; -extern volatile i2c_op_t i2c_op; -extern uint8_t i2c_rd_addr; -extern uint8_t i2c_wr_addr; -extern uint8_t i2c_data_out[32]; -// dma initialization structures; -extern DMA_InitTypeDef IMU_DMA_TX_InitStructure; -extern DMA_InitTypeDef IMU_DMA_RX_InitStructure; - -// private functions -void imu_wait_op_done(void); -uint8_t imu_is_op_done(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/ADXL345_accel.c b/src/ADXL345_accel.c deleted file mode 100644 index 1251cb34ddc635a46a4ddf88976b078338de7af2..0000000000000000000000000000000000000000 --- a/src/ADXL345_accel.c +++ /dev/null @@ -1,220 +0,0 @@ -#include "ADXL345_accel.h" -#include "imu_int.h" -#include "ram.h" - -// accelerometer registers -#define ACCEL_THRESH_TAP 0x1D -#define ACCEL_OFSX 0x1E -#define ACCEL_OFSY 0x1F -#define ACCEL_OFSZ 0x20 -#define ACCEL_DUR 0x21 -#define ACCEL_LATENT 0x22 -#define ACCEL_WINDOW 0x23 -#define ACCEL_THRESH_ACT 0x24 -#define ACCEL_THRESH_INACT 0x25 -#define ACCEL_TIME_INACT 0x26 -#define ACCEL_ACT_INACT_CTL 0x27 -#define ACCEL_THRESH_FF 0x28 -#define ACCEL_TIME_FF 0x29 -#define ACCEL_TAP_AXES 0x2A -#define ACCEL_ACT_TAP_STATUS 0x2B -#define ACCEL_BW_RATE 0x2C -#define ACCEL_POWER_CTL 0x2D -#define ACCEL_INT_ENABLE 0x2E -#define ACCEL_INT_MAP 0x2F -#define ACCEL_INT_SOURCE 0x30 -#define ACCEL_DATA_FORMAT 0x31 - -// accelerometer configuration data -#define ACCEL_RATE_3200HZ 0x0F -#define ACCEL_RATE_1600HZ 0x0E -#define ACCEL_RATE_800HZ 0x0D -#define ACCEL_RATE_400HZ 0x0C -#define ACCEL_RATE_200HZ 0x0B -#define ACCEL_RATE_100HZ 0x0A -#define ACCEL_RATE_50HZ 0x09 -#define ACCEL_RATE_25HZ 0x08 -#define ACCEL_RATE_12_5HZ 0x07 -#define ACCEL_RATE_6_25HZ 0x06 - -#define ACCEL_ENABLE_LINK 0x20 -#define ACCEL_ENABLE_AUTOSLEEP 0x10 -#define ACCEL_ENABLE_MEASURE 0x08 -#define ACCEL_ENABLE_SLEEP 0x04 -#define ACCEL_SLEEP_8HZ 0x00 -#define ACCEL_SLEEP_4HZ 0x01 -#define ACCEL_SLEEP_2HZ 0x02 -#define ACCEL_SLEEP_1HZ 0x03 - -#define ACCEL_ENABLE_FULL_RES 0x08 -#define ACCEL_JUSTIFY_LEFT 0x04 -#define ACCEL_JUSTIFY_RIGHT 0x00 -#define ACCEL_RANGE_2G 0x00 -#define ACCEL_RANGE_4G 0x01 -#define ACCEL_RANGE_8G 0x02 -#define ACCEL_RANGE_16G 0x03 - -#define ACCEL_FIFO_BYPASS 0x00 -#define ACCEL_FIFO_BUFFER 0x40 -#define ACCEL_FIFO_STREAM 0x80 -#define ACCEL_FIFO_TRIGGER 0xC0 - -// private variables -// accelerometer data and configuration -const uint8_t accel_id_reg=0x00; -const uint8_t accel_id=0xE5; -const uint8_t accel_id_len=0x01; -const uint8_t accel_conf_reg=0x1D; -const uint8_t accel_conf_len=0x15; -const uint8_t accel_data_reg=0x32; -const uint8_t accel_data_len=0x06; -const uint8_t accel_fifo_reg=0x38; -const uint8_t accel_fifo_len=0x01; -const uint8_t accel_status_reg=0x39; -const uint8_t accel_status_len=0x01; -const uint8_t accel_rd_addr=0xA6; -const uint8_t accel_wr_addr=0xA7; -uint8_t i2c_accel_conf[21]; -uint8_t i2c_accel_fifo_conf; -uint8_t i2c_accel_data[6]; -uint8_t i2c_accel_status; - -// public accelerometer functions -void imu_accel_get_config(void) -{ - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=accel_conf_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)i2c_accel_conf; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&accel_conf_reg; - - i2c_rd_addr=accel_rd_addr; - i2c_wr_addr=accel_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_accel_start(void) -{ - // enter measure mode - i2c_accel_conf[ACCEL_POWER_CTL-ACCEL_THRESH_TAP]|=ACCEL_ENABLE_MEASURE; - i2c_data_out[0]=ACCEL_POWER_CTL; - i2c_data_out[1]=i2c_accel_conf[ACCEL_POWER_CTL-ACCEL_THRESH_TAP]; - // write the fifo configuration - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=2; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=accel_rd_addr; - i2c_wr_addr=accel_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_accel_stop(void) -{ - // enter measure mode - i2c_accel_conf[ACCEL_POWER_CTL-ACCEL_THRESH_TAP]&=~ACCEL_ENABLE_MEASURE; - i2c_data_out[0]=ACCEL_POWER_CTL; - i2c_data_out[1]=i2c_accel_conf[ACCEL_POWER_CTL-ACCEL_THRESH_TAP]; - // write the fifo configuration - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=2; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=accel_rd_addr; - i2c_wr_addr=accel_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_accel_get_data(void) -{ - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=accel_data_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)i2c_accel_data; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&accel_data_reg; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=accel_rd_addr; - i2c_wr_addr=accel_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); -} - -void imu_accel_set_config(void) -{ - uint8_t i; - - // set the configuration - i2c_accel_conf[ACCEL_BW_RATE-ACCEL_THRESH_TAP]|=ACCEL_RATE_100HZ; - i2c_accel_conf[ACCEL_DATA_FORMAT-ACCEL_THRESH_TAP]&=0xF0; - i2c_accel_conf[ACCEL_DATA_FORMAT-ACCEL_THRESH_TAP]|=ACCEL_RANGE_8G;// +/-8g range - i2c_accel_conf[ACCEL_DATA_FORMAT-ACCEL_THRESH_TAP]|=ACCEL_JUSTIFY_RIGHT;// justify right - i2c_accel_conf[ACCEL_DATA_FORMAT-ACCEL_THRESH_TAP]|=ACCEL_ENABLE_FULL_RES;// enable full resolution according to the range - // write the configuration - for(i=0;i<accel_conf_len;i++) - i2c_data_out[i+1]=i2c_accel_conf[i]; - i2c_data_out[0]=accel_conf_reg; - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=accel_conf_len+1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=accel_rd_addr; - i2c_wr_addr=accel_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); - - // set the fifo configuration - i2c_accel_fifo_conf=ACCEL_FIFO_STREAM; - i2c_data_out[0]=accel_fifo_reg; - i2c_data_out[1]=i2c_accel_fifo_conf; - // write the fifo configuration - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=accel_fifo_len+1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=accel_rd_addr; - i2c_wr_addr=accel_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -uint8_t imu_accel_detect(void) -{ - i2c_accel_data[0]=0x00; - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=accel_id_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)i2c_accel_data; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&accel_id_reg; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=accel_rd_addr; - i2c_wr_addr=accel_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); - if(i2c_accel_data[0]==accel_id) - { - imu_accel_get_config(); - imu_accel_set_config(); - return 0x01; - } - else - return 0x00; -} - -void imu_accel_process_data(void) -{ - uint8_t i; - int16_t value; - - for(i=0;i<3;i++) - { - value=((int16_t)(i2c_accel_data[i*2]+(i2c_accel_data[i*2+1]<<8)))<<2; - ram_data[BIOLOID_IMU_ACCEL_X_L+i*2]=value&0xFF; - ram_data[BIOLOID_IMU_ACCEL_X_H+i*2]=(value>>8); - } -} - diff --git a/src/HMC5843_compass.c b/src/HMC5843_compass.c deleted file mode 100644 index fbda706a87462ecce13c4bf0ef5e35f7fe3671b9..0000000000000000000000000000000000000000 --- a/src/HMC5843_compass.c +++ /dev/null @@ -1,181 +0,0 @@ -#include "HMC5843_compass.h" -#include "imu_int.h" -#include "ram.h" - -// compass registers -#define COMPASS_CONF_A 0x00 -#define COMPASS_CONF_B 0x01 -#define COMPASS_MODE 0x02 -#define COMPASS_STATUS 0x09 -#define COMPASS_IDA 0x0A -#define COMPASS_IDB 0x0B -#define COMPASS_IDC 0x0C - -// configuration values -#define COMPASS_DATA_RATE_0_5 0x00 -#define COMPASS_DATA_RATE_1 0x04 -#define COMPASS_DATA_RATE_2 0x08 -#define COMPASS_DATA_RATE_5 0x0C -#define COMPASS_DATA_RATE_10 0x10 -#define COMPASS_DATA_RATE_20 0x14 -#define COMPASS_DATA_RATE_50 0x18 - -#define COMPASS_NO_BIAS 0x00 -#define COMPASS_POS_BIAS 0x01 -#define COMPASS_NEG_BIAS 0x02 - -#define COMPASS_FS_0_7 0x00 -#define COMPASS_FS_1 0x20 -#define COMPASS_FS_1_5 0x40 -#define COMPASS_FS_2 0x60 -#define COMPASS_FS_3_2 0x80 -#define COMPASS_FS_3_8 0xA0 -#define COMPASS_FS_4_5 0xC0 -#define COMPASS_FS_6_5 0xE0 - -#define COMPASS_CONT_MODE 0x00 -#define COMPASS_SINGLE_MODE 0x01 -#define COMPASS_IDLE_MODE 0x02 -#define COMPASS_SLEEP_MODE 0x03 - -// compass data adn configuration -const uint8_t compass_id_reg=0x0A; -const uint8_t compass_id[3]={'H','4','3'}; -const uint8_t compass_id_len=0x03; -const uint8_t compass_conf_reg=0x00; -const uint8_t compass_conf_len=0x03; -const uint8_t compass_data_reg=0x03; -const uint8_t compass_data_len=0x06; -const uint8_t compass_status_reg=0x09; -const uint8_t compass_status_len=0x01; -const uint8_t compass_rd_addr=0x3D; -const uint8_t compass_wr_addr=0x3C; -uint8_t i2c_compass_conf[3]; -uint8_t i2c_compass_data[6]; - -// compass public functions -uint8_t imu_compass_detect(void) -{ - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=compass_id_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_compass_data; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&compass_id_reg; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_compass_data[0]=0x00; - i2c_compass_data[1]=0x00; - i2c_compass_data[2]=0x00; - i2c_rd_addr=compass_rd_addr; - i2c_wr_addr=compass_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - - imu_wait_op_done(); - if(i2c_compass_data[0]==compass_id[0] && i2c_compass_data[1]==compass_id[1] && i2c_compass_data[2]==compass_id[2]) - { - imu_compass_get_config(); - imu_compass_set_config(); - return 0x01; - } - else - return 0x00; -} - -void imu_compass_get_config(void) -{ - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=compass_conf_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)i2c_compass_conf; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&compass_conf_reg; - i2c_rd_addr=compass_rd_addr; - i2c_wr_addr=compass_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_compass_start(void) -{ - // enter measure mode - i2c_compass_conf[COMPASS_MODE-COMPASS_CONF_A]=COMPASS_CONT_MODE; - i2c_data_out[0]=COMPASS_MODE; - i2c_data_out[1]=i2c_compass_conf[COMPASS_MODE-COMPASS_CONF_A]; - // write the fifo configuration - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=2; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=compass_rd_addr; - i2c_wr_addr=compass_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_compass_stop(void) -{ - // enter measure mode - i2c_compass_conf[COMPASS_MODE-COMPASS_CONF_A]=COMPASS_SLEEP_MODE; - i2c_data_out[0]=COMPASS_MODE; - i2c_data_out[1]=i2c_compass_conf[COMPASS_MODE-COMPASS_CONF_A]; - // write the fifo configuration - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=2; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=compass_rd_addr; - i2c_wr_addr=compass_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_compass_get_data(void) -{ - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=compass_data_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)i2c_compass_data; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&compass_data_reg; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=compass_rd_addr; - i2c_wr_addr=compass_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); -} - -void imu_compass_set_config(void) -{ - uint8_t i; - - // set the configuration - i2c_compass_conf[COMPASS_CONF_A-COMPASS_CONF_A]=COMPASS_DATA_RATE_50 | COMPASS_NO_BIAS; - i2c_compass_conf[COMPASS_CONF_B-COMPASS_CONF_A]=COMPASS_FS_1; - i2c_compass_conf[COMPASS_MODE-COMPASS_CONF_A]=COMPASS_SLEEP_MODE; - // write the configuration - for(i=0;i<compass_conf_len;i++) - i2c_data_out[i+1]=i2c_compass_conf[i]; - i2c_data_out[0]=compass_conf_reg; - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=compass_conf_len+1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=compass_rd_addr; - i2c_wr_addr=compass_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_compass_process_data(void) -{ - uint8_t i; - int16_t value; - - for(i=0;i<3;i++) - { - value=(((int16_t)(i2c_compass_data[i*2+1]+(i2c_compass_data[i*2]<<8)))<<13)/1300; - ram_data[BIOLOID_IMU_COMPASS_X_L+i*2]=value&0xFF; - ram_data[BIOLOID_IMU_COMPASS_X_H+i*2]=(value>>8); - } -} - - diff --git a/src/ITG3200_gyro.c b/src/ITG3200_gyro.c deleted file mode 100644 index 241c3ae6f291d6a46fb92e140fd565b485fb45dd..0000000000000000000000000000000000000000 --- a/src/ITG3200_gyro.c +++ /dev/null @@ -1,219 +0,0 @@ -#include "ITG3200_gyro.h" -#include "imu_int.h" -#include "ram.h" - -// gyroscope registers -#define GYRO_SMPL_DIV 0x15 -#define GYRO_CONFIG 0x16 -#define GYRO_INT_CONFIG 0x17 -#define GYRO_STATUS 0x1A -#define GYRO_POWER_MGM 0x3E - -// configuration data -#define GYRO_FS_2000 0x18 -#define GYRO_BW_256 0x00 -#define GYRO_BW_188 0x01 -#define GYRO_BW_98 0x02 -#define GYRO_BW_42 0x03 -#define GYRO_BW_20 0x04 -#define GYRO_BW_10 0x05 -#define GYRO_BW_5 0x06 - -#define GYRO_INT_ACTIVE_LOW 0x80 -#define GYRO_INT_ACTIVE_HIGH 0x00 -#define GYRO_INT_OPEN_DRAIN 0x40 -#define GYRO_INT_PUSH_PULL 0x00 -#define GYRO_INT_LATCH 0x20 -#define GYRO_INT_PULSE 0x00 -#define GYRO_INT_CLEAR_RD_ANY 0x10 -#define GYRO_INT_CLEAR_RD_STATUS 0x00 -#define GYRO_INT_DEVICE_READY 0x04 -#define GYRO_INT_DATA_READY 0x01 - -#define GYRO_INT_DEVICE_READY_FLAG 0x04 -#define GYRO_INT_DATA_READY_FLAG 0x01 - -#define GYRO_RESET 0x80 -#define GYRO_SLEEP_MODE 0x40 -#define GYRO_STBY_X 0x20 -#define GYRO_STBY_Y 0x10 -#define GYRO_STBY_Z 0x08 -#define GYRO_CLK_INT 0x00 -#define GYRO_CLK_PLL_X 0x01 -#define GYRO_CLK_PLL_Y 0x02 -#define GYRO_CLK_PLL_Z 0x03 -#define GYRO_CLK_PLL_32768 0x04 -#define GYRO_CLK_PLL_19_2M 0x05 - -// gyroscope data and configuration -const uint8_t gyro_id_reg=0x00; -const uint8_t gyro_id=0x68; -const uint8_t gyro_id_len=0x01; -const uint8_t gyro_conf_reg=0x15; -const uint8_t gyro_conf_len=0x03; -const uint8_t gyro_status_reg=0x1A; -const uint8_t gyro_status_len=0x01; -const uint8_t gyro_data_reg=0x1B; -const uint8_t gyro_data_len=0x08; -const uint8_t gyro_power_reg=0x3E; -const uint8_t gyro_power_len=0x01; -const uint8_t gyro_rd_addr=0xD0; -const uint8_t gyro_wr_addr=0xD1; -uint8_t i2c_gyro_conf[3]; -uint8_t i2c_gyro_data[8]; -uint8_t i2c_gyro_power_mgm; -uint8_t i2c_gyro_status; - -// gyroscope private functions -uint8_t imu_gyro_detect(void) -{ - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=gyro_id_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_gyro_data; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&gyro_id_reg; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_gyro_data[0]=0x00; - i2c_rd_addr=gyro_rd_addr; - i2c_wr_addr=gyro_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - - imu_wait_op_done(); - if((i2c_gyro_data[0]&0x7E)==gyro_id) - { - imu_gyro_get_config(); - imu_gyro_set_config(); - return 0x01; - } - else - return 0x00; -} - -void imu_gyro_get_config(void) -{ - /* read the configuration */ - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=gyro_conf_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)i2c_gyro_conf; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&gyro_conf_reg; - i2c_rd_addr=gyro_rd_addr; - i2c_wr_addr=gyro_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); - - /* read trhe power management */ - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=gyro_power_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)i2c_gyro_power_mgm; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&gyro_power_reg; - i2c_rd_addr=gyro_rd_addr; - i2c_wr_addr=gyro_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_gyro_start(void) -{ - // enter measure mode - i2c_gyro_power_mgm&=~(GYRO_SLEEP_MODE | GYRO_STBY_X | GYRO_STBY_Y | GYRO_STBY_Z); - i2c_data_out[0]=GYRO_POWER_MGM; - i2c_data_out[1]=i2c_gyro_power_mgm; - // write the fifo configuration - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=2; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=gyro_rd_addr; - i2c_wr_addr=gyro_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_gyro_stop(void) -{ - // enter measure mode - i2c_gyro_power_mgm|=(GYRO_SLEEP_MODE | GYRO_STBY_X | GYRO_STBY_Y | GYRO_STBY_Z); - i2c_data_out[0]=GYRO_POWER_MGM; - i2c_data_out[1]=i2c_gyro_power_mgm; - // write the fifo configuration - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=2; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=gyro_rd_addr; - i2c_wr_addr=gyro_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_gyro_get_data(void) -{ - i2c_op=I2C_RD_OP_CMD; - IMU_DMA_RX_InitStructure.DMA_BufferSize=gyro_data_len; - IMU_DMA_RX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)i2c_gyro_data; - DMA_Init(I2C_IMU_DMA_STREAM_RX,&IMU_DMA_RX_InitStructure); - IMU_DMA_TX_InitStructure.DMA_BufferSize=1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr=(uint32_t)&gyro_data_reg; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=gyro_rd_addr; - i2c_wr_addr=gyro_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); -} - -void imu_gyro_set_config(void) -{ - uint8_t i; - - // set the configuration - i2c_gyro_conf[GYRO_SMPL_DIV-GYRO_SMPL_DIV]=9;// 100 Hz - i2c_gyro_conf[GYRO_CONFIG-GYRO_SMPL_DIV]=GYRO_FS_2000 | GYRO_BW_188; - i2c_gyro_conf[GYRO_INT_CONFIG-GYRO_SMPL_DIV]=0x00;// no interrupts enabled - // write the configuration - for(i=0;i<gyro_conf_len;i++) - i2c_data_out[i+1]=i2c_gyro_conf[i]; - i2c_data_out[0]=gyro_conf_reg; - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=gyro_conf_len+1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=gyro_rd_addr; - i2c_wr_addr=gyro_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); - - // set the fifo configuration - i2c_gyro_power_mgm|=GYRO_CLK_INT; - i2c_data_out[0]=gyro_power_reg; - i2c_data_out[1]=i2c_gyro_power_mgm; - // write the fifo configuration - i2c_op=I2C_WR_OP; - IMU_DMA_TX_InitStructure.DMA_BufferSize=gyro_power_len+1; - IMU_DMA_TX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)i2c_data_out; - DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); - i2c_rd_addr=gyro_rd_addr; - i2c_wr_addr=gyro_wr_addr; - I2C_GenerateSTART(I2C_IMU, ENABLE); - imu_wait_op_done(); -} - -void imu_gyro_process_data(void) -{ - uint8_t i; - int16_t value; - - // process temperature - ram_data[BIOLOID_IMU_TEMP]=((((int16_t)(i2c_gyro_data[1]+(i2c_gyro_data[0]<<8)))-13200)/280)+35; - // process gyro data - for(i=0;i<3;i++) - { - value=(((int16_t)(i2c_gyro_data[i*2+3]+(i2c_gyro_data[i*2+2]<<8)))*7)/115;// format 12|4 - ram_data[BIOLOID_IMU_GYRO_X_L+i*2]=value&0xFF; - ram_data[BIOLOID_IMU_GYRO_X_H+i*2]=(value>>8); - } -} - diff --git a/src/imu_9dof_dma.c b/src/imu_9dof_dma.c deleted file mode 100644 index f6f237263cd3dc5a20bf281636cac2ccaa22020d..0000000000000000000000000000000000000000 --- a/src/imu_9dof_dma.c +++ /dev/null @@ -1,340 +0,0 @@ -#include "imu_9dof_dma.h" -#include "imu_int.h" -#include "ADXL345_accel.h" -#include "ITG3200_gyro.h" -#include "HMC5843_compass.h" -#include "ram.h" - -// I2C private variables -volatile uint8_t i2c_error; -volatile i2c_op_t i2c_op; -uint8_t i2c_rd_addr; -uint8_t i2c_wr_addr; -uint8_t i2c_data_out[32]; -uint8_t imu_stop_flag; -volatile uint8_t imu_stopped; -// dma initialization structures; -DMA_InitTypeDef IMU_DMA_TX_InitStructure; -DMA_InitTypeDef IMU_DMA_RX_InitStructure; - -// private functions -void imu_wait_op_done(void) -{ - while(i2c_op!=I2C_OP_DONE); -} - -uint8_t imu_is_op_done(void) -{ - if(i2c_op==I2C_OP_DONE) - return 0x01; - else - return 0x00; -} - -// interrupt handlers -void IMU_TIMER_IRQHandler(void) -{ - static imu_state_t state=IMU_GET_COMPASS; - uint16_t capture; - - if(TIM_GetITStatus(IMU_TIMER, TIM_IT_CC1)!=RESET) - { - TIM_ClearITPendingBit(IMU_TIMER,TIM_IT_CC1); - capture = TIM_GetCapture1(IMU_TIMER); - TIM_SetCompare1(IMU_TIMER, capture + 1000); - if(imu_is_op_done()) - { - if(imu_stop_flag==0x01) - { - // stop the timer to get the imu data - TIM_Cmd(IMU_TIMER, DISABLE); - TIM_ITConfig(IMU_TIMER, TIM_IT_CC1, DISABLE); - - ram_clear_bit(BIOLOID_IMU_STATUS,0); - imu_stop_flag=0x00; - imu_stopped=0x01; - } - else - { - switch(state) - { - case IMU_GET_ACCEL: imu_accel_get_data(); - imu_compass_process_data(); - state=IMU_GET_GYRO; - break; - case IMU_GET_GYRO: imu_gyro_get_data(); - imu_accel_process_data(); - state=IMU_GET_COMPASS; - break; - case IMU_GET_COMPASS: imu_compass_get_data(); - imu_gyro_process_data(); - state=IMU_GET_ACCEL; - break; - } - } - } - } -} - -void I2C_IMU_EV_IRQHandler(void) -{ - switch (I2C_GetLastEvent(I2C_IMU)) - { - /* Test on I2C1 EV5 and clear it */ - case I2C_EVENT_MASTER_MODE_SELECT: - if(i2c_op==I2C_RD_OP_DATA) - I2C_Send7bitAddress(I2C_IMU,i2c_rd_addr,I2C_Direction_Receiver); - else - I2C_Send7bitAddress(I2C_IMU,i2c_wr_addr,I2C_Direction_Transmitter); - break; - - /* Test on I2C1 EV6 and first EV8 and clear them */ - case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: - I2C_ITConfig(I2C_IMU, I2C_IT_EVT, DISABLE); - /* enable DMA transfer */ - I2C_DMACmd(I2C_IMU, ENABLE); - DMA_Cmd(I2C_IMU_DMA_STREAM_TX, ENABLE); - break; - - case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED: - I2C_ITConfig(I2C_IMU, I2C_IT_EVT, DISABLE); - /* enable DMA transfer */ - if(IMU_DMA_RX_InitStructure.DMA_BufferSize==1) - I2C_AcknowledgeConfig(I2C_IMU,DISABLE); - else - I2C_AcknowledgeConfig(I2C_IMU,ENABLE); - I2C_DMALastTransferCmd(I2C_IMU,ENABLE); - DMA_Cmd(I2C_IMU_DMA_STREAM_RX, ENABLE); - break; - - case I2C_EVENT_MASTER_BYTE_TRANSMITTED: - if(i2c_op==I2C_WR_OP) - { - i2c_op=I2C_OP_DONE; - I2C_GenerateSTOP(I2C_IMU, ENABLE); - } - break; - - default: - break; - } -} - -void I2C_IMU_ER_IRQHandler(void) -{ - if(I2C_GetFlagStatus(I2C_IMU,I2C_FLAG_AF)!=RESET) - { - i2c_error=0x01; - I2C_ClearFlag(I2C_IMU,I2C_FLAG_AF); - if(i2c_op==I2C_RD_OP_DATA) - DMA_Cmd(I2C_IMU_DMA_STREAM_RX, DISABLE); - else - DMA_Cmd(I2C_IMU_DMA_STREAM_TX, DISABLE); - I2C_DMACmd(I2C_IMU, DISABLE); - I2C_GenerateSTOP(I2C_IMU, ENABLE); - i2c_op=I2C_OP_DONE; - } - I2C_ClearITPendingBit(I2C_IMU,I2C_IT_ERR); -} - -void I2C_IMU_TX_DMA_IRQHandler(void) -{ - DMA_ClearFlag(I2C_IMU_DMA_STREAM_TX,I2C_IMU_TX_DMA_TCFLAG); - DMA_ClearITPendingBit(I2C_IMU_DMA_STREAM_TX,I2C_IMU_TX_DMA_TCFLAG); - I2C_ITConfig(I2C_IMU, I2C_IT_EVT, ENABLE); - if(i2c_op==I2C_RD_OP_CMD) - { - I2C_GenerateSTART(I2C_IMU, ENABLE); - i2c_op=I2C_RD_OP_DATA; - } -} - -void I2C_IMU_RX_DMA_IRQHandler(void) -{ - DMA_ClearFlag(I2C_IMU_DMA_STREAM_RX,I2C_IMU_RX_DMA_TCFLAG); - DMA_ClearITPendingBit(I2C_IMU_DMA_STREAM_RX,I2C_IMU_RX_DMA_TCFLAG); - I2C_ITConfig(I2C_IMU, I2C_IT_EVT, ENABLE); - I2C_GenerateSTOP(I2C_IMU, ENABLE); - i2c_op=I2C_OP_DONE; -} - -// public functions -void imu_init(void) -{ - uint8_t i; - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - TIM_OCInitTypeDef TIM_OCInitStructure; - GPIO_InitTypeDef GPIO_InitStructure; - NVIC_InitTypeDef NVIC_InitStructure; - I2C_InitTypeDef I2C_InitStructure; - - /* RCC Configuration */ - /*I2C Peripheral clock enable */ - RCC_APB1PeriphClockCmd(I2C_IMU_CLK, ENABLE); - /*SDA GPIO clock enable */ - RCC_AHB1PeriphClockCmd(I2C_IMU_SDA_GPIO_CLK, ENABLE); - /*SCL GPIO clock enable */ - RCC_AHB1PeriphClockCmd(I2C_IMU_SCL_GPIO_CLK, ENABLE); - /* Enable the DMA clock */ - RCC_AHB1PeriphClockCmd(DMA_IMU_CLK, ENABLE); - /* Enable the IMU timer clock */ - RCC_APB1PeriphClockCmd(IMU_TIMER_CLK,ENABLE); - - /* GPIO Configuration */ - /*Configure I2C SCL pin */ - GPIO_InitStructure.GPIO_Pin = I2C_IMU_SCL_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(I2C_IMU_SCL_GPIO_PORT, &GPIO_InitStructure); - - /*Configure I2C SDA pin */ - GPIO_InitStructure.GPIO_Pin = I2C_IMU_SDA_PIN; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(I2C_IMU_SDA_GPIO_PORT, &GPIO_InitStructure); - - /* Connect PXx to I2C_SCL */ - GPIO_PinAFConfig(I2C_IMU_SCL_GPIO_PORT, I2C_IMU_SCL_SOURCE, I2C_IMU_SCL_AF); - /* Connect PXx to I2C_SDA */ - GPIO_PinAFConfig(I2C_IMU_SDA_GPIO_PORT, I2C_IMU_SDA_SOURCE, I2C_IMU_SDA_AF); - - /* I2C Struct Initialize */ - I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; - I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; - I2C_InitStructure.I2C_OwnAddress1 = 0x00; - I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; - I2C_InitStructure.I2C_ClockSpeed = 400000; - I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; - I2C_Init(I2C_IMU, &I2C_InitStructure); - /* configure I2C interrupts */ - NVIC_InitStructure.NVIC_IRQChannel = I2C_IMU_ER_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - NVIC_InitStructure.NVIC_IRQChannel = I2C_IMU_EV_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - I2C_ITConfig(I2C_IMU, I2C_IT_ERR | I2C_IT_EVT, ENABLE); - // enable I2C1 - I2C_Cmd(I2C_IMU, ENABLE); - - // initialize data - i2c_error=0x00; - i2c_op=I2C_OP_DONE; - imu_stop_flag=0x00; - imu_stopped=0x00; - for(i=0;i<32;i++) - i2c_data_out[i]=0x00; - /* configure DMA TX */ - DMA_DeInit(I2C_IMU_DMA_STREAM_TX); - IMU_DMA_TX_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; - IMU_DMA_TX_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; - IMU_DMA_TX_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - IMU_DMA_TX_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - IMU_DMA_TX_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - IMU_DMA_TX_InitStructure.DMA_Mode = DMA_Mode_Normal; - IMU_DMA_TX_InitStructure.DMA_PeripheralBaseAddr = I2C_IMU_DR_ADDRESS; - IMU_DMA_TX_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - IMU_DMA_TX_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - IMU_DMA_TX_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - IMU_DMA_TX_InitStructure.DMA_Priority = DMA_Priority_High; - IMU_DMA_TX_InitStructure.DMA_Channel = I2C_IMU_DMA_CHANNEL; - IMU_DMA_TX_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; - /* initialize DMA interrupts */ - NVIC_InitStructure.NVIC_IRQChannel = I2C_IMU_TX_DMA_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - DMA_ITConfig(I2C_IMU_DMA_STREAM_TX,DMA_IT_TC,ENABLE); - DMA_ITConfig(I2C_IMU_DMA_STREAM_TX,DMA_IT_HT | DMA_IT_TE | DMA_IT_FE | DMA_IT_DME,DISABLE); - - /* configure DMA Rx */ - DMA_DeInit(I2C_IMU_DMA_STREAM_RX); - IMU_DMA_RX_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; - IMU_DMA_RX_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; - IMU_DMA_RX_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - IMU_DMA_RX_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; - IMU_DMA_RX_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; - IMU_DMA_RX_InitStructure.DMA_Mode = DMA_Mode_Normal; - IMU_DMA_RX_InitStructure.DMA_PeripheralBaseAddr = I2C_IMU_DR_ADDRESS; - IMU_DMA_RX_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - IMU_DMA_RX_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; - IMU_DMA_RX_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; - IMU_DMA_RX_InitStructure.DMA_Priority = DMA_Priority_High; - IMU_DMA_RX_InitStructure.DMA_Channel = I2C_IMU_DMA_CHANNEL; - IMU_DMA_RX_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; - /* initialize DMA interrupts */ - NVIC_InitStructure.NVIC_IRQChannel = I2C_IMU_RX_DMA_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - DMA_ITConfig(I2C_IMU_DMA_STREAM_RX,DMA_IT_TC,ENABLE); - DMA_ITConfig(I2C_IMU_DMA_STREAM_RX,DMA_IT_HT | DMA_IT_TE | DMA_IT_FE | DMA_IT_DME,DISABLE); - - // configure the timer - // initialize the timer interrupts - NVIC_InitStructure.NVIC_IRQChannel = IMU_TIMER_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); - - /* motion timer configuration */ - TIM_TimeBaseStructure.TIM_Period = 0xFFFF; - TIM_TimeBaseStructure.TIM_Prescaler = 82; - TIM_TimeBaseStructure.TIM_ClockDivision = 0; - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInit(IMU_TIMER,&TIM_TimeBaseStructure); - TIM_SetClockDivision(IMU_TIMER,TIM_CKD_DIV1); - - TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; - TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; - TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; - TIM_OCInitStructure.TIM_Pulse = 1000;// 1ms period - TIM_OC1Init(IMU_TIMER, &TIM_OCInitStructure); - TIM_OC1PreloadConfig(IMU_TIMER, TIM_OCPreload_Disable); - - /* detect the three sensors in the imu */ - if(imu_accel_detect()) - ram_set_bit(BIOLOID_IMU_STATUS,1); - else - ram_clear_bit(BIOLOID_IMU_STATUS,1); - if(imu_gyro_detect()) - ram_set_bit(BIOLOID_IMU_STATUS,2); - else - ram_clear_bit(BIOLOID_IMU_STATUS,2); - if(imu_compass_detect()) - ram_set_bit(BIOLOID_IMU_STATUS,3); - else - ram_clear_bit(BIOLOID_IMU_STATUS,3); -} - -void imu_start(void) -{ - // start the accelerometer - imu_accel_start(); - imu_gyro_start(); - imu_compass_start(); - - // start the timer to get the imu data - TIM_Cmd(IMU_TIMER, ENABLE); - TIM_ITConfig(IMU_TIMER, TIM_IT_CC1, ENABLE); - - ram_set_bit(BIOLOID_IMU_STATUS,0); -} - -void imu_stop(void) -{ - imu_stop_flag=0x01; - while(!imu_stopped); - imu_stopped=0x00; - imu_accel_stop(); - imu_gyro_stop(); - imu_compass_stop(); -}