Mpu9150
STM32F103C8
SCL
SDA MPU6050 HMC5883L
Mpu6050传感器读取数据(ax,ay,az)(gx,gy,gz)
HMC5883L传感器读取数据(mx,my,mz)
数据结构
使用I2C进行数据传输
/*************************************************
名称:iic_init(void)
功能:iic外设1初始化(管脚配置总线速度数据位宽)
输入参数:无
输出参数:无
返回值:无
**************************************************/
void iic_init(void)
{
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/* PA6,7 SCL and SDA */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
I2C_DeInit(I2C2);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x30;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 300000; //200K
I2C_Cmd(I2C2, ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C2, ENABLE);
}
/*************************************************
名称:iic_rw(u8 *data_buff, u8 byte_quantity, u8 reg_address, u8 slave_address, u8 control_byte) 功能:iic数据的读写
输入参数:
u8 *data_buff 数据输入输出指针
u8 byte_quantity 数据个数
u8 reg_address iic寄存器地址
u8 slave_address iic器件地址
u8 control_byte 读写控制字read=1 write=0
输出参数:u8 *data_buff iic读取的数据内容
返回值:无
**************************************************/
void iic_rw(u8 *DataBuff, u8 ByteQuantity, u8 RegAddress, u8 SlaveAddress, u8 ControlByte) {
u8 errorflag = 1, j, i = 1;
while(i--)
{
/* 起始位*/
I2C_GenerateSTART(I2C2, ENABLE);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* 发送器件地址(写)*/
I2C_Send7bitAddress(I2C2, SlaveAddress, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C2,
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/*发送地址*/
I2C_SendData(I2C2, RegAddress);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
if(ControlByte == 0)
{
j=ByteQuantity;
errorflag = 0;
while(j--)
{
I2C_SendData(I2C2, *DataBuff++);
while(!(I2C_CheckEvent(I2C2,
I2C_EVENT_MASTER_BYTE_TRANSMITTED)||I2C_SR1_AF));
}
I2C_GenerateSTOP(I2C2, ENABLE);
}
else
{
I2C_GenerateSTART(I2C2, ENABLE);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* 发送器件地址(写)*/
I2C_Send7bitAddress(I2C2, SlaveAddress, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C2,
I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); /* EV7 */
while (ByteQuantity)
{
if(ByteQuantity == 1)
{
I2C_AcknowledgeConfig(I2C2, DISABLE); //最后一位后要关闭应答的
I2C_GenerateSTOP(I2C2, ENABLE); //发送停止位
}
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */
*DataBuff = I2C_ReceiveData(I2C2);
DataBuff++;
/* Decrement the read bytes counter */
ByteQuantity--;
}
I2C_AcknowledgeConfig(I2C2, ENABLE); //再次允许应答模式
}
}
}
数据中断处理
/*************************************************
名称:timer_init(void)
功能:timer3外设初始化(中断定时时间)
输入参数:无
输出参数:无
返回值:无
**************************************************/
void timer_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the TIM3 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 7200 - 1; // 0.1ms
TIM_TimeBaseStructure.TIM_Prescaler = 25 - 1; // (Period + 1) * (Prescaler + 1) / 72M = 2.5ms
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* TIM3 enable counter */
TIM_Cmd(TIM3, ENABLE);
/* TIM IT enable */
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
}