STM32的硬件IIC读取MPU6050
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信号
while(!I2C_CheckEvent(I2C1,
I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
while(!(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)));
GPIO_InitTypeDef iic1_io_init_struct; I2C_InitTypeDef iic1_init_struct;
RCC_APB2PeriphClockCmd(MPU_IO_RCC, ENABLE); RCC_APB1PeriphClockCmd(IIC_1_RCC, ENABLE);
void display_data_process(uint16_t display_data,char *cache)//暂时只处理了加速度的数据(结 果的单位为 m/(s*s)) {
char *position=cache; uint32_t temp; if(display_data&0x8000)
//接口定义
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#define MPU_IO_RCC
RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO
#define IIC_1_RCC
RCC_APB1Periph_I2C1
#define MPU_PORT
#define SMPLRT_DIV
0x19 //陀螺仪采样率,典型值:0x07(125Hz)
#define CONFIG
0x1A //低通滤波频率,典型值:0x06(5Hz)
#define GYRO_CONFIG
0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,
2000deg/s)
#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:
I2C_Init(I2C1, &iic1_init_struct); I2C_Cmd(I2C1, ENABLE);
}
void write_byte(uint8_t REG_Address,uint8_t REG_data) {
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, REG_data);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
0x01(不自检,2G,5Hz)
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
//mian.c 部分内容 char display_data_x[7],display_data_y[7],display_data_z[7]; uint16_t data_x,data_y,data_z;
int main(void) {
initlcd();//初始化 LCD(LCD 部分的函数就省略了) iic_config(); InitMPU6050(); while(1) { data_x=getdate(ACCEL_XOUT_H); data_y=getdate(ACCEL_YOUT_H); data_z=getdate(ACCEL_ZOUT_H); display_data_process(data_x,display_data_x); display_data_process(data_y,display_data_y); display_data_process(data_z,display_data_z); lcd_update();//更新 LCD delayms(50); } }
#define TEMP_OUT_H
0x41
#define TEMP_OUT_L
0x42
#define GYRO_XOUT_H
0x43
#define GYRO_XOUT_L
0x44
#define GYRO_YOUT_H
0x45
#define GYRO_YOUT_L
0x46
#define GYRO_ZOUT_H
0x47
#define GYRO_ZOUT_L
0x48
#define PWR_MGMT_1
0x6B //电源管理,典型值:0x00(正常启用)
#define WHO_AM_I
0x75 //IIC 地址寄存器(默认数值 0x68,只读)
#define SlaveAddress 0xd0 //IIC 写入时的地址字节数据,+1 为读取
uint8_t read_byte(uint8_t REG_Address);
void InitMPU6050(void);
uint16_t getdate(uint8_t REG_Address);
#endif
//mpu6050.c 文件
#include"mpu6050.h" void iic_config(void) {
I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1,
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(1, REG_Address);
I2C_GenerateSTOP(I2C1, ENABLE);
}
uint8_t read_byte(uint8_t REG_Address)
{
uint8_t REG_data;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);
iic1_io_init_struct.GPIO_Pin = SCL1_PIN|SDA1_PIN; iic1_io_init_struct.GPIO_Speed = GPIO_Speed_50MHz; iic1_io_init_struct.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(MPU_PORT, &iic1_io_init_struct);
#define LSB_g
16384 //LSB/g 即 16384=g=9.8m/(S*S)
#define deg_LSB
10/164 //deg/LSB
#define LSB_t
340
//lsb/℃
void iic_config(void);
void write_byte(uint8_t REG_Address,uint8_t REG_data);
//起始信号
while(!I2C_CheckEvent(I2C1,
I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Transmitter);// 发 送 设 备 地 址 + 写 信号
自己用 STM32 的硬件 IIC 写的,能读出数据,仅供参考,本人新手一个,有错误的地方欢 迎指出
//mpu6050.h
#ifndef _MPU6050_H
#define _MPU6050_H
#include<stm32f10x.h>
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
GPIOB
#define SCL1_PIN
GPIO_Pin_6
#define SDA1_PIN
GPIO_Pin_7
//****************************************
// 定义 MPU6050 内部地址
//****************************************
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
// I2C_Cmd(I2C1, ENABLE);
I2C_SendData(I2C1, REG_Address);
//发送存储单元地址,从 0 开始
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
REG_data=I2C_ReceiveData(I2C1); return REG_data; } void InitMPU6050(void) { write_byte(PWR_MGMT_1, 0x00); write_byte(SMPLRT_DIV, 0x07);
//读出寄存器数据 //解除休眠状态
{ *position='-'; position++; display_data&=0x7FFF; display_data--; display_data^=0x7fff; } else {
*position=' '; position++; } temp=display_data*9806/LSB_g;//g=重力加速度 *position=(char)((temp%10000)/1000)+'0'; position++; *position='.'; position++; *position=(char)((temp%1000)/100)+'0'; position++; *position=(char)((temp%100)/10)+'0'; }
I2C_GenerateSTART(I2C1, ENABLE);
//起始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Receiver); // 发 送设 备 地址 +读
write_byte(CONFIG, 0x06); write_byte(GYRO_CONFIG, 0x18); write_byte(ACCEL_CONFIG, 0x01); } uint16_t getdate(uint8_t REG_Address) { uint16_t geted_date=0; geted_date=read_byte(REG_Address)<<8; geted_date|=read_byte(REG_Address+1); return geted_date; }
iic1_init_struct.I2C_ClockSpeed
= 50000;//<400KHz
iic1_init_struct.I2C_Mode
= I2C_Mode_I2C;
iic1_init_struct.I2C_Ack
= I2C_Ack_Enable;
iic1_init_struct.I2C_AcknowledgedAddress= I2C_AcknowledgedAddress_7bit;