OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5378|回复: 7

MPU6050读数据的问题 用了原子哥帖子的程序加以修改 但是始终不能读到数据 希望各位大神帮帮忙 帮我看一下程序

[复制链接]

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2013-7-13
在线时间
7 小时
发表于 2015-4-11 16:31:41 | 显示全部楼层 |阅读模式
5金钱
下边是我的源码:  
主函数
[mw_shl_code=c,true]#include "stm32f10x.h" #include "I2C_MPU6050.h" #include "usart1.h" #include "delay.h" /* * 函数名:main * 描述 :主函数 * 输入 :无 * 输出 :无 * 返回 :无 */ int main(void) { /* 串口1初始化 */ USART1_Config(); /*IIC接口初始化*/ I2C_MPU6050_Init(); /*陀螺仪传感器初始化*/ InitMPU6050(); while(1) { printf("\r\n---------加速度X轴原始数据---------%d \r\n",GetData(ACCEL_XOUT_H)); printf("\r\n---------加速度Y轴原始数据---------%d \r\n",GetData(ACCEL_YOUT_H)); printf("\r\n---------加速度Z轴原始数据---------%d \r\n",GetData(ACCEL_ZOUT_H)); printf("\r\n---------陀螺仪X轴原始数据---------%d \r\n",GetData(GYRO_XOUT_H)); printf("\r\n---------陀螺仪Y轴原始数据---------%d \r\n",GetData(GYRO_YOUT_H)); printf("\r\n---------陀螺仪Z轴原始数据---------%d \r\n",GetData(GYRO_ZOUT_H)); delay_ms(500); } } /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/ [/mw_shl_code]
下边是I2C_MPU6050.c文件

[mw_shl_code=c,true]硬件连接:----------------- * | | * | PB10-I2C2_SCL | * | PB11-I2C2_SDA | * | | * ----------------- * 作者 : Orange **********************************************************************************/ #include "I2C_MPU6050.h" /* * 函数名:I2C_GPIO_Config * 描述 :I2C1 I/O配置 * 输入 :无 * 输出 :无 * 调用 :内部调用 */ static void I2C_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 使能与 I2C1 有关的时钟 */ RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE ); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE); /* PB6-I2C1_SCL、PB7-I2C1_SDA*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); } /* * 函数名:I2C_Mode_Config * 描述 :I2C 工作模式配置 * 输入 :无 * 输出 :无 * 调用 :内部调用 */ static void I2C_Mode_Config(void) { /* Initialize the I2C1 according to the I2C_InitStructure members */ I2C_InitTypeDef I2C_InitStructure; /* I2C 配置 */ I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ; //I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 50000; /* I2C1 初始化 */ I2C_Init(I2C2, &I2C_InitStructure); /* 使能 I2C1 */ I2C_Cmd (I2C2,ENABLE); /*允许应答模式*/ I2C_AcknowledgeConfig(I2C2, ENABLE); } /***************************************************************************************/ /* * 函数名:I2C_MMA_Init * 描述 :I2C 外设(MMA7455)初始化 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void I2C_MPU6050_Init(void) { I2C_GPIO_Config(); I2C_Mode_Config(); } /* * 函数名:I2C_ByteWrite * 描述 :写一个字节到I2C设备寄存器中 * 输入 :REG_Address 接收数据的IIC设备寄存器的地址 * REG_data 待写入的数据 * 输出 :无 * 返回 :无 * 调用 :内部调用 */ void I2C_ByteWrite(uint8_t REG_Address,uint8_t REG_data) { 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,REG_Address); while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C2,REG_data); while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C2,ENABLE); } /* * 函数名:I2C_ByteRead * 描述 :从IIC设备寄存器中读取一个字节 * 输入 :REG_Address 读取数据的寄存器的地址 * 输出 :无 * 返回 :无 * 调用 :内部调用 */ uint8_t I2C_ByteRead(uint8_t REG_Address) { uint8_t REG_data; while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY)); 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_Cmd(I2C2,ENABLE); I2C_SendData(I2C2,REG_Address);//发送存储单元地址,从0开始 while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); 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)); I2C_AcknowledgeConfig(I2C2,DISABLE); I2C_GenerateSTOP(I2C2,ENABLE); while(!(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED))); REG_data=I2C_ReceiveData(I2C2);//读出寄存器数据 return REG_data; } /* * 函数名:void InitMPU6050(void) * 描述 :初始化Mpu6050 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void InitMPU6050(void) { I2C_ByteWrite(PWR_MGMT_1,0x00);//解除休眠状态 I2C_ByteWrite(SMPLRT_DIV,0x07); I2C_ByteWrite(CONFIG,0x06); I2C_ByteWrite(GYRO_CONFIG,0x18); I2C_ByteWrite(ACCEL_CONFIG,0x01); } /* * 函数名:GetData * 描述 :获得16位数据 * 输入 :REG_Address 寄存器地址 * 输出 :返回寄存器数据 * 调用 :外部调用 */ unsigned int GetData(unsigned char REG_Address) { char H,L; H=I2C_ByteRead(REG_Address); L=I2C_ByteRead(REG_Address+1); return (H<<8)+L; //合成数据 } /******************* (C) COPYRIGHT 2012 *****END OF FILE************/ 这个是 usart1.c文件

