OpenEdv-开源电子网

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

求救!!!C8T6移植使用RCT6的MPU6050的正点原子官方例程,出现乱码

[复制链接]

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
发表于 2018-8-17 12:28:51 | 显示全部楼层 |阅读模式
8金钱
如题所示,我把原子的mini板的RCT6的mpu6050的程序移植到C8T6上,可是在串口输出的时候,全都是乱码,波特率调任何一个数值都是乱码。
求救大神!!!!

最佳答案

查看完整内容[请看2#楼]

为了彻底排除是波特率的问题,楼主可以在程序中向串口发送一段固定的字符,例如"test"等等,如果串口助手能够正确接收到test字符串就说明肯定不是串口设置的问题,换而言之串口部分正常工作,是其他的地方出现了问题。 楼主可以试一下,我记得函数MPU_Init()是有返回值的,如果MPU6050初始化失败是可以判断出来的。如果确定是初始化失败,就到这个函数里面去看一看,里面应该有一个读取ID的操作,使用串口将读取的ID发出来看看 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-17 12:28:52 | 显示全部楼层
为了彻底排除是波特率的问题,楼主可以在程序中向串口发送一段固定的字符,例如"test"等等,如果串口助手能够正确接收到test字符串就说明肯定不是串口设置的问题,换而言之串口部分正常工作,是其他的地方出现了问题。

楼主可以试一下,我记得函数MPU_Init()是有返回值的,如果MPU6050初始化失败是可以判断出来的。如果确定是初始化失败,就到这个函数里面去看一看,里面应该有一个读取ID的操作,使用串口将读取的ID发出来看看对不对。如果是0x00或者0xff则说明要么是IIC相关的引脚时序不正确,要么就是MPU6050损坏。我觉得前者出问题的可能性极大。
十六进制带我飞。
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 13:32:22 | 显示全部楼层
我是用elink与C8T6的最小系统板与电脑连接的,用蓝牙串口传输也会出现这种状况
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 14:57:51 | 显示全部楼层
115200和500000和9600这一类的都是不行,就是串口调试助手那一些波特率都试过了
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2017-12-8
在线时间
81 小时
发表于 2018-8-17 15:02:12 | 显示全部楼层
检查下系统晶振设置的对不对
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2017-12-8
在线时间
81 小时
发表于 2018-8-17 15:04:48 | 显示全部楼层
检查下系统晶振设置的对不对
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 16:02:20 | 显示全部楼层
Taoson 发表于 2018-8-17 15:04
检查下系统晶振设置的对不对

系统晶振设置为8000000
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 16:03:20 | 显示全部楼层
Taoson 发表于 2018-8-17 15:04
检查下系统晶振设置的对不对

系统板上焊的也是8MHz的晶振
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 16:58:14 | 显示全部楼层
[mw_shl_code=c,true] int main(void)
{
        u8 t=0,report=1;                        //默认开启上报
        //u8 key;
        float pitch,roll,yaw;                 //欧拉角
        short aacx,aacy,aacz;                //加速度传感器原始数据
        short gyrox,gyroy,gyroz;        //陀螺仪原始数据
        short temp;                                        //温度            
         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init();                     //延时函数初始化          
        uart_init(115200);                 //串口初始化为9600
        usmart_dev.init(72);                //初始化USMART
        LED_Init();                                          //初始化与LED连接的硬件接口
        KEY_Init();                                        //初始化按键
        MPU_Init();                                        //初始化MPU6050

        while(1)
        {
                if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
                {
                        temp=MPU_Get_Temperature();        //得到温度值
                        MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度传感器数据
                        MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺仪数据
                        if(report)
                        {
                                mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
                        }
                        if(report)
                        {
                                usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
                        }

                        }
               
                t++;
        }        

[/mw_shl_code]主函数的代码如下
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 16:58:58 | 显示全部楼层
IIC通信使用PB10 PB11的串口
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 21:32:38 | 显示全部楼层
DreamWaterPro 发表于 2018-8-17 19:30
为了彻底排除是波特率的问题,楼主可以在程序中向串口发送一段固定的字符,例如"test"等等,如果串口助手能 ...

谢谢你的指导,果然,输出test的时候能够正常输出。然后定义那个ID输出之后,十六进制全都为FF
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 21:38:10 | 显示全部楼层
DreamWaterPro 发表于 2018-8-17 19:30
为了彻底排除是波特率的问题,楼主可以在程序中向串口发送一段固定的字符,例如"test"等等,如果串口助手能 ...

[mw_shl_code=c,true]void MPU_IIC_Delay(void)
{
        delay_us(2);
}

//初始化IIC
void MPU_IIC_Init(void)
{                                             
  GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTC时钟
               
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;         // 端口配置 //原来分别是12 11
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIO
       
  GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);                                                 //PB10,PB11 输出高       

}
//产生IIC起始信号
void MPU_IIC_Start(void)
{
        MPU_SDA_OUT();     //sda线输出
        MPU_IIC_SDA=1;                    
        MPU_IIC_SCL=1;
        MPU_IIC_Delay();
        MPU_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        MPU_IIC_Delay();
        MPU_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}          
//产生IIC停止信号
void MPU_IIC_Stop(void)
{
        MPU_SDA_OUT();//sda线输出
        MPU_IIC_SCL=0;
        MPU_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        MPU_IIC_Delay();
        MPU_IIC_SCL=1;  
        MPU_IIC_SDA=1;//发送I2C总线结束信号
        MPU_IIC_Delay();                                                                  
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
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;  
}
//产生ACK应答
void MPU_IIC_Ack(void)
{
        MPU_IIC_SCL=0;
        MPU_SDA_OUT();
        MPU_IIC_SDA=0;
        MPU_IIC_Delay();
        MPU_IIC_SCL=1;
        MPU_IIC_Delay();
        MPU_IIC_SCL=0;
}
//不产生ACK应答                    
void MPU_IIC_NAck(void)
{
        MPU_IIC_SCL=0;
        MPU_SDA_OUT();
        MPU_IIC_SDA=1;
        MPU_IIC_Delay();
        MPU_IIC_SCL=1;
        MPU_IIC_Delay();
        MPU_IIC_SCL=0;
}                                                                              
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答                          
void MPU_IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        MPU_SDA_OUT();             
    MPU_IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        MPU_IIC_SDA=(txd&0x80)>>7;
        txd<<=1;           
                MPU_IIC_SCL=1;
                MPU_IIC_Delay();
                MPU_IIC_SCL=0;       
                MPU_IIC_Delay();
    }         
}             
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 MPU_IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        MPU_SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
        {
        MPU_IIC_SCL=0;
        MPU_IIC_Delay();
                MPU_IIC_SCL=1;
        receive<<=1;
        if(MPU_READ_SDA)receive++;   
                MPU_IIC_Delay();
    }                                         
    if (!ack)
        MPU_IIC_NAck();//发送nACK
    else
        MPU_IIC_Ack(); //发送ACK   
    return receive;
}
[/mw_shl_code]
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 21:50:25 | 显示全部楼层
找到一个问题了,MPU6050初始化失败,这个这么解决呢?
回复

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-7-29
在线时间
8 小时
 楼主| 发表于 2018-8-17 21:53:11 | 显示全部楼层
Jeffrey888 发表于 2018-8-17 21:50
找到一个问题了,MPU6050初始化失败,这个这么解决呢?

mpu_dmp_init(void)函数里面有个一个自检,然后里面到if(mpu_init)就跳出来了
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-18 08:15:04 | 显示全部楼层
Jeffrey888 发表于 2018-8-17 21:53
mpu_dmp_init(void)函数里面有个一个自检,然后里面到if(mpu_init)就跳出来了

在单片机初始化MPU6050的时候,保持传感器芯片保持水平试一试。
十六进制带我飞。
回复

使用道具 举报

8

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2018-9-27
在线时间
39 小时
发表于 2019-11-5 18:20:30 | 显示全部楼层
大哥,一个问题,哎,查了好久
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-9-29
在线时间
2 小时
发表于 2020-3-16 16:12:11 | 显示全部楼层
例程中一部分输出自定义帧的内容,这是用于匿名四轴上位机调试的,可以屏蔽一下。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 15:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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