STM32 I2C 死锁笔记

问题
调试中遇到过这样一个问题,主芯片访问外部I2C设备时,市场出现I2C读写time out,而且一旦出现这个问题后,I2C的SCL一直为高,SDA一直为低;I2C访问会一直失败。

分析
1) 对于I2C主设备来说,由于检测到SDA信号为低电平,则会认为I2C总线被占用,I2C主设备等待从设备释放SDA信号,而同时I2C从设备又在等待主设备将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进入死锁状态。
2) 从现象上看很可能由主从设备的时序不匹配导致。
硬件I2C 超时时间可能小于从设备响应所需要的时间。

解决
1.延长超时等待时间:STM32H7 与F4 时钟tick不同,移植程序时考虑延长超时时间。

2.cube生成的例程有BUG:
修复如下

  /* I2C2 clock enable */
      __HAL_RCC_I2C2_CLK_ENABLE(); //提到GPIO初始化前面
      __HAL_RCC_GPIOB_CLK_ENABLE(); 

3.开启I2C事件中断+发送接收DMA
能够应付大部分情况,但是碰到从器件不依不饶,非给你SDA一直拉低,占着总线,还是没办法修复

4.I2C超时复位,根据网上解决死锁问题的博客,问题一般是读取从器件的时候时钟没给完,从器件拉低了SDA,并等待后续SCL时钟;所以采取发送9个时钟查询SDA是否拉高;来恢复SDA,但我遇到的问题时在正确写完从期间后,从器件将SDA拉低;所以采取网上的方式并不能解决问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: max7300是一款可配置的IO扩展器,通常与STM32微控制器通过I2C总线连接。但在使用过程中,有时可能会遇到I2C的问题。I2C是指I2C总线上的通信无法继续进行,导致数据传输无法完成的情况。 I2C的原因可能有多种,其中一个可能的原因是通信过程中的硬件故障。比如,连接线路不稳定、接触不良、电源干扰等问题都可能导致I2C信号无法正常传输,从而引发。解决这类问题的方法通常是检查硬件连接,确保I2C总线的稳定性和可靠性。 另外一个可能的原因是软件编程错误。在使用STM32和max7300进行通信时,编写的驱动程序可能存在逻辑错误或同步问题,从而导致程序无法正确处理I2C的读写操作,引发。解决这类问题的方法通常是检查程序的逻辑和同步机制,确保正确处理I2C通信的各个步骤。 此外,还有一些其他可能导致I2C的原因,比如设备地址配置错误、时钟频率设置错误等。解决这些问题的方法是仔细检查配置参数和初始化代码,确保各项参数正确设置,并按照设备规格手册的要求进行配置。 总之,解决max7300和STM32之间的I2C问题需要综合分析硬件和软件两方面的因素,并逐一排查可能的问题。通过仔细检查硬件连接、程序逻辑和配置参数等,可以解决I2C问题,确保正常的通信和数据传输的顺利进行。 ### 回答2: MAX7300是一种数字输出电平转换器,与STM32微控制器通过I2C总线进行通信。I2C是一种双线制串行总线,用于在微控制器和外部设备之间传输数据。所谓""是指在多线程或多进程环境下,两个或多个线程/进程因为互相等待对方释放资源而处于无法继续执行的状态。 在MAX7300与STM32之间进行I2C通信过程中可能会遇到问题,主要原因如下: 1. 并发访问冲突:如果同时有多个线程或进程并发地对I2C总线进行读写操作,可能会导致冲突,从而导致。例如,如果一个线程在等待ST32释放I2C总线,而另一个线程同时占用I2C总线,则两个线程可能会形成。 2. 资源竞争:如果MAX7300和STM32同时需要访问同一块共享资源(如一个特定的寄存器或数据缓冲区),并且没有合适的同步机制来确保资源的独占访问,就有可能发生资源竞争。这可能导致,因为两个设备互相等待对方释放资源。 为了解决MAX7300和STM32之间的I2C问题,可以采取以下措施: 1. 使用适当的同步机制:在访问I2C总线和共享资源之前,使用互斥或其他同步机制来确保只有一个设备能够访问它们。这样可以避免并发访问冲突和资源竞争,从而减少的发生。 2. 合理的任务调度策略:如果一个任务必须占用I2C总线的长时间操作,应该考虑合理的任务调度策略,确保其他任务不会无限期地等待I2C总线而导致。 3. 调整通信速率:降低I2C总线的通信速率可能有助于减少的发生。较低的通信速率可以减少竞争和冲突的可能性,从而提高系统的稳定性。 综上所述,针对MAX7300和STM32之间的I2C问题,我们可以采取适当的同步机制、合理的任务调度策略和调整通信速率等措施来减少的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值