yiwei0397 发表于 2016-7-14 14:40:14

他大爷的!MPU6050只能写操作,读出来的全部都是FF

操蛋的MPU6050搞几天了,还是老样子{:huffy:}
我参考其他I2C总线代码都不下10份了,没发现我写的I2C代码有什么问题{:dizzy:}
对于MPU6050所需要注意的是初始化时要有足够的延时,我TMD都延时快10秒钟了,MPU6050就一点反应没有!{:mad:}
问题到底在哪?{:cry:}

JoshuaAstray 发表于 2016-7-14 15:05:43

说不定,连写都没写进去

SkyGz 发表于 2016-7-14 15:07:51

自已焊的芯片, 还是买的模块?   焊的话 确认你没焊坏(焊接时间过长 高温损坏)????????????

yiwei0397 发表于 2016-7-14 15:07:55

JoshuaAstray 发表于 2016-7-14 15:05
说不定,连写都没写进去

我确定写进去了!
因为,我将最后一位器件地址A0改变高低电平的时候,是检测ACK的时候会有反应的

yiwei0397 发表于 2016-7-14 15:15:05

SkyGz 发表于 2016-7-14 15:07
自已焊的芯片, 还是买的模块?   焊的话 确认你没焊坏(焊接时间过长 高温损坏)???????????? ...

自己焊的板子带的芯片焊了4块板子,测试结果都一个鸟样!
最后实在是没辙了,就又买了MPU6050模块,结果也是一样。太坑爹了!{:mad:}

yerrmin 发表于 2016-7-14 15:18:12

那肯定是楼主的问题了,用GPIO模拟I2C试试

yiwei0397 发表于 2016-7-14 15:19:39

yerrmin 发表于 2016-7-14 15:18
那肯定是楼主的问题了,用GPIO模拟I2C试试

使用的是GPIO模拟I2C实现的。

yiwei0397 发表于 2016-7-14 15:20:54

我用示波器查看波形,看到的时序都是正确的,就读出时的波形都是高电平

yiwei0397 发表于 2016-7-14 15:38:26

写器件地址
WHO_AM_I
读器件地址
读数据

huangqi412 发表于 2016-7-14 15:38:51

治好了我多年的颈椎

yiwei0397 发表于 2016-7-14 15:44:18

huangqi412 发表于 2016-7-14 15:38
治好了我多年的颈椎

你是指什么?

newlife2lyf 发表于 2016-7-14 15:50:00

哈哈,说的是你的步步高的波形图片呀,就不能打横放平吗?

huangqi412 发表于 2016-7-14 15:51:06

yiwei0397 发表于 2016-7-14 15:44
你是指什么?

网上一搜一大把有关STM32+6050的贴。。。    建议DOWN一个下来,找个C8T6飞几根线用别人的电路和程序试试。。。

yiwei0397 发表于 2016-7-14 16:04:07

huangqi412 发表于 2016-7-14 15:51
网上一搜一大把有关STM32+6050的贴。。。    建议DOWN一个下来,找个C8T6飞几根线用别人的电路和程序试试 ...

我没想明白的是我的I2C库有什么问题?我对比了别人的库,没发现有什么不对的地方啊

yiwei0397 发表于 2016-7-14 16:06:45

波形没看出有不对的地方啊

yiwei0397 发表于 2016-7-14 16:11:12

本帖最后由 yiwei0397 于 2016-7-14 16:13 编辑

newlife2lyf 发表于 2016-7-14 15:50
哈哈,说的是你的步步高的波形图片呀,就不能打横放平吗?

我重新上传图片

写器件
=====================

写地址
=====================

读器件
=====================

读数据

SkyGz 发表于 2016-7-14 16:28:55

是不是 IIC地址 不对, 所以读不到数据, 我以前也试过..
地址有两种方式...

#define        MPU6050_Addr   0xD0          //定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改 0x68

yiwei0397 发表于 2016-7-14 16:37:19

SkyGz 发表于 2016-7-14 16:28
是不是 IIC地址 不对, 所以读不到数据, 我以前也试过..
地址有两种方式...



