STM32/STM8技术论坛
直播中

傅梦麒

未满1年用户 11经验值
擅长:可编程逻辑
私信 关注
[问答]

hal库中i2c卡死在HAL_I2C_Master_Transmit

static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef hi2c, uint32_t Timeout,
uint32_t Tickstart)
{
while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET)
{
/
Check if an error is detected /
if (I2C_IsErrorOccurred(hi2c, Timeout, Tickstart) != HAL_OK)
{
return HAL_ERROR;
}
/
Check for the Timeout */
if (Timeout != HAL_MAX_DELAY)
{
if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
{
if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET))
{
hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
hi2c->State = HAL_I2C_STATE_READY;
hi2c->Mode = HAL_I2C_MODE_NONE;

/* Process Unlocked */
  __HAL_UNLOCK(hi2c);

  return HAL_ERROR;
}

}
}

}
我使用stm32F303作为主机使用i2c通信,通信时信息已经从主机发送到从机,从机执行了相应操作,但主机一直卡在HAL_I2C_Master_Transmit函数,经过断点排查,卡在这个while循环中,请各位大佬分析下原因以及怎样解决

回帖(1)

王飞

4 天前
这段代码是STM32 HAL库中I2C通信的一个函数,用于等待I2C总线上的TXIS(发送数据寄存器空)标志位。这个函数的主要目的是在发送数据之前等待I2C总线上的发送数据寄存器为空,以便可以发送新的数据。

函数的参数如下:
- `hi2c`:I2C句柄,包含了I2C配置和状态信息。
- `Timeout`:超时时间,用于控制等待TXIS标志位的最大时间。
- `Tickstart`:开始等待的时间点,通常使用`HAL_GetTick()`函数获取。

函数的主要步骤如下:
1. 检查TXIS标志位是否为RESET(0),如果是,则继续等待。
2. 检查是否发生错误,如果发生错误,则返回`HAL_ERROR`。
3. 检查是否超时,如果超时,则返回`HAL_ERROR`。

代码中的`I2C_IsErrorOccurred`函数用于检查I2C总线上是否发生错误,例如NACK(非确认)或总线错误等。如果发生错误,则返回`HAL_ERROR`。

代码中的`Timeout`参数用于控制等待TXIS标志位的最大时间。如果`Timeout`不为`HAL_MAX_DELAY`(通常表示无限等待),则检查是否超时。如果超时,则返回`HAL_ERROR`。

最后,如果TXIS标志位仍然为RESET,则函数返回`HAL_ERROR`,表示I2C总线上的发送数据寄存器没有变为非空,可能是I2C总线出现问题。

这段代码的主要目的是确保I2C总线上的发送数据寄存器为空,以便可以发送新的数据。如果I2C总线上出现问题,例如超时或错误,则函数会返回错误代码,以便上层应用可以处理这些错误。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分