我都出来的
WHO_AM_I=68是正常的
但是
PWR_MGMT_1=40总是休眠状态呢,我已经把他解除休眠了啊
求助大神,我已经搞俩星期了
代码如下:
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true]//IIC.c
#include "IIC.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "math.h"
//初始化IIC
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
IIC_SCL=1;
IIC_SDA=1;
}
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA=1;
IIC_SCL=1;
delay_us(5);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(5);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(5);
IIC_SCL=1;
IIC_SDA=1;//发送I2C总线结束信号
delay_us(5);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0
return 0;
}
//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不产生ACK应答
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(5); //对TEA5767这三个延时都是必须的
IIC_SCL=1;
delay_us(5);
IIC_SCL=0;
delay_us(5);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
[/mw_shl_code]
[mw_shl_code=c,true]}[/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true]//MPU.c
#include "IIC.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "math.h"
#include "mpu6050.h"
#define uchar unsigned char
#define uint unsigned int
int sum;
//extern uchar BUF[10];
//extern uchar T_X;
/***************************************************************************
*******************************************************************************/
void Single_Write_IIC(u8 REG_Address,u8 REG_data)
{
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack();
IIC_Send_Byte(REG_Address); //内部寄存器地址
IIC_Wait_Ack();
/**********************/
IIC_Send_Byte(REG_data); //内部寄存器数据
IIC_Wait_Ack(); /**********************/
IIC_Stop(); //发送停止信号
}
//**************************************
//从I2C设备读取一个字节数据
//**************************************
u8 Single_Read_IIC(u8 REG_Address)
{
u8 REG_data;
IIC_Start();
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();
IIC_Send_Byte(REG_Address);
IIC_Wait_Ack(); /**********************/
IIC_Start();
IIC_Send_Byte(SlaveAddress+1);
IIC_Wait_Ack();
REG_data=IIC_Read_Byte(0);
//IIC_Ack();//IIC_NAck()
delay_us(2);
IIC_Stop();
return REG_data;
}
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050(void)
{
Single_Write_IIC(PWR_MGMT_1, 0x80); //复位
delay_ms(30);
Single_Write_IIC(PWR_MGMT_1,0x00); //解除休眠状态
delay_us(100);
Single_Write_IIC(GYRO_CONFIG,0x18); //陀螺仪不自检,配置陀螺仪满量程正负2000°/S
delay_us(100);
LCD_ShowString(30,50,"Mini STM32 ^3^");
Single_Write_IIC(ACCEL_CONFIG,0x01);//加速度计不自检,配置加速度计满量程2g
delay_us(100);
Single_Write_IIC(SMPLRT_DIV,0x07); //采样频率分频器
delay_us(100);
Single_Write_IIC(CONFIG,0x06); //低通滤波频率
delay_us(100);
}
[/mw_shl_code]
[/mw_shl_code]
[mw_shl_code=c,true]//MAIN.c
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "exti.h"
#include "wdg.h"
#include "timer.h"
#include "lcd.h"
#include "math.h"
#include "mpu6050.h"
#include "IIC.h"
#define uchar unsigned char
#define uint unsigned int
int sum_1,sum_2,sum_3,sum_4,sum_5;
int Add;
uchar BUF[14];
u32 T_X,T_Y,T_Z,G_X,G_Y,G_Z;
float T_TEMP;
u32 Gyro_Config,Gyro_Config_7,Gyro_Config_6,Gyro_Config_5;
void Read_MPU6050(void)
{
BUF[0]=Single_Read_IIC(ACCEL_XOUT_L);
BUF[1]=Single_Read_IIC(ACCEL_XOUT_H);
T_X=(BUF[1]<<8)|BUF[0];
T_X/=16.4;
BUF[2]=Single_Read_IIC(ACCEL_YOUT_L);
BUF[3]=Single_Read_IIC(ACCEL_YOUT_H);
T_Y=(BUF[3]<<8)|BUF[2];
T_Y/=16.4;
BUF[4]=Single_Read_IIC(ACCEL_ZOUT_L);
BUF[5]=Single_Read_IIC(ACCEL_ZOUT_H);
T_Z=(BUF[5]<<8)|BUF[4];
T_Z/=16.4;
BUF[6]=Single_Read_IIC(TEMP_OUT_L);
BUF[7]=Single_Read_IIC(TEMP_OUT_H);
T_TEMP=(BUF[7]<<8)|BUF[6];
T_TEMP=T_TEMP/340+36.53;
BUF[8]=Single_Read_IIC(GYRO_XOUT_L);
BUF[9]=Single_Read_IIC(GYRO_XOUT_H);
G_X=(BUF[1]<<8)|BUF[0];
G_X/=16.4;
BUF[10]=Single_Read_IIC(GYRO_YOUT_L);
BUF[11]=Single_Read_IIC(GYRO_YOUT_H);
G_Y=(BUF[1]<<8)|BUF[0];
G_Y/=16.4;
BUF[12]=Single_Read_IIC(GYRO_YOUT_L);
BUF[13]=Single_Read_IIC(GYRO_YOUT_H);
G_Z=(BUF[1]<<8)|BUF[0];
G_Z/=16.4;
}
int main(void)
{
SystemInit();
delay_init(72); //延时初始化
NVIC_Configuration();
uart_init(9600);
LED_Init();
KEY_Init();
LCD_Init();
Single_Write_IIC(PWR_MGMT_1,0x80);
delay_ms(30);
//Single_Write_IIC(PWR_MGMT_1,0x00);
InitMPU6050();
IIC_Init();
delay_ms(100);
POINT_COLOR=RED;
LCD_ShowString(30,50,"Mini STM32 ^_^");
LCD_ShowString(30,70,"2.4'/2.8' TFTLCD TEST");
while(1)
{
printf("\r\n 您发送的消息为:\r\n");
Add=Single_Read_IIC(WHO_AM_I);
printf("WHO_AM_I=%x\r\n",Add);
sum_1=Single_Read_IIC(GYRO_CONFIG);
sum_2=Single_Read_IIC(PWR_MGMT_1);
Read_MPU6050();
printf("GYRO_CONFIG=%x\r\n",sum_1);
printf("PWR_MGMT_1=%x\r\n",sum_2);
printf("x=%d\r\n",T_X);
printf("y=%d\r\n",T_Y);
printf("z=%d\r\n",T_Z);
printf("T_tempert=%lf\r\n",T_TEMP); //显示温度
printf("G_X=%d\r\n",G_X);
printf("G_Y=%d\r\n",G_Y);
printf("G_Z=%d\r\n\n\n",G_Z);
delay_ms(1800);
delay_ms(1800);
}
}
[/mw_shl_code]
|