前言
在参考Cube软件包中I2C例程后, 根据应用需要新增了一路I2C接口,结果新增I2C无法收发数据。本文主要对问题进行描述,分析产生原因,提供解决方法。
问题描述
如前言所述,现象表现为I2C无法收发数据。得无法理解之处,在于之前已经完成了I2C的移植工作,并且运行正常。现在遵照正确的方式,新添一路I2C接口,只是更改了对应的I2C接口及引脚,为什么无法收发数据。简化测试程序如下。
GPIO_InitTypeDef GPIO_InitStruct;
/* Enable GPIOTX/RX clock */
I2Cx_SCL_GPIO_CLK_ENABLE();
I2Cx_SDA_GPIO_CLK_ENABLE();
/* Enable I2Cxclock */
I2Cx_CLK_ENABLE();
/*##-2- Configureperipheral GPIO ###########*/
/* I2C TX GPIOpin configuration */
GPIO_InitStruct.Pin= I2Cx_SDA_PIN;
GPIO_InitStruct.Mode= GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull= GPIO_PULLUP;
GPIO_InitStruct.Speed= GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate= I2Cx_SCL_SDA_AF;
HAL_GPIO_Init(I2Cx_SDA_GPIO_PORT,&GPIO_InitStruct);
GPIO_InitStruct.Pin= I2Cx_SCL_PIN;
HAL_GPIO_Init(I2Cx_SCL_GPIO_PORT,&GPIO_InitStruct);
I2cHandle.Instance= I2Cx;
I2cHandle.Init.ClockSpeed= 100000;
I2cHandle.Init.DutyCycle= I2C_DUTYCYCLE;
I2cHandle.Init.OwnAddress1= 0;
I2cHandle.Init.AddressingMode= I2C_ADDRESSINGMODE_7BIT;
I2cHandle.Init.DualAddressMode= I2C_DUALADDRESS_DISABLE;
I2cHandle.Init.OwnAddress2= 0;
I2cHandle.Init.GeneralCallMode= I2C_GENERALCALL_DISABLE;
I2cHandle.Init.NoStretchMode= I2C_NOSTRETCH_DISABLE;
if(HAL_I2C_Init(&I2cHandle)!= HAL_OK)
{
/* InitializationError */
Error_Handler();
}
while(1)
{
HAL_I2C_Master_Transmit(&I2cHandle,(uint16_t)I2C_ADDRESS,
(uint8_t*)aTxBuffer, TXBUFFERSIZE, 10000);
}
二 现象分析
将上述程序在STM32F469i-Disco板上实现,复现现象并寻找规律。发现规律如下:
分析上表可以发现问题的产生与硬件设计有一定关系。观察发现,如果I2C没有外部上拉时,会导致问题产生。
通过单步调试,定位于HAL_I2C_Master_Transmit(),在这个函数中调用的I2C_WaitOnFlagUntilTimeout()无法执行异常,返回HAL_BUSY,导致了I2C写功能失败。在I2C_WaitOnFlagUntilTimeout函数内部,是对忙标志位BUSY@I2Cx_SR2的检测。通过对参考手册的阅读(如下截图所述),如果在未占用I2C总线时,SDA或SCL引脚存在低电平,则意味着总线处于忙状态。这种检测机制在I2C接口失能时依然工作。
结合程序中调用顺序,在I2C3时钟使能时,虽然I2C3没有使能,但是忙状态检测已经开始。由于对应的SCL引脚上无上拉电阻,并且由于还未对I2C3的SCL引脚进行配置。此时SCL引脚为浮空输入状态,实际测量发现为低电平,BUSY标志被置位。
三 解决方法
通过现象及分析,可了解到问题可通过硬件或者软件解决。
硬件方面,为SDA、SCL引脚提供外部的I2C上拉电阻,问题不在出现。
软件方面,发现在对SCL、SDA引脚配置时会启用内部上拉。通过将I2C时钟使能代码放于I2C引脚配置语句后面,问题也不再出现。
需要注意, I2C的SDA、SCL引脚内部上拉电阻,为弱上拉。使用者可以通过对应型号STM32的数据手册,查看对应引脚的上拉电阻,以便判断是否能够满足应用需要。如下为STM32F469上拉电阻信息截图。
==================================
-
I2C
+关注
关注
28文章
1472浏览量
122944 -
数据收发
+关注
关注
0文章
8浏览量
7750
原文标题:I2C配置顺序引发的异常案例
文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论