在使用飞行时间传感器VL53L0x - 200 cm
和VL6180x - 60 cm
时,我遇到了一个非常奇怪的问题。我有两个董事会,STM32F446 Nucleo
和STM32F767 Nucleo
。我已经在STM32F767 Nucleo
上为两个飞行时间传感器编写了库。但是,当我尝试在STM32F446 Nucleo
上实现相同的库时,它不起作用。
在寻找解决方案时,我发现I2C存在问题。在F7中,一切都很好,它返回HAL_OK。但是在F4中,它返回“ HAL_ERROR”。我说的是这个功能。
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
库文件的astebin链接
https://pastebin.com/z15btwTD-vl6180.c
https://pastebin.com/62XYxUVx-vl6180.h
在vl6180.h
中,我已将#include "stm32f7xx.h"
更改为#include "stm32f4xx.h"
,同时用于STM32F446 Nucleo
。我在两个板上都使用I2C1。但是我也尝试过其他I2C,但是它们都遇到了同样的问题。 Hal库是使用CubeMx生成的,而Attolic True Studio是IDE。
VL53L0X Sensor
也发生了同样的事情。
任何建议将不胜感激。
编辑
从HAL_I2C_Master_Transmit()
函数的这一特定部分返回HAL_ERROR
if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK)
{
if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
{
/* Process Unlocked */
__HAL_UNLOCK(hi2c);
//HAL_GPIO_TogglePin(BLUE_GPIO_Port, BLUE_Pin);
return HAL_ERROR;
}
else
{
/* Process Unlocked */
__HAL_UNLOCK(hi2c);
return HAL_TIMEOUT;
}
}
致谢。
答案 0 :(得分:-1)
我有同样的问题。您找到解决方案了吗?
对我而言,函数 HAL_I2C_Master_Transmit()和 HAL_I2C_Master_Receive()返回 HAL_ERROR 。
我可以分析代码,我认为它与 HAL_I2C_ERROR_AF 有关,因为在 I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c,I2C_FLAG_ADD10)中发现 I2C_FLAG_AF 是SET。
我不知道如何解决该问题,但由于CubeMX,我发现这是stm32f4中的常见错误。