从波形上已经看出,地址是0xD0了。我写的代码应该是没错的{:sleepy:}

yiwei0397 发表于 2016-7-14 17:23:14

MPU6050初始化还需要注意什么吗?

haowei029 发表于 2016-7-14 17:27:03

MPU6050会不会很容易坏?

cyberkyg 发表于 2016-7-14 17:51:37

软硬都要排查      

chess01 发表于 2016-7-14 17:55:52

核对下IC的工作电压和IO电压,我碰到过IO电平超过额定电压就只能读写,IC不工作的情况

zengyi703 发表于 2016-7-14 18:08:33

买了模块都一样,用的什么MCU?IIC电路是什么样的,我焊过几个上去都没事

yiwei0397 发表于 2016-7-14 18:38:21

zengyi703 发表于 2016-7-14 18:08
买了模块都一样,用的什么MCU?IIC电路是什么样的,我焊过几个上去都没事

中间那个模块是我买的,买了4块
两边的模块,是我自己做的。

yiwei0397 发表于 2016-7-14 18:40:07

我做的模块和买的模块,读出来的数据都是0xFF{:sweat:}
问题是用示波器查看,没发现时序有问题!

yiwei0397 发表于 2016-7-14 18:43:12

zengyi703 发表于 2016-7-14 18:08
买了模块都一样,用的什么MCU?IIC电路是什么样的,我焊过几个上去都没事

芯片使用的是STM32F103C8T6

rf_smart 发表于 2016-7-14 18:48:41

这芯片焊得……

yiwei0397 发表于 2016-7-14 18:54:25

rf_smart 发表于 2016-7-14 18:48
这芯片焊得……

总共焊接5个。5个都焊接成功。
只是有1个无法写操作ACK响应,其余4个写操作有ACK响应但是都是读操作为0xFF
{:sweat:}

yiwei0397 发表于 2016-7-14 18:56:44

测试版,电烙铁焊接无所谓的。只要通了就行。
等成品时,再过回流焊.

shiyuzuxia1111 发表于 2016-7-14 19:07:28

感觉还是楼主的IIC协议(软件)有问题,再好好找原因吧。注意一下AD0怎么接的,确定好对应地址

yiwei0397 发表于 2016-7-14 19:14:14

shiyuzuxia1111 发表于 2016-7-14 19:07
感觉还是楼主的IIC协议(软件)有问题,再好好找原因吧。注意一下AD0怎么接的,确定好对应地址 ...

从波形上,没看出协议问题在哪。
器件地址0xD0要是不对,是不会有ACK响应的。但是在波形上看,确实是响应ACK了。
我将0xD0的最低位A0引脚接到高电平,立马就出现器件不响应ACK。说明我写入的地址是对的。

yiwei0397 发表于 2016-7-14 19:36:12

这个MPU6050芯片还有什么需要注意的地方吗?

shiyuzuxia1111 发表于 2016-7-14 20:02:38

你是DMP嘛,可以尝试初始化后延时一段时间,最好来个十来秒{:lol:}

lanlibo 发表于 2016-7-14 20:18:22

IIC驱动不对

lanlibo 发表于 2016-7-14 20:18:53

IIC驱动不对

yiwei0397 发表于 2016-7-14 20:20:36

shiyuzuxia1111 发表于 2016-7-14 20:02
你是DMP嘛,可以尝试初始化后延时一段时间,最好来个十来秒

试过了,不行{:sweat:}

yiwei0397 发表于 2016-7-14 20:21:38

lanlibo 发表于 2016-7-14 20:18
IIC驱动不对

哪里不对?请指点一下

lanlibo 发表于 2016-7-14 20:26:53

把代码贴出来让大家参考

HZKJ 发表于 2016-7-14 20:37:21

LZ淡定。 一定先用你最熟悉的MCU搞定,有时不一定是时序的问题。

armfans 发表于 2016-7-14 21:00:31

拿逻辑分析仪看看,6050这么多人用,不用怀疑它的问题

yiwei0397 发表于 2016-7-14 21:41:22

lanlibo 发表于 2016-7-14 20:26
把代码贴出来让大家参考


