Skip to content
Snippets Groups Projects
Commit c76b70fe authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Basic implementation of IMU interface working with DMA.

parent 260d1847
No related branches found
No related tags found
No related merge requests found
...@@ -46,4 +46,10 @@ void imu_accel_justify_left(void); ...@@ -46,4 +46,10 @@ void imu_accel_justify_left(void);
void imu_accel_justify_right(void); void imu_accel_justify_right(void);
void imu_accel_config(void); void imu_accel_config(void);
// gyroscope public functions
uint8_t imu_gyro_detect(void);
// compass public functions
uint8_t imu_compass_detect(void);
#endif #endif
...@@ -74,10 +74,15 @@ int32_t main(void) ...@@ -74,10 +74,15 @@ int32_t main(void)
GPIO_SetBits(GPIOD,GPIO_Pin_12); GPIO_SetBits(GPIOD,GPIO_Pin_12);
else else
GPIO_ResetBits(GPIOD,GPIO_Pin_12); GPIO_ResetBits(GPIOD,GPIO_Pin_12);
if(imu_gyro_detect())
gpio_set_pushbutton_callback(NORTH_PB,test_led); GPIO_SetBits(GPIOD,GPIO_Pin_13);
gpio_blink_led(EAST_LED,2000); else
gpio_blink_led(WEST_LED,1000); GPIO_ResetBits(GPIOD,GPIO_Pin_13);
if(imu_compass_detect())
GPIO_SetBits(GPIOD,GPIO_Pin_14);
else
GPIO_ResetBits(GPIOD,GPIO_Pin_14);
while(1) /* main function does not return */ while(1) /* main function does not return */
{ {
if(dyn_slave_is_packet_ready())// check if a new instruction packet has been received if(dyn_slave_is_packet_ready())// check if a new instruction packet has been received
......
...@@ -49,6 +49,8 @@ volatile uint8_t i2c_error; ...@@ -49,6 +49,8 @@ volatile uint8_t i2c_error;
volatile i2c_op_t i2c_op; volatile i2c_op_t i2c_op;
uint8_t i2c_conf[32]; uint8_t i2c_conf[32];
uint8_t i2c_data[32]; uint8_t i2c_data[32];
uint8_t i2c_rd_addr;
uint8_t i2c_wr_addr;
// accelerometer data and configuration // accelerometer data and configuration
const uint8_t accel_id_reg=0x00; const uint8_t accel_id_reg=0x00;
const uint8_t accel_id=0xE5; const uint8_t accel_id=0xE5;
...@@ -59,6 +61,26 @@ const uint8_t accel_data_reg=0x32; ...@@ -59,6 +61,26 @@ const uint8_t accel_data_reg=0x32;
const uint8_t accel_data_len=0x06; const uint8_t accel_data_len=0x06;
const uint8_t accel_rd_addr=0xA6; const uint8_t accel_rd_addr=0xA6;
const uint8_t accel_wr_addr=0xA7; const uint8_t accel_wr_addr=0xA7;
// 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_data_reg=0x1B;
const uint8_t gyro_data_len=0x08;
const uint8_t gyro_rd_addr=0xD0;
const uint8_t gyro_wr_addr=0xD1;
// 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_rd_addr=0x3D;
const uint8_t compass_wr_addr=0x3C;
// dma initialization structures; // dma initialization structures;
DMA_InitTypeDef IMU_DMA_TX_InitStructure; DMA_InitTypeDef IMU_DMA_TX_InitStructure;
DMA_InitTypeDef IMU_DMA_RX_InitStructure; DMA_InitTypeDef IMU_DMA_RX_InitStructure;
...@@ -71,9 +93,9 @@ void I2C_IMU_EV_IRQHandler(void) ...@@ -71,9 +93,9 @@ void I2C_IMU_EV_IRQHandler(void)
/* Test on I2C1 EV5 and clear it */ /* Test on I2C1 EV5 and clear it */
case I2C_EVENT_MASTER_MODE_SELECT: case I2C_EVENT_MASTER_MODE_SELECT:
if(i2c_op==I2C_RD_OP_DATA) if(i2c_op==I2C_RD_OP_DATA)
I2C_Send7bitAddress(I2C_IMU,accel_rd_addr,I2C_Direction_Receiver); I2C_Send7bitAddress(I2C_IMU,i2c_rd_addr,I2C_Direction_Receiver);
else else
I2C_Send7bitAddress(I2C_IMU,accel_wr_addr,I2C_Direction_Transmitter); I2C_Send7bitAddress(I2C_IMU,i2c_wr_addr,I2C_Direction_Transmitter);
break; break;
/* Test on I2C1 EV6 and first EV8 and clear them */ /* Test on I2C1 EV6 and first EV8 and clear them */
...@@ -86,9 +108,12 @@ void I2C_IMU_EV_IRQHandler(void) ...@@ -86,9 +108,12 @@ void I2C_IMU_EV_IRQHandler(void)
case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED: case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:
I2C_ITConfig(I2C_IMU, I2C_IT_EVT, DISABLE); I2C_ITConfig(I2C_IMU, I2C_IT_EVT, DISABLE);
I2C_AcknowledgeConfig(I2C_IMU,DISABLE);
/* enable DMA transfer */ /* enable DMA transfer */
I2C_DMACmd(I2C_IMU, ENABLE); 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); DMA_Cmd(I2C_IMU_DMA_STREAM_RX, ENABLE);
break; break;
...@@ -154,6 +179,7 @@ uint8_t imu_is_op_done(void) ...@@ -154,6 +179,7 @@ uint8_t imu_is_op_done(void)
return 0x00; return 0x00;
} }
// accelerometer public functions
uint8_t imu_accel_detect(void) uint8_t imu_accel_detect(void)
{ {
i2c_op=I2C_RD_OP_CMD; i2c_op=I2C_RD_OP_CMD;
...@@ -165,6 +191,8 @@ uint8_t imu_accel_detect(void) ...@@ -165,6 +191,8 @@ uint8_t imu_accel_detect(void)
DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure); DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure);
i2c_conf[0]=accel_id_reg; i2c_conf[0]=accel_id_reg;
i2c_data[0]=0x00; i2c_data[0]=0x00;
i2c_rd_addr=accel_rd_addr;
i2c_wr_addr=accel_wr_addr;
I2C_GenerateSTART(I2C_IMU, ENABLE); I2C_GenerateSTART(I2C_IMU, ENABLE);
imu_wait_op_done(); imu_wait_op_done();
...@@ -223,7 +251,57 @@ void imu_accel_config(void) ...@@ -223,7 +251,57 @@ void imu_accel_config(void)
i2c_conf[0]=accel_conf_reg; i2c_conf[0]=accel_conf_reg;
i2c_conf[15]=0x0A; i2c_conf[15]=0x0A;
i2c_conf[20]=0x02; i2c_conf[20]=0x02;
i2c_rd_addr=accel_rd_addr;
i2c_wr_addr=accel_wr_addr;
I2C_GenerateSTART(I2C_IMU, ENABLE);
}
// gyroscope public 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_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)i2c_conf;
DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure);
i2c_conf[0]=gyro_id_reg;
i2c_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_data[0]&0x7E)==gyro_id)
return 0x01;
else
return 0x00;
}
// 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_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)i2c_conf;
DMA_Init(I2C_IMU_DMA_STREAM_TX,&IMU_DMA_TX_InitStructure);
i2c_conf[0]=compass_id_reg;
i2c_data[0]=0x00;
i2c_data[1]=0x00;
i2c_data[2]=0x00;
i2c_rd_addr=compass_rd_addr;
i2c_wr_addr=compass_wr_addr;
I2C_GenerateSTART(I2C_IMU, ENABLE); I2C_GenerateSTART(I2C_IMU, ENABLE);
imu_wait_op_done();
if(i2c_data[0]==compass_id[0] && i2c_data[1]==compass_id[1] && i2c_data[2]==compass_id[2])
return 0x01;
else
return 0x00;
} }
// public functions // public functions
...@@ -268,7 +346,7 @@ void imu_init(void) ...@@ -268,7 +346,7 @@ void imu_init(void)
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Disable; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_ClockSpeed = 400000; I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2C_IMU, &I2C_InitStructure); I2C_Init(I2C_IMU, &I2C_InitStructure);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment