这里不准备深入讨论stm32硬件IIC的锁死的原因,大概意思是应为IIC为“响应”式的通讯,通讯一方无响应则导致另一方等待或者出错。STM32的硬件IIC一直传说是有问题的,从最开始的初始化之后立刻锁死开始,一直被大家所诟病,后来官方经过多次的驱动修改或者硬件迭代,目前至少在新的mcu上,IIC可以在正常情况下正常工作了,但从设备无响应是时,可能导致整个IIC的HAL库函数处于busy或error状态,从而无法恢复。如果使用硬件模拟IIC则比较灵活,可以自行处理各种问题(如状态复位,或者使用9个脉冲复位总线等)。

但是,由于当前项目不得已使用了的fcubeMx自带的rtos,硬件上使用模拟IIC的话有诸多不便(如使用osdelay只能为ms级,使用自定义微秒延时函数时需要禁用任务调度,否则可能出现延时过长等问题),只能使用硬件IIC,从设备为SHT35。此时过程中,通过拔插从设备电源及通讯线,偶尔会出现无法恢复通通讯的情况,通过采用一下方式处理这个问题,目前经过一段时间测试还算正常,如果方便,也请各位帮忙测试或者分析下是否会有问题:

调用代码:
 while(1)
    {
        if(SHT35Op()!=0)
        {
            UnlockI2C2();
        }

osDelay(500);
    }

函数SHT35OP中,如果出现IIC发送或者接受错误则会返回非0值,然后会调用UnlockI2C2();试图恢复总线。UnlockI2C2()代码如下:
void UnlockI2C2(void)
{
    hi2c2.Instance->CR1=hi2c2.Instance->CR1&0xFFFE; //复位IIC软件
    GPIOB->AFR[1]=GPIOB->AFR[1]&0xFFFF00FF;   
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_11|GPIO_PIN_10,GPIO_PIN_SET);
    osDelay(1);
    for(uint8_t i=0;i<9;i++)
    {
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
        osDelay(1);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET);
        osDelay(1);
    }   
    GPIOB->AFR[1]=(GPIOB->AFR[1]&0xFFFF00FF)|0x00004400;
    hi2c2.Instance->CR1=(hi2c2.Instance->CR1|0x01); 
    osDelay(1);
}
解释如下:
1. 通过直接修改寄存器值,复位IIC的各个状态(以IIC2为例参加手册的寄存器解释,不同的MCU可能不一样,当前是STM32L4xx)
2. 通过修改AFR寄存器,将所用的SCL和SDA端口变为普通IO输出。不同IIC的AFR操作数据和GPIO端口可能不一样。
3. 使用直接操作的GPIO的方式操作输出端口,发送9个脉冲使得总线复位。
4. 将SCL和SDA端口恢复为受外设控制。
5. 取消IIC的复位,回复IIC功能。

