Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
B
bioloid_stm32_fw
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
humanoides
bioloid_stm32_fw
Commits
c76b70fe
Commit
c76b70fe
authored
11 years ago
by
Sergi Hernandez
Browse files
Options
Downloads
Patches
Plain Diff
Basic implementation of IMU interface working with DMA.
parent
260d1847
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
include/imu_9dof_dma.h
+6
-0
6 additions, 0 deletions
include/imu_9dof_dma.h
src/bioloid_stm32.c
+9
-4
9 additions, 4 deletions
src/bioloid_stm32.c
src/imu_9dof_dma.c
+83
-5
83 additions, 5 deletions
src/imu_9dof_dma.c
with
98 additions
and
9 deletions
include/imu_9dof_dma.h
+
6
−
0
View file @
c76b70fe
...
@@ -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
This diff is collapsed.
Click to expand it.
src/bioloid_stm32.c
+
9
−
4
View file @
c76b70fe
...
@@ -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
...
...
This diff is collapsed.
Click to expand it.
src/imu_9dof_dma.c
+
83
−
5
View file @
c76b70fe
...
@@ -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_
Dis
able
;
I2C_InitStructure
.
I2C_Ack
=
I2C_Ack_
En
able
;
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
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment