• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

我买的mpu6050模块代码默认的是PA8/11引脚,想修改

70e33e033aa2dc6f 2018-08-26 浏览量:1721
想修改成为PB10/PB11的,代码作如下修改,但就是不能正常DMP获得欧拉角,引脚检查多次无误,应该是代码的问题,但就是不知道问题出在哪里,哪位大神给我看一下、下图:

1.png (19.82 KB 下载次数: 0)

iic.h

iic.h

2.png (21.86 KB 下载次数: 0)

2.png

移植出现:


mpu_set_sensor complete ......



我做了以下修改,还是不可以:

1.png

TIM截图20180827104715.png

#ifndef __I2C_H
#define __I2C_H
#include "sys.h"
 

   	   		   
//IO方向设置
#define SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}

//IO操作函数	 
#define IIC_SCL    PBout(10) //SCL
#define IIC_SDA    PBout(11) //SDA	 
#define READ_SDA   PBin(11)  //输入SDA 

//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号

void IIC_Write_One_Byte(u8 daddru8 addru8 data);
u8 IIC_Read_One_Byte(u8 daddru8 addr);	  
#endif
#include "I2C.h"
#include "delay.h"
  

//初始化IIC
void IIC_Init(void)
{					     
	GPIO_InitTypeDef GPIO_InitStructure;
	//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB ENABLE );	
	   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB &GPIO_InitStructure);
 
	IIC_SCL=1;
	IIC_SDA=1;

}
//产生IIC起始信号
void IIC_Start(void)
{
	SDA_OUT();     //sda线输出
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(4);
 	IIC_SDA=0;//START:when CLK is highDATA change form high to low 
	delay_us(4);
	IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)
{
	SDA_OUT();//sda线输出
	IIC_SCL=0;
	IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 	delay_us(4);
	IIC_SCL=1; 
	IIC_SDA=1;//发送I2C总线结束信号
	delay_us(4);							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
	u8 ucErrTime=0;
	SDA_IN();      //SDA设置为输入  
	IIC_SDA=1;delay_us(1);	   
	IIC_SCL=1;delay_us(1);	 
	while(READ_SDA)
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			IIC_Stop();
			return 1;
		}
	}
	IIC_SCL=0;//时钟输出0 	   
	return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}
//不产生ACK应答		    
void IIC_NAck(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}					 				     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
	SDA_OUT(); 	    
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1; 	  
		delay_us(2);   //对TEA5767这三个延时都是必须的
		IIC_SCL=1;
		delay_us(2); 
		IIC_SCL=0;	
		delay_us(2);
    }	 
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
	unsigned char ireceive=0;
	SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
	{
        IIC_SCL=0; 
        delay_us(2);
		IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
		delay_us(1); 
    }					 
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 你不是需要用的是B口吗?这程序SDA、SCL怎么都是C口的配置?那当然是不行了!

    • 发布于 2018-08-27
    • 举报
    • 评论 9
    • 0
    • 0
晏几台char 回复了 捷波:那是我修改之前,您看我更新的 回复
晏几台char 回复了 捷波:那是我修改之前,您看我更新的 回复
捷波 回复了 捷波:找个IIC的eepro测试下代码,或者用 IIC工具测试下你买的模块,这样好判断问题出在哪一方 回复
晏几台char 回复了 捷波:好吧。。 回复
捷波 回复了 晏几台char:手边有示波器的话,可以先看下现在这两个口的输出波形对不对。 回复
晏几台char 回复了 捷波:可是我都没有。。。我还是再问问别人, 回复
捷波 回复了 晏几台char:再查查是不是程序里还有其它地方对这两个脚有定义和操作了 回复
晏几台char 回复了 捷波:嗯嗯,好的 回复
晏几台char 回复了 捷波:多谢 回复

其他答案 数量:9
  • IO方向用的是寄存器,这个你需要好好绿一下,然后店口初始化,然后就是宏定义,就这3个地方还有就是注意端口功能不要冲突
    • 发布于2018-08-27
    • 举报
    • 评论 7
    • 0
    • 0
