OpenEdv-开源电子网

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

STM32 驱动MPU6050,模拟IIC读写24C02没问题,但是读MPU6050数据时返回总是257,求大神解答

[复制链接]

19

主题

88

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2013-7-15
在线时间
0 小时
发表于 2013-9-3 22:57:44 | 显示全部楼层 |阅读模式
STM32 驱动MPU6050,模拟IIC读写24C02没问题,但是读MPU6050数据时返回总是257,,调试了两天了,还是一个样子,MPU没有坏,在51单片机上可以使用

但是到了STM32就不行了,模拟的那两个GPIO口没有连接其他器件,只有MPU6050,我是对照着那个可以使用的51的程序修改成STM32的,读MPU6050还是不可以,读写24C02就可以






void IIC_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);    //失能I2C1时钟
//  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);   //失能SWJ引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//这里设置成推挽输出,开漏模式的也尝试过还是不行
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);   //GPIOB6,7推挽输出

GPIO_SetBits(GPIOA,GPIO_Pin_5 | GPIO_Pin_7);  //上拉
}
//**************************************
//I2C起始信号
//**************************************
void IIC_Start(void)
{
    SDA_GPIO_OUT();
SDA_SET;                    //拉高数据线
    SCL_SET;                    //拉高时钟线
    delay_us(6);                 //延时
    SDA_CLR;                    //产生下降沿
    delay_us(6);                 //延时
    SCL_CLR;                    //拉低时钟线
}
//**************************************
//I2C停止信号
//**************************************
void IIC_Stop(void)
{
    SDA_GPIO_OUT();
SDA_CLR;                    //拉低数据线
    SCL_CLR;                    //拉高时钟线
    delay_us(6);   
SCL_CLR;              //延时
    SDA_SET;                    //产生上升沿
    delay_us(6);                 //延时
}
//**************************************
//I2C发送应答信号
//入口参数:NAK)
//**************************************
void IIC_NAck(void)
{
    SDA_GPIO_OUT();
SDA_SET;                  //写应答信号
SCL_SET;                    //拉高时钟线
    delay_us(6);                 //延时
    SCL_CLR;                    //拉低时钟线
    delay_us(6);                 //延时
}
/***发送应答信号**/
void IIC_ACK(void)
{
    SDA_GPIO_OUT();
SDA_CLR;
SCL_SET;                    //拉高时钟线
    delay_us(6);                 //延时
    SCL_CLR;                    //拉低时钟线
    delay_us(6);                 //延时
}
//**************************************
//I2C接收应答信号
//**************************************
u8 IIC_Wait_Ack(void)
{
u8 dat;
SDA_GPIO_IN(); //设置为输入
SCL_SET;                    //拉高时钟线
    delay_us(6);                 //延时
    if(READ_SDA)
dat=1;
else
dat=0;                   //读应答信号
    SCL_CLR;                    //拉低时钟线
    delay_us(6);                 //延时
return dat;
}
//**************************************
//向I2C总线发送一个字节数据
//**************************************
void IIC_Write_Byte(u8 Byte)
{
    u8 i;
SDA_GPIO_OUT();
    for (i=0; i<8; i++)         //8位计数器
    {
        if(Byte&0x80)
SDA_SET;
else
SDA_CLR;
        SCL_SET;                //拉高时钟线
        delay_us(6);             //延时
        SCL_CLR;                //拉低时钟线
        delay_us(6);             //延时
Byte<<=1;              //移出数据的最高位
    }
    IIC_Wait_Ack(); //接收应答信号
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
u8 IIC_Read_Byte(void)
{
    u8 i;
    u8 dat = 0;
SDA_GPIO_IN();
    SDA_SET;                    //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL_SET;                //拉高时钟线
        delay_us(6);             //延时
        dat |= READ_SDA;             //读数据               
        SCL_CLR;                //拉低时钟线
        delay_us(6);             //延时
    }
    return dat;
}

