STM32 I2C 总线占用问题解析

发布者:SparkCrafter最新更新时间:2018-06-07 来源: eefocus关键字:STM32  I2C  总线占用 手机看文章 扫描二维码
随时随地手机看文章

这几天解决 STM32 MCU的I2C 总线占用(BUSY) 问题,觉得是不错的Lesson Learn,分享给大家。


问题描述

  1. STM32F207 MCU有三组I2C,在Pre-ES1使用I2C1接上DSP/Codec/EEPROM,运作良好

  2. 新硬件(ES1)把Codec/EEPROM移到I2C3,DSP还是留在I2C1,发现在I2C3有机率性的BUSY,MCU无法开始传资料

  3. 查MCU datasheet,BUSY意思为register I2C3_SR2[bit1]=1,代表SCL/SDA曾经 low而且没出现stop condition



  4. I2C3 BUSY和timing有关,在程序加个delay就莫名PASS,再加delay又莫名BUSY,有些image是机率性发生BUSY


分析方向

  1. 观察I2C3 SCL/SDA波形

  2. I2C3在Pre-ES1没用过,初始化是否有问题?

  3. 观察BUSY时机,何时开始,何时结束

  4. 和chip有关?将 Codec和Flash断开

  5. 和I2C bus有关?将Codec接到 I2C1测试

  6. 为何Pre-ES1没问题?



分析过程

  1. 刚开始不太稳定,莫名的连续一直BUSY,有时一直PASS,而且LED时亮时暗
    > 量电压发现VDD3.3V不稳,high > low > high > low 震荡
    > 加大LDO之后VDD3.3V稳定了(Solution1),但I2C3还是BUSY 

  2. 东改西改,发现一版100% PASS的软件,和另一版100% FAIL的软件,只差在delay,应该还有其他问题

  3. 量波形,I2C1(DSP)很正常,I2C1 init之后一直FREE,只有传资料期间才BUSY



  4. 100% BUSY的软件,在I2C3 初始化之后SCL/SDA停在2.6V,当VDD3.3V ON 后才升到3.3V


  5. 100% PASS的软件,波形同上,但之后开LED时因为LDO供电不足,SCL/SDA被短暂下拉,马上回到3.3V

    应是因为SCL/SDA短暂下拉,误打误撞造成SCL/SDA high > low > high离开BUSY,有两个证据
    证据一,如果没下拉,I2C3就一直BUSY:
      a. 断开小板(上面有LED) 以降低VDD3.3V电流,不会短暂下拉 > 100% PASS的软件变成100% FAIL
      b. 断开小版LED以降低VDD3.3V电流,不会短暂下拉 > 100% PASS的软件变成100% FAIL
      c. 软件关闭LED以降低VDD3.3V电流,不会短暂下拉 > 100% PASS的软件变成100% FAIL
    证据二,如果有下拉,I2C3从BUSY恢复成FREE:
      a. BUSY时设SCL/SDA为GPIO out,拉low > high > low > high,重新初始化SCL/SDA (workaround)  > 离开BUSY并可传I2C指令
      b. BUSY时手动把SCL拉电线接地  离开BUSY并可传I2C指令
      c. 100% BUSY软件就是因为没下拉波形才会100% FAIL
    PS: 开LED造成电流超出LDO负荷也是问题,须加大LED电阻或更换LDO

  6. SCL/SDA短暂下拉不是造成BUSY的原因,重点在SCL/SDA有0.8s处于2.6V不正常电压,原因可能有:
    - flash/codec去拉SCL/SDA
    - MCU去拉SCL/SDA
    - SCL/SDA上拉电阻不正确
    - SCL/SDA的上拉电路接在stby3.3v,可能stby3.3v不稳


  7. 断开flash还是BUSY,而且SCL/SDA还是有0.8秒被下拉到2.6v
    > 和flash无关

  8. 断开codec后,SCL/SDA不会下拉到2.6v,但I2C3还是BUSY
    > 怀疑Codec供电不正确,检查I2C3初始化当下的VDD3.3v (供给Codec电压),发现VDD3.3V本应处于无电状态(0V),但实际量得2.7V,对codec是不正常电压,可能造成工作异常
    > MCU将VDD3.3V提早开电(得到3.3V),确保I2c3初始化时Codec正常工作,SCL/SDA下拉电压消失 (Solution2)
    > I2C3还是BUSY,其实还需要下个Solution


  9. 比较I2C1和I2C3初始化,发现重要差异:
       I2C1 pins(PB7, PB6)都在GPIO group B,共用一组GPIO register,填一次register可初始化两根pin
       I2C3 pins(PA8, PC9)分在GPIO group A和C,必须分两次初始化,先SDA再SDL
       > 怀疑初始化顺序错误,I2C3先初始化SCL再SDA,终于PASS!(Solution3)

 