#include "usart1.h“ #include <stdarg.h>

/*  * 函数名:USART1_Config  * 描述  :USART1 GPIO 配置,工作模式配置。115200 8-N-1  * 输入  :无  * 输出  : 无  * 调用  :外部调用  */ void USART1_Config(void) {  GPIO_InitTypeDef GPIO_InitStructure;  USART_InitTypeDef USART_InitStructure;

 /* config USART1 clock */

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

 /* USART1 GPIO config */    /* Configure USART1 Tx (PA.09) as alternate function push-pull */   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   GPIO_Init(GPIOA, &GPIO_InitStructure);      /* Configure USART1 Rx (PA.10) as input floating */   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   GPIO_Init(GPIOA, &GPIO_InitStructure);     /* USART1 mode config */  USART_InitStructure.USART_BaudRate = 56000;  USART_InitStructure.USART_WordLength = USART_WordLength_8b;  USART_InitStructure.USART_StopBits = USART_StopBits_1;  USART_InitStructure.USART_Parity = USART_Parity_No ;  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  USART_Init(USART1, &USART_InitStructure);   USART_Cmd(USART1, ENABLE); }

/*  * 函数名:fputc  * 描述  :重定向c库函数printf到USART1  * 输入  :无  * 输出  :无  * 调用  :由printf调用  */ int fputc(int ch, FILE *f) { /* 将Printf内容发往串口 */   USART_SendData(USART1, (unsigned char) ch);   while (!(USART1->SR & USART_FLAG_TXE));     return (ch); }

/*  * 函数名:itoa  * 描述  :将整形数据转换成字符串  * 输入  :-radix =10 表示10进制,其他结果为0  *         -value 要转换的整形数  *         -buf 转换后的字符串  *         -radix = 10  * 输出  :无  * 返回  :无  * 调用  :被USART1_printf()调用  */ static char *itoa(int value, char *string, int radix) {     int     i, d;     int     flag = 0;     char    *ptr = string;

    /* This implementation only works for decimal numbers. */     if (radix != 10)     {         *ptr = 0;         return string;     }

    if (!value)     {         *ptr++ = 0x30;         *ptr = 0;         return string;     }

    /* if this is a negative value insert the minus sign. */     if (value < 0)     {         *ptr++ = '-';

        /* Make the value positive. */         value *= -1;     }

    for (i = 10000; i > 0; i /= 10)     {         d = value / i;

        if (d || flag)         {             *ptr++ = (char)(d + 0x30);             value -= (d * i);             flag = 1;         }     }

    /* Null terminate the string. */     *ptr = 0;

    return string;

} /* NCL_Itoa */

/*  * 函数名:USART1_printf  * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库  * 输入  :-USARTx 串口通道,这里只用到了串口1,即USART1  *       -Data   要发送到串口的内容的指针  *      -...    其他参数  * 输出  :无  * 返回  :无  * 调用  :外部调用  *         典型应用USART1_printf( USART1, "\r\n this is a demo \r\n" );  *               USART1_printf( USART1, "\r\n %d \r\n", i );  *               USART1_printf( USART1, "\r\n %s \r\n", j );  */ void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...) {  const char *s;   int d;     char buf[16];

  va_list ap;   va_start(ap, Data);

 while ( *Data != 0)     // 判断是否到达字符串结束符  {                                if ( *Data == 0x5c )  //'\'   {              switch ( *++Data )    {     case 'r':                 //回车符      USART_SendData(USARTx, 0x0d);      Data ++;      break;

    case 'n':                 //换行符      USART_SendData(USARTx, 0x0a);       Data ++;      break;          default:      Data ++;         break;    }      }   else if ( *Data == '%')   {           //    switch ( *++Data )    {         case 's':            //字符串      s = va_arg(ap, const char *);           for ( ; *s; s++)      {       USART_SendData(USARTx,*s);       while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );           }      Data++;           break;

        case 'd':          //十进制           d = va_arg(ap, int);           itoa(d, buf, 10);           for (s = buf; *s; s++)      {       USART_SendData(USARTx,*s);       while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );           }      Data++;           break;      default:       Data++;         break;    }     } /* end of else if */   else USART_SendData(USARTx, *Data++);   while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );  } } /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/

 

[/mw_shl_code]
希望各位大神帮帮忙
具体程序在下边

7.zip

2.89 MB, 下载次数: 122

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-11 22:54:10 | 显示全部楼层
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2013-7-13
在线时间
7 小时
 楼主| 发表于 2015-4-12 09:12:52 | 显示全部楼层
我用的是战舰的mini板
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2013-7-13
在线时间
7 小时
 楼主| 发表于 2015-4-12 09:14:31 | 显示全部楼层
求大神指导一下
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2013-7-13
在线时间
7 小时
 楼主| 发表于 2015-4-12 09:29:49 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥  能不能帮我看一下、
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-12 23:24:47 | 显示全部楼层
回复【5楼】110220315:
---------------------------------
不好意思,不用硬件IIC,也没时间帮您看
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-12 23:25:14 | 显示全部楼层
论坛很多MPU6050参考代码了,随便找个参考就可以搞定的问题,自己努力下吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2013-7-13
在线时间
7 小时
 楼主| 发表于 2015-4-13 10:01:56 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------谢谢原子哥  我搞定了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 16:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表