void I2C_Start(void)
{
I2C_SDA_0;            
Delay(I2C_Delay);

I2C_SCL_0;         
Delay(I2C_Delay);
}
////////////////////////////////////////
void I2C_W_8Bit(u8 WriteData)
{
u8 i,j;

j = WriteData;

for(i=0; i<8; ++i)
{
    if((j&0x80)==0)   
    {
      I2C_SDA_0;      
    }
    else
    {
      I2C_SDA_1;
    }
    j <<= 1;
    Delay(I2C_Delay);
   
    I2C_SCL_1;   
    Delay(I2C_Delay);
   
    I2C_SCL_0;   
    Delay(I2C_Delay);
}
}
////////////////////////////////////////
u8 I2C_Check_ACK(void)
{
u8 Ack_Max;

Ack_Max = 0;

//输入模式
Set_I2C_SDA_IN;

I2C_SDA_1;   

I2C_SCL_1;                  //拉高
Delay(I2C_Delay);

//应答位
while( I2C_SDA_CaiJi_1 )    //
{
    if(Ack_Max < 3 )          //
    {
      ++Ack_Max;            //
    }
    else
    {
      Set_I2C_SDA_OUT;
      
      Delay(I2C_Delay);
      
      I2C_Stop();
      
      return U_DEFEAT;   //返回
    }
}

I2C_SCL_0;      
Set_I2C_SDA_OUT;

return U_SUCCEED;      //返回
}
////////////////////////////////////////
u8 I2C_R_8Bit(void)
{
u8 i;
u8 TempData;

TempData = 0;

//输入
Set_I2C_SDA_IN;            //输入

for(i=0; i<8; i++)          //一个字节
{
    I2C_SCL_1;            
    Delay(I2C_Delay);
   
    TempData <<= 1;      
   
    if( I2C_SDA_CaiJi_0 )   //如果“1”,则加“1”
    {
    }
    else
    {
      TempData++;             //自加“1”
    }
   
    I2C_SCL_0;         
    Delay(I2C_Delay);
}

Set_I2C_SDA_OUT;            //输出模式

return(TempData);         //返回数据
}
////////////////////////////////////////
void I2C_Ack(void)
{
I2C_SDA_0;             //
Delay(I2C_Delay);
   
I2C_SCL_1;             //
Delay(I2C_Delay);

I2C_SCL_0;             //
Delay(I2C_Delay);
}
void I2C_NoAck(void)
{
I2C_SDA_1;         
Delay(I2C_Delay);

I2C_SCL_1;
Delay(I2C_Delay);

I2C_SCL_0;             //
Delay(I2C_Delay);
}
void I2C_Stop(void)
{
I2C_SDA_0;             //
Delay(I2C_Delay);

I2C_SCL_1;             //
Delay(I2C_Delay);

I2C_SDA_1;             //
Delay(I2C_Delay);
}
////////////////////////////////////////
u8 MPU6050_R_Data(
                   u8   I2C_Device_No,
                   u8   Start_Addr,
                   u8*Array_Data,
                  )
{
u8 temp_Addr1;
u8 temp_I2C_Device;   //

temp_Addr1 = Start_Addr;

I2C_Start();

temp_I2C_Device= (I2C_Device_No&I2C_W); //写
I2C_W_8Bit( temp_I2C_Device );      //
if(I2C_Check_ACK() == U_DEFEAT)       //应答位
{
    return U_DEFEAT;                  //返回
}

I2C_W_8Bit( temp_Addr1 );             //
if(I2C_Check_ACK() == U_DEFEAT)       //应答位
{
    return U_DEFEAT;                  //返回
}

I2C_Start();

I2C_W_8Bit( I2C_Device_No|I2C_R );    //读
if(I2C_Check_ACK() == U_DEFEAT)
{
    return U_DEFEAT;                  //返回
}

//接收8位
*Array_Data       = I2C_R_8Bit();    //数据

I2C_NoAck();                         //非应答

I2C_Stop();            

return U_SUCCEED;                  //返回
}
////////////////////////////////////////
u8 MPU6050_W_Byte(
                   u8   I2C_A012_No,
                   u8   Start_Addr,
                   u8*Array_Data
               )
{
I2C_Start();

temp_I2C_Device= (I2C_Device_No&I2C_W); //写
I2C_W_8Bit( temp_I2C_Device );      //
if(I2C_Check_ACK() == U_DEFEAT)       //应答位
{
    return U_DEFEAT;                  //返回
}

I2C_W_8Bit( temp_Addr1 );             //
if(I2C_Check_ACK() == U_DEFEAT)       //应答位
{
    return U_DEFEAT;                  //返回
}

//写1个字节
I2C_W_8Bit( *Array_Data );      //
if(I2C_Check_ACK() == U_DEFEAT)
{
        return U_DEFEAT;                //返回
}

I2C_Stop();               

return U_SUCCEED;               //返回
}
////////////////////////////////////////
u8 Init_MPU6050(void)
{
u8 temp;

//复位MPU6050
temp = 0x80;
MPU6050_W_Byte(MPU6050_No,PWR_MGMT_1,&temp);   //
//Delay_M(150);
//Delay_M(100);
Delay_M(20); //NOP延时实现,时间足够长。

//写入解除休眠状态
temp = 0x00;
MPU6050_W_Byte(MPU6050_No,PWR_MGMT_1,&temp);   // 解除休眠状态
//Delay_M(150);
//Delay_M(100);
Delay_M(30);

// 陀螺仪采样率设置(125HZ)
temp = 0x07;
MPU6050_W_Byte(MPU6050_No,SMPLRT_DIV,&temp);   // 陀螺仪采样率设置(125HZ)
Delay_K(10);

// 低通滤波器频率设置(5HZ)
temp = 0x06;
MPU6050_W_Byte(MPU6050_No,CONFIG,&temp);         // 低通滤波器频率设置(5HZ)
Delay_K(10);

// 陀螺仪自检及检测范围设置
temp = 0x18;
MPU6050_W_Byte(MPU6050_No,GYRO_CONFIG,&temp);    // (不自检,16.4LSB/DBS/S)
Delay_K(10);

temp = 0x01;
MPU6050_W_Byte(MPU6050_No,ACCEL_CONFIG,&temp)
Delay_K(10);
}
////////////////////////////////////////
u8 MPU6050_ID(void)
{
u8 temp;

//检查MPU6050
if(MPU6050_R_Data(MPU6050_No,WHO_AM_I,&temp) == U_DEFEAT)    //应答
{
    return U_DEFEAT;                  //返回
}

//检查MPU6050的ID
if( temp != 0x68) //检查MPU6050的ID是否正常
{
    return U_DEFEAT;                  //返回
}

return U_SUCCEED;                     //返回
}

