我的MPU6050 在F767调通了移植到F103去就出问题了求解答

2019-10-11 14:51发布

我的MPU6050 在F767调通了移植到F103去就出问题了求解答

IIC协议那些都是全部搬过来的 肯定没有错 在F767上已经用过 软件模拟的通信

端口配置真心搞不懂 配置如下



#include "myiic.h"
#include "systick.h"
#include "stm32f10x_gpio.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F7开发板
//IIC驱动代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/12/28
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////        

//IIC初始化
void IIC_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;   //声明一个结构体变量,用来初始化GPIO
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    //PH4,5初始化设置
    GPIO_Initure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
    GPIO_Initure.GPIO_Mode=GPIO_Mode_Out_PP;  //推挽输出
   // GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.GPIO_Speed=GPIO_Speed_50MHz;     //快速
    GPIO_Init(GPIOB,&GPIO_Initure);

    IIC_SDA(1);
    IIC_SCL(1);  
}



#ifndef _MYIIC_H
#define _MYIIC_H
#include "public.h"
#include "stm32f10x.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F7开发板
//IIC驱动代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/11/30
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////        
//IO方向设置
#define SDA_IN()  {GPIOB->CRL&=0XFFFF0FFF;GPIOB->CRL|=8<<12;}         //PC2输入模式
#define SDA_OUT() {GPIOB->CRL&=0XFFFF0FFF;GPIOB->CRL|=3<<12;} //PC2输出模式
//IO操作
#define IIC_SCL(n)  (n?GPIO_SetBits(GPIOB,GPIO_Pin_11):GPIO_ResetBits(GPIOB,GPIO_Pin_11)) //SCL
#define IIC_SDA(n)  (n?GPIO_SetBits(GPIOB,GPIO_Pin_10):GPIO_ResetBits(GPIOB,GPIO_Pin_10)) //SDA
#define READ_SDA     GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)  //输入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 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);         

#endif




我也看了F103的例程 只有在下面这段不同
(例程:)
#define MPU_IIC_SCL    PBout(10)                 //SCL
#define MPU_IIC_SDA    PBout(11)                 //SDA         
#define MPU_READ_SDA   PBin(11)                 //输入SDA


(我的):

#define IIC_SCL(n)  (n?GPIO_SetBits(GPIOB,GPIO_Pin_11):GPIO_ResetBits(GPIOB,GPIO_Pin_11)) //SCL
#define IIC_SDA(n)  (n?GPIO_SetBits(GPIOB,GPIO_Pin_10):GPIO_ResetBits(GPIOB,GPIO_Pin_10)) //SDA
#define READ_SDA     GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)  //输入SDA


官方例程封装是这样的:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C   
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C   

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08

//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入


GPIOx_ODR和GPIOx_BSRR这两寄存器有区别吗?
库函数操作的是GPIOx_BSRR
例程封装操作的是GPIOx_ODR 就这两不同个人感觉
求大神给点经验 指点下 好头痛





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。