其他实验


  1. 基本电路检查: SCL/SDA pull high电阻都是4.7KR,Stby3.3v是稳定3.3V,SCL/SDA没接反,Codec的25Mhz clock稳定

  2. 将Codec从I2C3移到I2C1,可正常传输 > 被误导以为和Codec无关


结论

  1. 三个Solution
    a. 加大LDO让VDD3.3V稳定供电
    b. I2C3先初始化SCL再SDA。虽然datasheet没写此限制,但sample code确实依照此顺序执行初始化。
    c. 为确保Codec在I2C3 初始化时有正常电压(VDD3.3v=3.3v),将VDD3.3V移到I2C3初始化之前

  2. 一个workaround 
    - 为确保BUSY时可恢复,当BUSY时将SCL/SDA设为GPIO out,然后pull low > high > low > high,再重新初始化I2C3

  3. Pre-ES1没问题是因为
    a. Pre-ES1 LDO较强力,无供电问题
    b. Pre-ES1的VDD3.3v无法由MCU开关,而是由stby3.3v稳定供电,因此无SCL/SDA 2.7V问题
    c. Pre-ES1只用I2C1,没用I2C3。I2C1两根pin在同一个GPIO group,无SCL/SDA初始化顺序问题


以后I2C问题可检查

  1. 电路:pull high电阻,pull high电压,slave device供电

  2. 软件:I2C SCL/SDA初始化,slave device初始化timing

  3. SCL/SDA检查:SCL是否稳定,SCL/SDA电压,slave device有回ACK? 传输资料是否正确

  4. 断开I2C3 chip做测试

  5. 量测slave device期望的timing和MCU送出得是否一样


关键字:STM32  I2C  总线占用 引用地址:STM32 I2C 总线占用问题解析

上一篇:STM32内存分布学习
下一篇:STM32 的并口总线的所有接口类型解决方法

推荐阅读最新更新时间:2024-03-16 16:05