STM32 硬件IIC 锁死及复位问题相关推荐

  1. stm32 硬件IIC使用方法说明与示例---LIS3DH的IIC通信

    有时我们可能需要MCU进行速率较高的IIC总线通信,一般stm32的IIC默认传输速率是100kpbs,最大为400kpbs.现在大部分项目会使用程序IO模拟的IIC,使用方便,具体网上例子很多. 这 ...

  2. 使用STM32+硬件IIC+DMA驱动GT系列触摸屏(GT911)

    使用STM32+硬件IIC+DMA驱动GT系列触摸屏(GT911) 初始化代码 /** @brief GT911 初始化程序* @param None* @retval None*/ void GT9 ...

  3. STM32硬件IIC的BUG问题

    问题描述 大概是这样,使用STM32硬件IIC作为主机通讯,只要不发送错误的从机地址, 通讯一直都是没问题的,因为验证程序的关系,所以在程序中修改了一下从机地址, 这时候就出现了问题,下面直接看图把 ...

  4. 12. STM32——硬件IIC驱动OLED屏幕显示

    STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...

  5. 基于stm32硬件IIC的oled显示

    一 stm32硬件IIC 硬件IIC特性架构 ①通讯引脚 查看对应开发板芯片的原理图可以查看对应IIC外设引脚的位置 这里代码采用的是stm32f103c8t6,硬件IIC的外设引脚为PB6 PB7, ...

  6. STM32硬件IIC读写EEPROM

    前面一篇写了软件模拟IIC读写EEPROM. 本篇介绍硬件IIC读写EEPROM.平台是STM32F103+AT24C04N.SDA和SCL接5K上拉电阻到3.3v. 首先介绍AT24C04N的基本特 ...

  7. 解决STM32 硬件IIC死锁在BUSY状态的方法讨论

    关于STM32的I2C接口死锁在BUSY状态无法恢复的现象,网上已有很多讨论,看早几年比较老的贴子,有人提到复位MCU也无法恢复.只有断电才行的状况,那可是相当严重的问题.类似复位也无法恢复的情况是存 ...

  8. STM32硬件IIC 主从(一、CubeMx快速实现)

    目的 通过HAL库实现STM32F103C8T6两块板之间的IIC主从相互通信,串口打印接收数据. 环境搭建 /**I2C1 GPIO Configuration PB6 ------> I2C ...

  9. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

    参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...

  10. stm32 i2c/IIC读写HP303S气压传感器

    该款芯片的详细信息可以看其数据手册 ,这里不多做介绍. 读写HP303S的操作是基于IIC通讯的.本实验采用的是硬件IIC通讯,所以器件地址是0x77,值得注意的是,在stm32的硬件IIC 读写操作 ...

最新文章

  1. 机器学习中的数学基础:(2)矩阵的奇异值分解(SVD)及其应用
  2. Dancing Links
  3. 你的Redis为什么变慢了?
  4. h5首页加载慢_H5网站制作注意了
  5. Linux Ubuntu 16.04系统下可用的Windows应用
  6. hbase里面命令行删除_HBase实践 | HBase疑难杂症诊治
  7. python编写学生选课系统程序_python面向对象编程小程序- 选课系统
  8. ubuntu 卸载openjdk 安装java8 安装之后提示Command ‘java‘ not found
  9. 用SIR模型处理新冠疫情
  10. iOS开发中对音效和音乐播放的简单实现
  11. 商誉风险只是局部爆发 市场整体业绩没那么糟
  12. fedora20 安装nvidia独立显卡驱动
  13. AI虚拟数字人直播带货软件 AI数字人直播间怎么搭建 搭建教程分享
  14. update select 语句和merge into语句
  15. Java数组,集合,列表的使用与区别
  16. 3、JavaWeb中Service层的作用、MyBatis的重要组件、mybatis-config.xml中的别名映射、properties配置、#{}和${}的区别、获取插入数据的主键值
  17. 计算机过去.现在的技术发展,影像技术与设备的过去,现在与未来
  18. jav 通过HttpClient实现调用外部接口两种请求方式(get/post)
  19. java基础项目【团队调度系统开发(需求分析、软件包结构、全部完整代码)】
  20. 怎样获取明天的日期java_java 获取昨天,今天,明天的日期

热门文章

  1. OpenGL学习之路18---- 点光源
  2. 制作一个全盘搜索器 ,能搜索整个磁盘所有目录
  3. 【软件测试】一名医院的护士,带着梦追逐诗和远方,拿下测试岗14K......
  4. excel随机数_如何返回1至10之间的不重复随机数
  5. css png有白背景图片,透明背景的PNG格式图片在IE显示白色背景的问题(在线等)...
  6. UE4虚拟摄像头插件
  7. Cell:清华程功组揭示皮肤菌群的一种气味挥发物促进黄病毒感染宿主吸引蚊虫...
  8. 华创期货恒生网上交易
  9. word2007如何删除尾注分隔符
  10. .com域名好抢注吗?抢注.com域名有哪些技巧?