关于stm32 hal 库 iic 一直是 busy 问题

发布者:天涯拾遗最新更新时间:2019-08-08 来源: eefocus关键字:stm32  hal  iic  busy 手机看文章 扫描二维码
随时随地手机看文章

最近在用st hal iic 发现 MX_I2C1_Init(); 后 iic 就处于BUSY状态


代码跟踪后发现 具体到 HAL_I2C_MspInit 中 __HAL_RCC_I2C1_CLK_ENABLE(); 后 IIC模块就处到busy状态。


具体问题找到 ,修改如下,轻松解决问题!!


原来代码:


void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)

{


    GPIO_InitTypeDef GPIO_InitStruct;

    if(i2cHandle->Instance == I2C1)

    {

        /* USER CODE BEGIN I2C1_MspInit 0 */


        /* USER CODE END I2C1_MspInit 0 */


        /**I2C1 GPIO Configuration

        PB6     ------> I2C1_SCL

        PB7     ------> I2C1_SDA

        */

                

        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;

        GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

            

        /* Peripheral clock enable */

        __HAL_RCC_I2C1_CLK_ENABLE();

        /* USER CODE BEGIN I2C1_MspInit 1 */

           


        /* USER CODE END I2C1_MspInit 1 */

    }

}


修改后代码:


void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)

{


    GPIO_InitTypeDef GPIO_InitStruct;

    if(i2cHandle->Instance == I2C1)

    {

        /* USER CODE BEGIN I2C1_MspInit 0 */


        /* USER CODE END I2C1_MspInit 0 */


        /**I2C1 GPIO Configuration

        PB6     ------> I2C1_SCL

        PB7     ------> I2C1_SDA

        */

                

        /* Peripheral clock enable */

        __HAL_RCC_I2C1_CLK_ENABLE();

        /* USER CODE BEGIN I2C1_MspInit 1 */

            

                GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;

        GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


        /* USER CODE END I2C1_MspInit 1 */

    }

}


关键字:stm32  hal  iic  busy 引用地址:关于stm32 hal 库 iic 一直是 busy 问题

上一篇:stm32的HAL库uart的注意点
下一篇:STM32 AD7792驱动调试总结

推荐阅读最新更新时间:2024-11-02 02:38

STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)
一.预备知识 使用51单片机控制IO口相对来说要简单得多,最小系统搭建完毕后直接通过软件往各IO口写“1”或者写“0”即可。但使用STM32控制IO口输入输出却远没有这么容易,经过一个下午的查阅文献及探索后,略微有了头绪。 个人所使用的STM32F103VBT6有100个引脚,其中有五组GPIO(GPIOA…GPIOE),每组有16个GPIO端口(GPIOx_Pin0…GPIOx_Pin15)共80个,每个GPIO端口都有: 两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH); 两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR); 一个32位置位/复位寄存器(GPIOx_BSRR); 一个16位复位寄存器(
[单片机]
<font color='red'>STM32</font>学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)
循环冗余校验技术,以及在STM32中的一些具体使用体会
在嵌入式产品应用中,常常需要应对系统数据在存储或者传输过程中的完整性问题。 所谓完整性是指数据在其生命周期中的准确性和一致性。这些数据可能存储在EEPROM/FLASH里,或者基于通信协议进行传输,它们有可能因为外界干扰或者程序错误,甚至系统入侵而导致被破坏。如果这些数据在使用前不做校验,产品功能可能失效。在一些特定领域,严重时可能会危及用户财产甚至生命安全。 本文就来聊聊使用较为广泛的循环冗余校验技术,以及在STM32中的一些具体使用体会。 所谓循环冗余校验(CRC:Cyclic Redundancy Check)是一种错误检测算法,通常在通信协议中或存储设备中用于检测原始数据的意外变动。可以简单理解成对有用数据按照一定的算法进
[单片机]
循环冗余校验技术,以及在<font color='red'>STM32</font>中的一些具体使用体会
STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA
历程详解 详解包括: 中断原理讲解 例程流程详解 库函数分析详解 对应寄存器介绍 对应函数介绍 对应注释详解 本篇文章提供两种方法: 一种是 :IDLE 接收空闲中断+DMA 一种是: IDLE 接收空闲中断+RXNE接收数据中断 都可完成串口数据的收发 知识点介绍: STM32 IDLE 接收空闲中断 功能: 在使用串口接受字符串时,可以使用空闲中断(IDLEIE置1,即可使能空闲中断),这样在接收完一个字符串,进入空闲状态时(IDLE置1)便会激发一个空闲中断。在中断处理函数,我们可以解析这个字符串。 接受完一帧数据,触发中断 STM32的IDLE的中断产生条件: 在串口无数据接收的情况下,不会产生,
[单片机]
<font color='red'>STM32</font> <font color='red'>HAL</font> CubeMX 串口IDLE接收空闲中断+DMA
STM32复位源判断
在项目中有时候会遇到单片机莫名奇妙复位的情况,为了判断是那种原因引起复位,就需要对单片机的复位源进行判断。现用STM32F103C8T6单片机进行测试。 先看看单片机复位源都有哪些? 在STM32中文参考手册中可以看到,复位源可以通过状态寄存器来读出。 于是写一段程序来读取复位状态寄存器: void Check_Rst(void) { printf( CSR = %xrn , RCC- CSR); if(RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET ) // NRST 引脚复位 { printf( PIN reset rn ); } if(RCC_
[单片机]
<font color='red'>STM32</font>复位源判断
示波器分析485波形图
测试设备: 1.MCU:STM32G0 2.485芯片:3peak 3.示波器:普源RIGOL DS1054Z 知识点: 1.A高B低:1 2.B高A低:0 3.起始信号: 由1变0一个bit时间 4.停止信号: 由0变1一个bit时间 5.空闲态: 一直是1(A高B低) 6.发送顺序:先发送低位再发送高位,比如发送0x53(01010011),先发送低四位,再发送高四位,并且低四位发送也是先从低到高发,所以示波器看到的应该是(11001010) 数据格式说明: 1.波特率:4800 2.起始位:1位 3.数据位:8位 4.校验位: 无 5.停止位:1位 测试 1.发送两个字
[单片机]
示波器分析485波形图
STM32一键连接JQ8400-FLJQ8900语音模块程序分析
首先是JQ8900.C #include JQ8900.h #include delay.h //初始化PB5使能端口的时钟 //SDA IO初始化 void JQ8900_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //LED0-- PB.5
[单片机]
学习STM32之SD卡总结
由于自己也在使用SD卡,使用的过程中也遇到了一些问题,下面是在EDN论坛上zxb1717高手的经验,希望可以帮助大家 调试关键点: 1. 上电时要延时足够长的时间给SD卡一个准备过程,在我的程序里是5秒,根据不同的卡设置不同的延时时间。SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。 2. SD卡发送复位命令CMD0后,要发送版本查询命令CMD8,返回状态一般分两种,若返回0x01表示此SD卡接受CMD8,也就是说此SD卡支持版本2;若返回0x05则表示此SD卡支持版本1。因为不同版本的SD卡操作要求有不一样的地方,所以务必查询SD卡的版本号,否则也
[单片机]
STM32启动流程
1、stm32初始化流程 void RCC_Configuration(void) { /* RCC system reset(for debug purpose) */ RCC_DeInit(); //时钟控制寄存器全部恢复默认值 /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); //外部高速时钟源开启(8M晶振) /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部时钟HSE就绪 if(HSEStartUpStatus == SUCCESS) //如果时钟启动成功 {
[单片机]
<font color='red'>STM32</font>启动流程
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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