void Single_WriteI2C(u8 REG_Address,u8 REG_data)
{
IIC_Start();                    //起始信号
    IIC_Write_Byte(SlaveAddress);   //发送设备地址+写信号
    IIC_Wait_Ack(); //等待应答信号
IIC_Write_Byte(REG_Address);    //内部寄存器地址
    IIC_Wait_Ack();
IIC_Write_Byte(REG_data);       //内部寄存器数据
IIC_Wait_Ack();
    IIC_Stop();                     //发送停止信号
delay_ms(1);
}   
//**************************************
//从I2C设备读取一个字节数据
//**************************************
u8 Single_ReadI2C(u8 REG_Address)
{
u8 REG_data;
IIC_Start();
IIC_Write_Byte(SlaveAddress);    //AT24Cxx写命令,AT24CXX地址
IIC_Wait_Ack();
IIC_Write_Byte(REG_Address);
IIC_Wait_Ack();
IIC_Start();
IIC_Write_Byte(SlaveAddress+1); //AT24Cxx读命令,AT24CXX地址
IIC_Wait_Ack();
REG_data=IIC_Read_Byte();
IIC_NAck();
IIC_Stop();  
return REG_data;
}
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050(void)
{
Single_WriteI2C(PWR_MGMT_1,0x00); //解除休眠状态
delay_ms(100);
Single_WriteI2C(GYRO_CONFIG,0x18); //陀螺仪不自检,配置陀螺仪满量程正负2000°/S
delay_ms(50);
Single_WriteI2C(ACCEL_CONFIG,0x01);//加速度计不自检,配置加速度计满量程2g
delay_ms(50);
Single_WriteI2C(SMPLRT_DIV,0x07); //采样频率分频器
delay_ms(50);
Single_WriteI2C(CONFIG,0x06); //低通滤波频率
delay_ms(50);
}






MPU6050陀螺仪.zip

2.48 MB, 下载次数: 2250

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-3 23:09:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

44

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
382
金钱
382
注册时间
2013-8-31
在线时间
14 小时
发表于 2013-9-4 09:38:14 | 显示全部楼层
直接用串口MPU6050模块吧,淘宝上面已经有卖的了。
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-10-4
在线时间
2 小时
发表于 2013-10-5 14:24:21 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我也是这种情况   求解啊
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-10-16
在线时间
0 小时
发表于 2013-10-16 07:52:27 | 显示全部楼层
回复【楼主位】和平清风:
---------------------------------
请问是怎么解决的?
回复 支持 反对

使用道具 举报

19

主题

88

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2013-7-15
在线时间
0 小时
 楼主| 发表于 2013-10-16 20:50:29 | 显示全部楼层
没解决
回复 支持 反对

使用道具 举报

19

主题

88

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2013-7-15
在线时间
0 小时
 楼主| 发表于 2013-10-16 20:51:01 | 显示全部楼层
回复【5楼】stone_zzuli:
---------------------------------
一样  没有解决
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-5-31
在线时间
0 小时
发表于 2014-6-6 19:26:27 | 显示全部楼层
回复【7楼】和平清风:
---------------------------------
我也遇到了一样的问题,请问楼主解决了吗?
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-8-24 09:59:17 | 显示全部楼层
楼主    我也遇到这个情况  请问你是咋解决的啊  我也整了几天了
回复 支持 反对

使用道具 举报

11

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2011-9-4
在线时间
0 小时
发表于 2014-8-24 11:37:55 | 显示全部楼层
你可能是把IIC地址搞错了,24C02的地址是0xa0,你查一下MPU6050器件地址是多少,改一下就可以了。
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-8-24 15:35:06 | 显示全部楼层
回复【10楼】DGZL:
---------------------------------
他这个是把地址弄错了  但我这个不是    帮我看下
http://www.openedv.com/posts/list/0/38492.htm#217733
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 14:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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