他大爷的!MPU6050只能写操作,读出来的全部都是FF
操蛋的MPU6050搞几天了,还是老样子{:huffy:}我参考其他I2C总线代码都不下10份了,没发现我写的I2C代码有什么问题{:dizzy:}
对于MPU6050所需要注意的是初始化时要有足够的延时,我TMD都延时快10秒钟了,MPU6050就一点反应没有!{:mad:}
问题到底在哪?{:cry:} 说不定,连写都没写进去 自已焊的芯片, 还是买的模块? 焊的话 确认你没焊坏(焊接时间过长 高温损坏)???????????? JoshuaAstray 发表于 2016-7-14 15:05
说不定,连写都没写进去
我确定写进去了!
因为,我将最后一位器件地址A0改变高低电平的时候,是检测ACK的时候会有反应的 SkyGz 发表于 2016-7-14 15:07
自已焊的芯片, 还是买的模块? 焊的话 确认你没焊坏(焊接时间过长 高温损坏)???????????? ...
自己焊的板子带的芯片焊了4块板子,测试结果都一个鸟样!
最后实在是没辙了,就又买了MPU6050模块,结果也是一样。太坑爹了!{:mad:} 那肯定是楼主的问题了,用GPIO模拟I2C试试 yerrmin 发表于 2016-7-14 15:18
那肯定是楼主的问题了,用GPIO模拟I2C试试
使用的是GPIO模拟I2C实现的。 我用示波器查看波形,看到的时序都是正确的,就读出时的波形都是高电平 写器件地址
WHO_AM_I
读器件地址
读数据 治好了我多年的颈椎 huangqi412 发表于 2016-7-14 15:38
治好了我多年的颈椎
你是指什么? 哈哈,说的是你的步步高的波形图片呀,就不能打横放平吗?
yiwei0397 发表于 2016-7-14 15:44
你是指什么?
网上一搜一大把有关STM32+6050的贴。。。 建议DOWN一个下来,找个C8T6飞几根线用别人的电路和程序试试。。。 huangqi412 发表于 2016-7-14 15:51
网上一搜一大把有关STM32+6050的贴。。。 建议DOWN一个下来,找个C8T6飞几根线用别人的电路和程序试试 ...
我没想明白的是我的I2C库有什么问题?我对比了别人的库,没发现有什么不对的地方啊 波形没看出有不对的地方啊 本帖最后由 yiwei0397 于 2016-7-14 16:13 编辑
newlife2lyf 发表于 2016-7-14 15:50
哈哈,说的是你的步步高的波形图片呀,就不能打横放平吗?
我重新上传图片
写器件
=====================
写地址
=====================
读器件
=====================
读数据
是不是 IIC地址 不对, 所以读不到数据, 我以前也试过..
地址有两种方式...
#define MPU6050_Addr 0xD0 //定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改 0x68 SkyGz 发表于 2016-7-14 16:28
是不是 IIC地址 不对, 所以读不到数据, 我以前也试过..
地址有两种方式...
从波形上已经看出,地址是0xD0了。我写的代码应该是没错的{:sleepy:} MPU6050初始化还需要注意什么吗? MPU6050会不会很容易坏? 软硬都要排查 核对下IC的工作电压和IO电压,我碰到过IO电平超过额定电压就只能读写,IC不工作的情况 买了模块都一样,用的什么MCU?IIC电路是什么样的,我焊过几个上去都没事 zengyi703 发表于 2016-7-14 18:08
买了模块都一样,用的什么MCU?IIC电路是什么样的,我焊过几个上去都没事
中间那个模块是我买的,买了4块
两边的模块,是我自己做的。
我做的模块和买的模块,读出来的数据都是0xFF{:sweat:}
问题是用示波器查看,没发现时序有问题! zengyi703 发表于 2016-7-14 18:08
买了模块都一样,用的什么MCU?IIC电路是什么样的,我焊过几个上去都没事
芯片使用的是STM32F103C8T6 这芯片焊得…… rf_smart 发表于 2016-7-14 18:48
这芯片焊得……
总共焊接5个。5个都焊接成功。
只是有1个无法写操作ACK响应,其余4个写操作有ACK响应但是都是读操作为0xFF
{:sweat:} 测试版,电烙铁焊接无所谓的。只要通了就行。
等成品时,再过回流焊. 感觉还是楼主的IIC协议(软件)有问题,再好好找原因吧。注意一下AD0怎么接的,确定好对应地址 shiyuzuxia1111 发表于 2016-7-14 19:07
感觉还是楼主的IIC协议(软件)有问题,再好好找原因吧。注意一下AD0怎么接的,确定好对应地址 ...
从波形上,没看出协议问题在哪。
器件地址0xD0要是不对,是不会有ACK响应的。但是在波形上看,确实是响应ACK了。
我将0xD0的最低位A0引脚接到高电平,立马就出现器件不响应ACK。说明我写入的地址是对的。 这个MPU6050芯片还有什么需要注意的地方吗? 你是DMP嘛,可以尝试初始化后延时一段时间,最好来个十来秒{:lol:} IIC驱动不对 IIC驱动不对 shiyuzuxia1111 发表于 2016-7-14 20:02
你是DMP嘛,可以尝试初始化后延时一段时间,最好来个十来秒
试过了,不行{:sweat:} lanlibo 发表于 2016-7-14 20:18
IIC驱动不对
哪里不对?请指点一下 把代码贴出来让大家参考 LZ淡定。 一定先用你最熟悉的MCU搞定,有时不一定是时序的问题。 拿逻辑分析仪看看,6050这么多人用,不用怀疑它的问题 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; //返回
} HZKJ 发表于 2016-7-14 20:37
LZ淡定。 一定先用你最熟悉的MCU搞定,有时不一定是时序的问题。
我用的是STM32F103C8T6,这可芯片是使用的比较多的 记得IO设置为开漏输出,可以直接读状态,不用切换输入模式 楼主,是你的问题,别怪6050,哈哈 一飞 发表于 2016-7-14 22:43
记得IO设置为开漏输出,可以直接读状态,不用切换输入模式
我已经试过了
1,SCL SDA都设置成开漏模式
2,SCL推挽模式 SDA开漏模式,
两种方式都试过了 chenliangliang_ 发表于 2016-7-14 22:50
楼主,是你的问题,别怪6050,哈哈
关键是,我想知道问题在哪。{:sleepy:} 在mpu6050模块的电源加上个电解电容试试看 xujihu 发表于 2016-7-14 22:54
在mpu6050模块的电源加上个电解电容试试看
我使用新买的MPU6050模块,也是我做的板子一样只读出0xFF 我使用新买的MPU6050模块,也是和我做的板子一样只读出0xFF yiwei0397 发表于 2016-7-14 23:17
我使用新买的MPU6050模块,也是和我做的板子一样只读出0xFF
以前碰到过这个问题,可能是你电源不够好,试试用电脑供电看看 xujihu 发表于 2016-7-15 00:45
以前碰到过这个问题,可能是你电源不够好,试试用电脑供电看看
刚看了一下,我做的板子上面使用的是AMS1117,我买的模块上面是一个LDO,电源都很简洁,感觉不像是电源问题。 用松香还是焊膏焊板?用洗板水洗干净试试。 qiufeng 发表于 2016-7-15 01:01
用松香还是焊膏焊板?用洗板水洗干净试试。
我用的是松香,焊膏没敢用,担心吸潮。
电路板上和MPU6050的连线引脚焊盘太细。担心板子质量问题,洗板水的话会引起焊盘脱落,已经废掉了一块板子(洗掉了焊盘),所以没有再用洗板水
玩了这么多年单片机,竟然掉沟里了{:sleepy:} yiwei0397 发表于 2016-7-15 01:18
我用的是松香,焊膏没敢用,担心吸潮。
电路板上和MPU6050的连线引脚焊盘太细。担心板子质量问题,洗板水 ...
哪里做的板子?怕焊盘脱落可以用棉球蘸洗板水来擦洗。 qiufeng 发表于 2016-7-15 01:21
哪里做的板子?怕焊盘脱落可以用棉球蘸洗板水来擦洗。
捷多邦做的,这种厂家只能算是便宜,质量谈不上。
我新买的模块输出也是一样只读出0xFF scl和sda接上拉了没? 我估计你是没接……如果没接的话接上。如果已经接了的话,调整一下阻值,哈。我 b3,b4,b5,a15这几个口不要用 肯定是程序问题 理论上的时序如下:
START
器件地址&写
寄存器地址
第二个START <-----你没有这一步
器件地址&读
数据内容
END
+++++++++++++++++
原因:
你的驱动程序中START部分仅仅是将SDA拉低后再将SCL拉低,没有保证此时SCL处于高电平状态,
只有当SCL为高电平时SDA的下降沿才表示起始信号,
所以START函数应该先将SCL置高,在将SDA拉低,然后SCL拉低。
你试试,不确定还有没有其他问题。 我也出现过这种情况。。如果你确认程序问题。一个是你看看初始化每条语句加上延迟。二。是把编译器的优化等级关掉。~~~还不行就啦啦啦啦啦啦 用过几次,taobao随便买的货,没出现过FF的问题 用过没出现读不出来的问题啊,我现在用MPU6500,用原子哥的程序就能读 对了楼主,还可以尝试一下上电延一段时间后 再初始化 不要死钻牛角尖赶紧网上下两个工程测试 tongdayusu 发表于 2016-7-15 03:57
我估计你是没接……如果没接的话接上。如果已经接了的话,调整一下阻值,哈。我 ...
可以确认,不是上拉电阻的事,新买的MPU6050模块也是只读出0xFF 恋芜 发表于 2016-7-15 04:10
b3,b4,b5,a15这几个口不要用
用的是PB10,PB11 fuquan_dai 发表于 2016-7-15 08:52
肯定是程序问题
问题出在哪,是我想知道的。请指出来。我已经卡在MPU6050,没办法做后面的算法程序,有些无奈{:sleepy:} samo110 发表于 2016-7-15 09:17
理论上的时序如下:
START
器件地址&写
我上面的帖子已经贴出来我的程序了。读操作是有加再次“开始”的代码 如果是标准IIC时序那就换个其他常用的IIC接口的芯片来测试下 程序方面。 这种掉坑里,很正常的,哪有不掉坑的工程师,不管工作年限多少。 yiwei0397 发表于 2016-7-15 16:53
问题出在哪,是我想知道的。请指出来。我已经卡在MPU6050,没办法做后面的算法程序,有些无奈...
不想看程序。。。 yiwei0397 发表于 2016-7-15 16:54
我上面的帖子已经贴出来我的程序了。读操作是有加再次“开始”的代码
真是对你无语了,你贴出问题来,坛友帮你分析问题,你都不认真看的么。。。 本人觉得软件模拟的I2C延迟不对就很容易这样 网上不是一堆这种代码 yiwei0397 发表于 2016-7-14 22:52
关键是,我想知道问题在哪。
把I2C接口设置为推挽输出?
从这里看,我认为问题的关键是:楼主已经乱了阵脚。
yiwei0397 发表于 2016-7-15 16:54
我上面的帖子已经贴出来我的程序了。读操作是有加再次“开始”的代码
楼主搞定了吗,友情提醒一下,不是你加了再次开始的代码就一定有再次开始的时序,你的开始代码就不对的。 samo110 发表于 2016-7-18 09:51
楼主搞定了吗,友情提醒一下,不是你加了再次开始的代码就一定有再次开始的时序,你的开始代码就不对的。 ...
你好,问题出在我的IO口设置上面,我现在使用的是库函数GPIO_ResetBits和GPIO_SetBits,还改动了“开始”函数,现在好了。
yiwei0397 发表于 2016-7-18 20:23
你好,问题出在我的IO口设置上面,我现在使用的是库函数GPIO_ResetBits和GPIO_SetBits,还改动了“开始” ...
好了就对了{:smile:} huangqi412 发表于 2016-7-14 15:38
治好了我多年的颈椎
我也想说点什么,没什么说的,你这句搞笑 laoshuhunya 发表于 2016-7-17 11:11
把I2C接口设置为推挽输出?
从这里看,我认为问题的关键是:楼主已经乱了阵脚。
在输出时,我使用推挽是可行的!
I2C没有说不允许推挽,而且在输出时推挽的信号要比其他抗干扰能力强一些. mpu6050 的确太小 焊工不好搞···
·找出问题的过程值得学习··
页:
[1]