yiwei0397 发表于 2016-7-14 21:44:46

HZKJ 发表于 2016-7-14 20:37
LZ淡定。 一定先用你最熟悉的MCU搞定,有时不一定是时序的问题。

我用的是STM32F103C8T6,这可芯片是使用的比较多的

一飞 发表于 2016-7-14 22:43:53

记得IO设置为开漏输出,可以直接读状态,不用切换输入模式

chenliangliang_ 发表于 2016-7-14 22:50:29

楼主,是你的问题,别怪6050,哈哈

yiwei0397 发表于 2016-7-14 22:51:13

一飞 发表于 2016-7-14 22:43
记得IO设置为开漏输出,可以直接读状态,不用切换输入模式

我已经试过了

1,SCL SDA都设置成开漏模式
2,SCL推挽模式 SDA开漏模式,

两种方式都试过了

yiwei0397 发表于 2016-7-14 22:52:35

chenliangliang_ 发表于 2016-7-14 22:50
楼主,是你的问题,别怪6050,哈哈

关键是,我想知道问题在哪。{:sleepy:}

xujihu 发表于 2016-7-14 22:54:09

在mpu6050模块的电源加上个电解电容试试看

yiwei0397 发表于 2016-7-14 23:16:42

xujihu 发表于 2016-7-14 22:54
在mpu6050模块的电源加上个电解电容试试看

