野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8700|回复: 11

stm32F103c8t6 I2C通讯MPU6050 引脚都为开漏输出 读IDR位一直为1

[复制链接]
发表于 2022-1-17 22:05:25 | 显示全部楼层 |阅读模式
程序是I2C读MPU6050的原始数据,程序运行后读MPU6050设备ID错误,后自己发现等待ACK一直是高电平(即PB11_IDR位一直为1),第一次使用I2C,不知道是什么原因了,还请论坛友人帮忙看下,谢谢!

引脚的定义:
野火论坛202201172151048174..png

I2C延时:
野火论坛202201172151547405..png

引脚初始化:
123.JPG

字发送函数
野火论坛202201172141078746..png

在字发送函数增加了一行打印信息,发现SDA的IDR位一直是高的(即位11 PB11),读串口如下,发送的是MPU6050设备地址(0x68<<1):11010000(末尾写0),ODR是正确的,但是IDR一直是高,没有随引脚变化,通讯不通,个人感觉应该出在这个地方,还是帮忙看下!
野火论坛202201172159288100..png 野火论坛202201172201531713..png




回复

使用道具 举报

发表于 2022-1-18 12:26:12 | 显示全部楼层
把引脚设置为推挽输出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-18 12:50:09 | 显示全部楼层
渣渣川 发表于 2022-1-18 12:26
把引脚设置为推挽输出

都设置推挽输出了,用SDA_OUT,配置为输出模式,SDA_IN 配置为输入模式的方式,发送字节MPU6050就是没有应答
回复 支持 反对

使用道具 举报

发表于 2022-1-18 16:49:11 | 显示全部楼层
你发送的数据是不是不对,把你完整的发送函数写出来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-18 21:43:16 | 显示全部楼层
渣渣川 发表于 2022-1-18 16:49
你发送的数据是不是不对,把你完整的发送函数写出来

[attach] i2c函数.zip (7.43 KB, 下载次数: 10)

[/attach]
还请帮忙看下,万分感谢!实在是看不出是什么原因,已经ta了逻辑分析仪
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-18 21:48:46 | 显示全部楼层
i2c函数这个已经按火哥的程序抄写了一遍了,还是不对,读不到MPU6050ID
回复 支持 反对

使用道具 举报

发表于 2022-1-19 09:42:07 | 显示全部楼层
//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;
}
回复 支持 反对

使用道具 举报

发表于 2022-1-19 09:45:17 | 显示全部楼层
如果你的引脚设置的是输出模式,从机要拉SDA的话要切换成输入模式的,我发一个我的,你自己试试吧
回复 支持 反对

使用道具 举报

发表于 2022-1-19 09:47:36 | 显示全部楼层
smart_huapen.rar (9.6 MB, 下载次数: 30)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-19 11:17:19 | 显示全部楼层
vonbu 发表于 2022-1-18 21:43
[/attach]
还请帮忙看下,万分感谢!实在是看不出是什么原因,已经ta了逻辑分析仪
...

野火论坛202201191116443200..png
引脚配置下可以读到ID了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-19 11:21:19 | 显示全部楼层
我引脚配置直接把GPIO_InitStructure.Mode = LL_GPIO_OUTPUT_OPENDRAIN;
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 21:58 , Processed in 0.037682 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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