OpenEdv-开源电子网

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

求助!关于C8T6读取MPU6050数据OLED显示问题!加入MPU6050初始化函数程序就不运行了!

[复制链接]

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-9-21
在线时间
0 小时
发表于 2015-10-28 11:40:18 | 显示全部楼层 |阅读模式
5金钱
把战舰上的OLED显示ASCII源码移植到C8T6上能正常显示,但是当我在主程序里加入陀螺仪的初始化函数是程序直接就不运行了!为什么啊?主程序代码如下,去掉MPU_Init()一句后就能正常显示,加上程序就直接不运行了。
#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "myiic.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h" 
 int main(void)
 { u8 t=0;
delay_init();
OLED_Init();
float pitch,roll,yaw; //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
short temp; //温度
 
//****************************************
MPU_Init();//去掉此句后OLED正常显示
//*****************************************
 
  OLED_ShowString(0,0, "0.96' OLED TEST");  
  OLED_ShowString(0,16,"ATOM@ALIENTEK");  
  OLED_ShowString(0,32,"2010/06/3");  
  OLED_ShowString(0,48,"ASCII:");  
  OLED_ShowString(63,48,"CODE:");  
OLED_Refresh_Gram();  
t=' ';
while(1) 
{
OLED_ShowChar(48,48,t,16,1);   
OLED_Refresh_Gram();
t++;
if(t>'~')t=' ';
OLED_ShowNum(103,48,t,3,16);
delay_ms(300);
}
}

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

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-9-21
在线时间
0 小时
 楼主| 发表于 2015-10-28 12:56:52 | 显示全部楼层
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-9-21
在线时间
0 小时
 楼主| 发表于 2015-10-28 13:02:08 | 显示全部楼层
先通过串口调试代码如下,串口只打印到IIC START就没有继续打印了,说明程序卡在IIC_Send_Byte((MPU_ADDR<<1)|0);这一句上了,为什么啊?
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "oled.h"
#include "myiic.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h" 
 int main(void)
 {
 Stm32_Clock_Init(9);            //系统时钟设置
 u8 a=0;
delay_init();
 uart_init(9600);  //串口初始化为9600
OLED_Init();
 float pitch,roll,yaw;  //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
short temp; //温度
//****************************************
 u8 res;
IIC_Init();//初始化IIC总线
 printf("IIC ASS\n");
 IIC_Start();
 printf("IIC start\n");
 IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令//程序卡在这一步无法进行下去
 printf("send byte\n");
 if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();  
}
    IIC_Send_Byte(MPU_PWR_MGMT_1); //写寄存器地址
    IIC_Wait_Ack(); //等待应答 
IIC_Send_Byte(0X80);//发送数据
 IIC_Stop();
 printf("mpu reset pass\n");
// MPU_Init();//加上此句无法显示
//*****************************************
  OLED_ShowString(0,0, "0.96' OLED TEST");  
  OLED_ShowString(0,16,"ATOM@ALIENTEK");  
  OLED_ShowString(0,32,"2010/06/3");  
  OLED_ShowString(0,48,"ASCII:");  
  OLED_ShowString(63,48,"CODE:");  
OLED_Refresh_Gram();  
a=' ';
while(1) 
{
OLED_ShowChar(48,48,a,16,1);   
OLED_Refresh_Gram();
a++;
if(a>'~')a=' ';
OLED_ShowNum(103,48,a,3,16);
delay_ms(300);
}
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-29 22:17:50 | 显示全部楼层
继续跟踪,看看死在哪里?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2015-10-30 16:49:45 | 显示全部楼层
你加上MPU_Init(),然后在下一句加个让小灯亮,如果小灯不亮,就是卡死在MPU_Init()中的某个while里了。
然后你去MPU_Init()里的所有函数中一个一个找while。
大约会遇到这类的函数,不知道你那里是怎么写的,我是刚刚随便打开了个原子的例程找到的:
u8 MPU_IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
MPU_SDA_IN();      //SDA设置为输入  
MPU_IIC_SDA=1;MPU_IIC_Delay();    
MPU_IIC_SCL=1;MPU_IIC_Delay();  
while(MPU_READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
MPU_IIC_Stop();
return 1;
}
}
MPU_IIC_SCL=0;//时钟输出0     
return 0;  

这里面就有个while,等待应答。没信号它就不离开while了。。。
自在随心
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2015-10-30 16:53:11 | 显示全部楼层
你可以根据你的需要,把原子哥的例程改了呀,好多例程里都有while这种东西,反正例程就是给个参考,实现一种功能就行了,加上while不碍事,你自己的程序正常是不要带这种while的。某个传感器线一断,整个程序都不跑了。
自在随心
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 12:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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