在使用飞行时间传感器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)
库文件的Pastebin链接
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;
}
}
问候。
我也有同样的问题。你找到了解决方案吗?
对我来说,函数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中的常见错误。