我使用新买的MPU6050模块,也是我做的板子一样只读出0xFF

yiwei0397 发表于 2016-7-14 23:17:14

我使用新买的MPU6050模块,也是和我做的板子一样只读出0xFF

xujihu 发表于 2016-7-15 00:45:02

yiwei0397 发表于 2016-7-14 23:17
我使用新买的MPU6050模块,也是和我做的板子一样只读出0xFF

以前碰到过这个问题,可能是你电源不够好,试试用电脑供电看看

yiwei0397 发表于 2016-7-15 00:50:38

xujihu 发表于 2016-7-15 00:45
以前碰到过这个问题,可能是你电源不够好,试试用电脑供电看看

刚看了一下,我做的板子上面使用的是AMS1117,我买的模块上面是一个LDO,电源都很简洁,感觉不像是电源问题。

qiufeng 发表于 2016-7-15 01:01:12

用松香还是焊膏焊板?用洗板水洗干净试试。

yiwei0397 发表于 2016-7-15 01:18:01

qiufeng 发表于 2016-7-15 01:01
用松香还是焊膏焊板?用洗板水洗干净试试。

我用的是松香,焊膏没敢用,担心吸潮。
电路板上和MPU6050的连线引脚焊盘太细。担心板子质量问题,洗板水的话会引起焊盘脱落,已经废掉了一块板子(洗掉了焊盘),所以没有再用洗板水

玩了这么多年单片机,竟然掉沟里了{:sleepy:}

qiufeng 发表于 2016-7-15 01:21:37

yiwei0397 发表于 2016-7-15 01:18
我用的是松香,焊膏没敢用,担心吸潮。
电路板上和MPU6050的连线引脚焊盘太细。担心板子质量问题,洗板水 ...

哪里做的板子?怕焊盘脱落可以用棉球蘸洗板水来擦洗。

yiwei0397 发表于 2016-7-15 01:28:11

qiufeng 发表于 2016-7-15 01:21
哪里做的板子?怕焊盘脱落可以用棉球蘸洗板水来擦洗。

捷多邦做的,这种厂家只能算是便宜,质量谈不上。
我新买的模块输出也是一样只读出0xFF

tongdayusu 发表于 2016-7-15 03:52:38

scl和sda接上拉了没?

tongdayusu 发表于 2016-7-15 03:57:43

我估计你是没接……如果没接的话接上。如果已经接了的话,调整一下阻值,哈。我

恋芜 发表于 2016-7-15 04:10:45

b3,b4,b5,a15这几个口不要用

fuquan_dai 发表于 2016-7-15 08:52:18

肯定是程序问题

samo110 发表于 2016-7-15 09:17:58

理论上的时序如下:
START
器件地址&写
寄存器地址
第二个START         <-----你没有这一步
器件地址&读
数据内容
END
+++++++++++++++++
原因:
你的驱动程序中START部分仅仅是将SDA拉低后再将SCL拉低,没有保证此时SCL处于高电平状态,
只有当SCL为高电平时SDA的下降沿才表示起始信号,
所以START函数应该先将SCL置高,在将SDA拉低,然后SCL拉低。

你试试,不确定还有没有其他问题。

pxclihai 发表于 2016-7-15 09:29:53

我也出现过这种情况。。如果你确认程序问题。一个是你看看初始化每条语句加上延迟。二。是把编译器的优化等级关掉。~~~还不行就啦啦啦啦啦啦

PRO 发表于 2016-7-15 09:46:54

用过几次,taobao随便买的货,没出现过FF的问题

gslzslhj 发表于 2016-7-15 10:31:32

用过没出现读不出来的问题啊,我现在用MPU6500,用原子哥的程序就能读

shiyuzuxia1111 发表于 2016-7-15 11:22:06

对了楼主,还可以尝试一下上电延一段时间后 再初始化

huangqi412 发表于 2016-7-15 11:54:28

不要死钻牛角尖赶紧网上下两个工程测试

yiwei0397 发表于 2016-7-15 16:50:06

