STM32硬件I2C问题

发布者:RainbowDreamer最新更新时间:2019-08-08 来源: eefocus关键字:stm32  硬件I2C  总线初始化 手机看文章 扫描二维码
随时随地手机看文章

1.CUBEMX生成代码后I2C总线初始化一直出现 I2C_FLAG_BUSE

1.1 环境:


 1.2 硬件I2C配置为默认,管脚如下


1.3 时钟等其他 配置完成后生成工程


1.4 添加代码


在i2c.c文件中的的void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)函数中添加如下代码


__I2C2_FORCE_RESET();

__I2C2_RELEASE_RESET();

实际如下图


这里采用读取板载的MPU6050的设备地址来确认硬件I2C是否工作正常。 主函数里main.c添加程序如下:


/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

uint8_t device_id_reg = 0x75; //存放MPU6050设备地址的寄存器

uint8_t device_id = 0x68; //MPU6050设备地址,0x75寄存器读取的地址与此相同

uint8_t device_id_reg_ret; //用来存放读取的设备地址

/* USER CODE END PV */

在while循环里添加读取设备地址代码,效果如下:


while (1)

 {

 

 /* USER CODE END WHILE */

 

 /* USER CODE BEGIN 3 */

 uint32_t cnt = 0;

 HAL_Delay(10);

 if(cnt%10==0)

 {

HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin | LED1_Pin);

 }

 if(cnt%20==0)

 {

HAL_I2C_Mem_Read(&hi2c1,device_id<<1 , 0X75, I2C_MEMADD_SIZE_8BIT,&device_id_reg_ret,1, 1000);//读MPU6050的ID

printf("MPU6050device_id %xrn",device_id_reg_ret);

 }

cnt++;

 }

编译下载后在串口可以看到打印信息: 

与给定的设备地址相同,说明代码配置的硬件i2c可用

关键字:stm32  硬件I2C  总线初始化 引用地址:STM32硬件I2C问题

上一篇:STM32 I2C上拉电阻的选择问题
下一篇:STM32F1 模拟I2C驱动DAC(LTC2605)程序

推荐阅读最新更新时间:2024-11-16 20:55

STM32中断系统详解
1.中断的基本概念 1.1处理器中的中断:在处理器中,CPU正在执行某一段代码时遇到内部或者外部的紧急事件需要处理,暂停当前执行的代码、转而去处理紧急事件,处理完毕后继续执行之前的代码。 1.2中断的意义:中断可以提高CPU运行的效率、避免对某一事件状态的不断轮询损耗CPU资源,同时可以对紧急事件做实时处理;中断在计算机多任务处理中尤为重要(如:uCOS、FreeRTOS),可以实现多线程、多任务的处理; 1.3中断处理的过程:进入中断之前处理器将自动保存现场到堆栈中(现场:程勋运行的当前位置、变量的值等),根据中断向量表中的地址运行对应的中断服务程序,在退出中断前处理器会将之前保存在堆栈中的现场进行恢复(称之为出栈)、完
[单片机]
<font color='red'>STM32</font>中断系统详解
基于STM32的实时心率检测仪设计
一、开发环境介绍 主控芯片: STM32F103ZET6 代码编程软件: keil5 心率检测模块: PulseSensor WIFI模块: ESP8266 --可选的。直接使用串口有线传输给上位机也可以。 上位机: C++(QT) 设计的。 支持PC机电脑、Android手机显示。 与上位机的传输协议: 支持串口传输、WIFI网络传输两种。 如果是PC就可以直接连接串口传输数据,如果不方便可以直接通过WIFI---TCP协议传输。 二、PulseSensor心率模块介绍 PulseSensor 是一款用于脉搏心率测量的光电反射式模拟传感器。 可以将其佩戴于手指、耳垂、手腕等处,通过杜邦线--导线将引脚连接到单片机,可将采集到
[单片机]
基于<font color='red'>STM32</font>的实时心率检测仪设计
STM32单片机学习笔记(6):PWM波形产生
项目简介 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第六部分针对STM32单片机内置TIM模块的PWM波形产生的学习和理解。 硬件模块 STM32F103R4 示波器 软件工具 CubMX Proteus KEIL 电路连接图 工作流程 首先,在CubMX种设置号一些参数,选择TIM1定时器,按下图设置好工作模式。输出PWM的引脚是PB15引脚。 然后再按下图设置好预分频和计数值 最好设置好占空比,占空比=Pulse/Per,比如想要设置占空比为20%,而上面设置了计数值为1000,那
[单片机]
<font color='red'>STM32</font>单片机学习笔记(6):PWM波形产生
stm32影子寄存器、预装载寄存器
一直没搞清楚stm32定时器的TIM_OC1PreloadConfig、TIM_ARRPreloadConfig函数的作用,影子寄存器、预装载寄存器、重载寄存器的概念。今天来研究一下: 首先看定时器的框图: 图中有阴影的小方框,代表该功能对应的寄存器有影子寄存器,也就是:PSC预分频器、自动重装载寄存器、REP寄存器和4个通道的捕获/比较寄存器。 可以看到这几个寄存器都是经常用到的,而且存在定时器工作过程中修改他们的可能性。在定时器工作过程中修改他们的值,就会出现一个问题了:如果上次ARR的值是200,通道1的比较寄存器CCR1值是100,产生占空比为50%的PWM。这个时候我要改变PWM的频率,我把ARR的值改为10
[单片机]
<font color='red'>stm32</font>影子寄存器、预装载寄存器
STM32开发板入门教程 - 串口通讯 UART
通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 主要特性: 全双工的,异步通信 NR 标准格式 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 可编程数据字长度(8位或9位)
[单片机]
stm32中core_m3.h和core_m3.c详解
CMSIS是Cortex微控制器软件接口标准(Cortex MicroController Software Interface Standard)的缩写,这个是ARM定制的一个用于Cortex-M系列的一个标准,主要是为了提供通用api接口来访问内核和一些片上外设,提高代码的可移植性。 CMSIS有三个层:核内外设访问层Core Peripheral Access Layer(CPAL),中间件访问层Middleware Access Layer(MWAL),设备访问层(Device Peripheral Access Layer)。 CPAL用于访问内核的寄存器和组件,如NVIC,调试系统等。该层是由ARM实现的。 M
[单片机]
几步实现stm32上面移植mqtt
最近项目需要,stm32上面使用到mqtt了,百度了下,发现网上资料还是挺少的,虽然有几份相关的资料,下载下来之后,看到了mqtt的底层代码竟然还有错误,这个问题导致了我后面一直调试不通,后来,我直接从官方下载了mqtt的源码用比较器比较后找到了原因,最后果断将官方的mqtt底层代码移植上来,mqtt的发布还是比较顺利,订阅虽然可以收到消息,但是由于没有移植os,发布消息时,订阅接受有时无法收到消息,这个还在优化,我使用的是stm32f103c8t6平台+w5500.其实只要带以太网接口就行。 首先我们从mqtt官方下载源码 http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.e
[单片机]
MDK中STM32无法用printf()的问题
在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,但是把.hex文件烧写进板子后却发现串口接收不到任何数据。用Keil仿真是,串口可以正确的输出。有点纳闷,然后调用USART_SendData()函数,发现串口可以接收到正确的数据,证明串口配置没有问题,问题应该是出在printf()函数上,参照ST公司的printf例子也不能在串口输出数据。由此可知应该是软件配置的原因。后面,百度,再AVR论坛上找到了答案。 如果使用的是MDK,请在工程属性的 Target -》 Code Generation 中勾选 Use MicroLIB 进行如上设置后编译一下,串口输出正确的数据。 #ifndef
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved