AnsweredAssumed Answered

I2C always falls into HAL_I2C_ERROR_AF

Question asked by Thiago Cavalcanti on Dec 20, 2017
Latest reply on Apr 12, 2018 by waclawek.jan

Hi, everyone.

I2C peripheral has been initialized with STM32CubeMX according to the picture bellow:

I am using I2C1, pins B9 (data) and B8 (clock) in STM32F4 - Discovery. The device‘s address is 0x60 (Says the datasheet). I am using pull-up (8 KOhm) and conflict protection resistors (1.2 KOhm).I can neither read nor write to the slave device. I’ve tried the two following ways:

1)uint8_t outputData = 0;

HAL_I2C_Mem_Read(&hi2c1, 0x60, 0x0A, I2C_MEMADD_SIZE_8BIT, &outputData, 1, HAL_MAX_DELAY);

2)uint8_t outputData = 0;
HAL_StatusTypeDef returnValue = 0;
returnValue = HAL_I2C_Master_Transmit(&hi2c1, 0x60, (uint8_t*)0x0A, 1, HAL_MAX_DELAY);
if(returnValue != HAL_OK) return returnValue;
returnValue = HAL_I2C_Master_Receive(&hi2c1, 0x60, &outputData, 1, HAL_MAX_DELAY);

These functions always falls into the following “if” block:

/* Send Slave Address and Memory Address */
if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
/* Process Unlocked */
return HAL_ERROR;

The next picture shows the activity in the I2C bus: