找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2043|回复: 5
收起左侧

MPU6050移植正点原子指南和寄存器操作端口模式#define SDA_IN() /#define SDA_OU...

[复制链接]
ID:752225 发表于 2021-8-18 20:40 | 显示全部楼层 |阅读模式
  写在前面
  最进要做个平衡车,要用到MPU6050模块,画板子时SCL与SDA引脚选到了PB8与PB9引脚,想白 嫖原子哥程序,发现引脚不对,本来以为很简单的改下引脚一下就行,结果搞了半天,最后发现PB9引脚方向设置错了。。。。尴尬

   正文
一:IO方向设置
  1. //IO方向设置
  2. #define MPU_SDA_IN()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
  3. #define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;};
复制代码
二:IO操作函数
  1. //IO操作函数         
  2. #define MPU_IIC_SCL    PBout(10)                 //SCL
  3. #define MPU_IIC_SDA    PBout(11)                 //SDA         
  4. #define MPU_READ_SDA   PBin(11)                 //输入SDA
复制代码
三:初始化初始化IIC函数
  1. //初始化IIC
  2. void MPU_IIC_Init(void)
  3. {                                             
  4.   GPIO_InitTypeDef  GPIO_InitStructure;
  5.        
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTB时钟
  7.                
  8.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;         // 端口配置
  9.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  10.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  11.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIO
  12.        
  13.   GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);                                                 //PB10,PB11 输出高       

  14. }
复制代码

其中这三点中第二和第三是比较简单的,但是IO方向修改则稍微要了解一下寄存器设置。以我为例,我要把PB10,PB11改成PB8,PB9引脚。

第一修改IO操作函数
  1. //IO操作函数     
  2. #define MPU_IIC_SCL    PBout(8)         //SCL  修改成了PB8
  3. #define MPU_IIC_SDA    PBout(9)         //SDA   修改成了PB9     
  4. #define MPU_READ_SDA   PBin(9)         //输入SDA   修改成了PB9
复制代码



第二修改初始化初始化IIC函数
  1. //初始化IIC
  2. void MPU_IIC_Init(void)
  3. {                        
  4.   GPIO_InitTypeDef  GPIO_InitStructure;
  5.    
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTB时钟
  7.       
  8.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;     // 端口配置 修改为PB8,9
  9.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
  10.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //IO口速度为50MHz
  11.   GPIO_Init(GPIOB, &GPIO_InitStructure);                     //根据设定参数初始化GPIO
  12.    
  13.   GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9);                         //输出高 修改为PB8,9

  14. }
复制代码


第三修改IO方向设置
  1. //IO方向设置
  2. #define MPU_SDA_IN()  {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
  3. #define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;};
复制代码


ok,到现排除一些极端情况,做完这些MPU6050应该就能正常读取工作了。
接下来我要详细说明一下是如何修改IO方向的,因为PB9引脚即作为数据输入引脚也作为数据输出引脚,输出输入要配置好,这其中牵扯一些寄存器的知识。

解释一下输入配置:#define MPU_SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
等价于下面的运算:
1. GPIOB->CRH&=0XFFFFFF0F;
2. GPIOB->CRH|=(u32)8<<4;

1.将CRH第二个低4位清零,其他位保持不变;
2.将“8”即“0b1000”左移4位即与原来的四位进行或运算;

这里我们要思考了,为什么是CRH不是CRL,这就牵扯到我们选的引脚是PB9,我们知道GPIOB对应着16个管脚,其中第PB0~7对应着IO口的低寄存器即CRL,而PB9显然对应着IO口的高寄存器即CRH。
好,到现在为止,我们懂得了如何根据引脚来找到相应的寄存器,接下来我们就要把PB9引脚配置成输入引脚。我们根据手册可知要把MODE9配置成00输入模式,CNF9配置成10上下拉输入模式如下图所示:
1.png
为什么配置成上下拉模式,是因为数据是通过上拉把数据输入进单片机的,我们可看到下图外部加了上拉电阻。这部分我理解不是很深刻,欢迎大家来评论区讨论.
2.png
结束说明:具体制作步骤可去下面地址观看:https://www.bilibili.com/video/BV1yU4y177BV?share_source=copy_web


评分

参与人数 1黑币 +70 收起 理由
admin + 70 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:616009 发表于 2021-8-18 21:04 | 显示全部楼层
牛牛牛,好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:752225 发表于 2021-8-19 01:05 来自手机 | 显示全部楼层
无忍 发表于 2021-8-18 21:04
牛牛牛,好资料,51黑有你更精彩!!!

嘿嘿,小破站捧个场点点关注呗
回复

使用道具 举报

ID:655518 发表于 2021-8-19 08:42 | 显示全部楼层
I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才能够实现“线与”功能。当总线空闲时,这两条线路都是高电平。

为了保证空闲时为高电平,通常阻值选择4.7k,阻值的选择需要根据负载情况和iic的通信速率选择。
回复

使用道具 举报

ID:655518 发表于 2021-8-19 08:42 | 显示全部楼层
I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才能够实现“线与”功能。当总线空闲时,这两条线路都是高电平。

为了保证空闲时为高电平,通常阻值选择4.7k,阻值的选择需要根据负载情况和iic的通信速率选择。
回复

使用道具 举报

ID:752225 发表于 2021-8-19 17:22 | 显示全部楼层
qiezi12318 发表于 2021-8-19 08:42
I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才 ...

嗯,我懂了!!!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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