STM32 SPI发送与接收用一个函数实现的问题
今天使用STM32F407读取flash中的数据的实验中,发现一个问题读取到的问题一直不对,找了半天问题,后面找到原子的例程看了一下,发现是SPI数据的读取与发送函数写的有问题,我原本的发送与接收函数是单独的两个函数,而原子的发送与接收函数全都放在 一起。看了半天没搞懂为什么要这么写,但这么写读写确实正常,网上找了找终于找到了一个解答,因此分享出来,方便自己记忆也方便遇到同样问题的人能尽快找到解决办法。 u8 SPI1_ReadWriteByte(u8 TxData) { while((SPI1- SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET); SPI_I2S_SendData(SP
[单片机]
基于STM32多通道ADC综合应用示例
有人使用STM32芯片做产品开发,需用到多个通道的ADC转换。大致需求是这样的: 有2个ADC通道需要每10ms启动一次转换,另外5个通道希望50ms启动一次转换。试问如何实现上述功能比较好。 这里不妨以STM32F302芯片为例,来介绍两种实现上述功能的大致方案以供参考。方案里涉及到ADC规则通道、注入通道的使用、DMA的使用、定时器的灵活使用,具备一定综合性。下面介绍以贴图为主,没法一点一滴做解释了。 第一种方案,我们使用ADC1模块的CH1到CH7连续的7个通通来做AD转换,其中CH6/CH7配置为注入通道【我将其戏称之为插队通道】,另外5个通道配置为规则通道。 其中,规则通道的触发选用TIM1的触发输出信号
[单片机]
基于<font color='red'>STM32</font>多通道ADC综合应用示例
STM32_TIM3_PWM_MDK
最近要驱动电机,看了下PWM的输出,有所总结,这次贴上。 stm32 的高级定时器 比较复杂,看了下例程,设置的东西太多了,就没有碰, 看了通用定时器还比较可爱,什么都刚刚好够用,就用它做了,这次用的是TIM3定时器3。 硬件平台用的是stm32f103vet6 100脚的。 由于手头没有示波器,所以用软件仿真,先上一张仿真图: 下面是代码部分Timer3.c C语言: Codee#20528 #include Timer3.h /******************************************************************************* * Func
[单片机]
STM32_TIM3_PWM_MDK
stm32控制mpu9250九轴传感器
1.hardware mpu mpu9250 同时新增加一个DMP文件夹 2.hallib 无 3.设置 记得要define,同时屏蔽部分代码,不然报错。同时上位机的波特率要设置好,同时关掉数据校验。 4.main #include mpu.h #include mpu9250.h #include inv_mpu.h #include inv_mpu_dmp_motion_driver.h u8 t1=0,report=1; //默认开启上报 u8 key1; float pitch,roll,yaw; //欧拉角 short aacx,aacy,aacz; //加速度传感
[单片机]
<font color='red'>stm32</font>控制mpu9250九轴传感器
STM32 中断学习Interrupt/Evens
1、NVIC的优先级概念 占先式优先级 (pre-emption priority): 高占先式优先级的中断事件会打断当前的主程序/中断程序运行— —抢断式优先响应,俗称中断嵌套。 副优先级(subpriority): 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才 能得到响应——非抢断式响应(不能嵌套)。 2、判断中断是否会被响应的依据 首先是占先式优先级,其次是副优先级; 占先式优先级决定是否会有中断嵌套; Reset、NMI、Hard Fault 优先级为负(高于普
[单片机]
stm32 基于TIM1定时器的PWM输出
void PWM_TIM1(uint16_t arr,uint16_t psc) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //定时器TIM1时钟使能 TIM_DeInit(TIM1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Period =arr; //设置用来作为TIMx时钟频率出书的预分频值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟分割 TIM_TimeBaseStru
[单片机]
STM32标准外设库函数SetSysClockTo72(void)
在http://blog.csdn.net/qq_29344757/article/details/73479924文章中介绍了STM32的时钟体系,现在以STM32标准外设库SetSysClockTo72()函数为例,介绍关于RCC的编程。 有了前面文章的基础,学习RCC已经不再那么艰难枯燥了,至少我是这么觉得的。SetSysClockTo72(void)函数是我们使用外设库时默认的系统时钟设置函数。 如上图的标注,该函数最核心的功能也就是设置这5点, (1) 设置HCLK,HCLK = SYSCLK (2) 设置PCLK2,PCLK2 = HCLK (3) 设置PCLK1,PCLK1 = HCLK /
[单片机]
<font color='red'>STM32</font>标准外设库函数SetSysClockTo72(void)
基于VHDL的I2C总线控制核设计
摘要:从状态机的角度,介绍一种I2C控制核的VHDL设计方法。将其嵌入到FPGA中,用于实现与TMS320C6000系列DSP的接口,并配合DSP的软件完成对视频采集与显示处理系统中数字视频编、解码器工作模式寄存器的配置及其状态查询。着重介绍I2C控制核的总体设计方案,详细描述其内部命令状态机和时序状态机的工作原理及相应的VHDL代码。此外,介绍I2C控制核与DSP相互通信中断处理机制的VHDL实现方法。最后,给出在Xilinx公司的ISE6.1+ModelSimXE5.7c软件平台中进行EDA的综合结果与时序仿真图。 关键词:I2C总线 状态机FPGA VHDL DSP 控制器核 引言 I2C总线是双向、两线、串行、多主
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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