tongdayusu 发表于 2016-7-15 03:57
我估计你是没接……如果没接的话接上。如果已经接了的话,调整一下阻值,哈。我 ...

可以确认,不是上拉电阻的事,新买的MPU6050模块也是只读出0xFF

yiwei0397 发表于 2016-7-15 16:50:50

恋芜 发表于 2016-7-15 04:10
b3,b4,b5,a15这几个口不要用

用的是PB10,PB11

yiwei0397 发表于 2016-7-15 16:53:09

fuquan_dai 发表于 2016-7-15 08:52
肯定是程序问题

问题出在哪,是我想知道的。请指出来。我已经卡在MPU6050,没办法做后面的算法程序,有些无奈{:sleepy:}

yiwei0397 发表于 2016-7-15 16:54:46

samo110 发表于 2016-7-15 09:17
理论上的时序如下:
START
器件地址&写


我上面的帖子已经贴出来我的程序了。读操作是有加再次“开始”的代码

kebaojun305 发表于 2016-7-15 17:07:53

如果是标准IIC时序那就换个其他常用的IIC接口的芯片来测试下 程序方面。    这种掉坑里,很正常的,哪有不掉坑的工程师,不管工作年限多少。

fuquan_dai 发表于 2016-7-15 22:27:13

yiwei0397 发表于 2016-7-15 16:53
问题出在哪,是我想知道的。请指出来。我已经卡在MPU6050,没办法做后面的算法程序,有些无奈...

不想看程序。。。

samo110 发表于 2016-7-16 20:09:10

yiwei0397 发表于 2016-7-15 16:54
我上面的帖子已经贴出来我的程序了。读操作是有加再次“开始”的代码

真是对你无语了,你贴出问题来,坛友帮你分析问题,你都不认真看的么。。。

hanzo852 发表于 2016-7-16 20:51:55

本人觉得软件模拟的I2C延迟不对就很容易这样

lnso 发表于 2016-7-16 21:37:25

网上不是一堆这种代码

laoshuhunya 发表于 2016-7-17 11:11:12

yiwei0397 发表于 2016-7-14 22:52
关键是,我想知道问题在哪。

把I2C接口设置为推挽输出?
从这里看,我认为问题的关键是:楼主已经乱了阵脚。

samo110 发表于 2016-7-18 09:51:25

yiwei0397 发表于 2016-7-15 16:54
我上面的帖子已经贴出来我的程序了。读操作是有加再次“开始”的代码

楼主搞定了吗,友情提醒一下,不是你加了再次开始的代码就一定有再次开始的时序,你的开始代码就不对的。

yiwei0397 发表于 2016-7-18 20:23:11

samo110 发表于 2016-7-18 09:51
楼主搞定了吗,友情提醒一下,不是你加了再次开始的代码就一定有再次开始的时序,你的开始代码就不对的。 ...

你好,问题出在我的IO口设置上面,我现在使用的是库函数GPIO_ResetBits和GPIO_SetBits,还改动了“开始”函数,现在好了。

samo110 发表于 2016-7-19 08:09:30

yiwei0397 发表于 2016-7-18 20:23
你好,问题出在我的IO口设置上面,我现在使用的是库函数GPIO_ResetBits和GPIO_SetBits,还改动了“开始” ...

好了就对了{:smile:}

PenTestTech 发表于 2016-7-19 08:36:33

huangqi412 发表于 2016-7-14 15:38
治好了我多年的颈椎

我也想说点什么,没什么说的,你这句搞笑

yiwei0397 发表于 2016-7-20 12:20:52

laoshuhunya 发表于 2016-7-17 11:11
把I2C接口设置为推挽输出?
从这里看,我认为问题的关键是:楼主已经乱了阵脚。



在输出时,我使用推挽是可行的!
I2C没有说不允许推挽,而且在输出时推挽的信号要比其他抗干扰能力强一些.

compass180 发表于 2016-7-21 09:14:29

mpu6050 的确太小 焊工不好搞···
·找出问题的过程值得学习··

页: [1]
查看完整版本: 他大爷的!MPU6050只能写操作,读出来的全部都是FF