我的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 就这两不同个人感觉
求大神给点经验 指点下 好头痛
一周热门 更多>