晏几台char 回复了 涛涛涛涛涛 :您好,我用的是单片机最小系统直接用面包板连接的,引脚应该没有接错,至于寄存器的问题,我之前试过用固件库来初始化GPIO,可也是同样的效果,寄存器我是参照数据手册改的,检查好多次,就是不知道问题出在哪,会不会和MPU6050的设备地址有关系?我看有的是0X68有的是0XD0,但我修改之后也是如此。哎,无奈。 回复
涛涛涛涛涛 回复了 涛涛涛涛涛 :你先保证源程序管用,再一个管脚一个管脚修改,其实IIC通信建议使用开漏输出模式。不用不停的切换端口方向可以避免很多错误 回复
晏几台char 回复了 涛涛涛涛涛 :源程序接到PA 8/11这两个引脚可以用,按我那样修改就错了。因为我 的四轴的板子是PB10/11的,想先用最小系统测试下 回复
涛涛涛涛涛 回复了 涛涛涛涛涛 :会不会是少了别的地方程序死机了。你可以插上仿真器仿真一下看看是不是端口问题 回复
晏几台char 回复了 涛涛涛涛涛 :还会死机? 回复
涛涛涛涛涛 回复了 晏几台char :我意思是你可能还有别的外外设,可是你没接,导致程序跑废了 回复
晏几台char 回复了 涛涛涛涛涛 :我检查过,应该不是的,我试试修改下工作模式。 回复

  • 如果你使用的单片机是STM32的话,你只更改程序中的宏定义是不对的,必须单片机的引脚初始化程序中,重新设置对应引脚的工作模式。如果你使用的是硬件IIC的话,引脚初始化部分应该是设置为复用模式。不是普通输出模式。
    • 发布于2018-08-27
    • 举报
    • 评论 5
    • 0
    • 0
晏几台char 回复了 奔跑的黑蚂蚁 :是用复用的推挽输出?可我看其他的例程也有开漏输出的,有什么区别?为什么和工作模式有关呢?我用的是模拟IIC,stm32的最小系统 回复
奔跑的黑蚂蚁 回复了 晏几台char :引脚的工作模式的设置很重要的,STM32的每个引脚除了作为普通IO口之外,还有第二功能,比如外中断的输入引脚,或者是作为串口使用等,引脚的第二功能就是复用功能。你使用软件模拟IIC的话你就设置为GPIO_Mode_Out_PP 回复
晏几台char 回复了 奔跑的黑蚂蚁 :您看我更新的问题,那么改还是不行。 回复
奔跑的黑蚂蚁 回复了 晏几台char :手里有逻辑分析仪吗?我的思路是先看看引脚是不是按照IIC的要求发出了相关电平状态,之后再看有没有6050的应答信号,我感觉你这个没收到应答信号。 回复
晏几台char 回复了 奔跑的黑蚂蚁 :可是我没有逻辑分析仪 回复

  • 从你贴上来的代码看,用的是PC12和PC11呀:SCL-->PC12 SDA-->PC11。

    如果改成PB口,要注意初始化时打开GPIOB的时钟。

    • 发布于2018-08-27
    • 举报
    • 评论 1
    • 0
    • 0
晏几台char 回复了 赤心木zqw :的确,我做过修改了,但是没有效果,SDA是PB11,SCL是PB10,等我修改下问题,您看下。 回复

  • 看修改过的代码应该没什么问题,楼主检查一下PB10 PB11的端口是不是被别的外设占用了,再看看驱动别的I2C器件像DS3231那种对时序要求较低的,看看能不能正常通信?

    • 发布于2018-08-28
    • 举报
    • 评论 0
    • 0
    • 0

  • 这种最好用示波器看一下那个SDA和SCL脚的波形,看一下延时是否正确

    此外,你的PB10 和PB11上面有没有挂别的外设,尝试一下加个上拉增加驱动能力

    • 发布于2018-08-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 感觉应该是通信延时没做好,你要检查一下你的延时函数是标准延时函数还是粗延时函数,粗延时函数的话很容易通信失败。
    • 发布于2018-08-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 要用示波器抓一下引脚的信号,根据信号来看下时序是否正确
    • 发布于2018-09-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 这种模拟的IIC要根据你的实际频率调整一下IIC的延时,不然读取会有问题
    • 发布于2018-09-20
    • 举报
    • 评论 0
    • 0
    • 0

  • IIC的部分和你的延时有关系,你移植之后要把对应的延时函数的延时时间也要修改
    • 发布于2018-09-22
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

我买的mpu6050模块代码默认的是PA8/11引脚,想修改