- This topic has 1 reply, 1 voice, and was last updated 7 years, 9 months ago by .
Viewing 2 posts - 1 through 2 (of 2 total)
Viewing 2 posts - 1 through 2 (of 2 total)
- You must be logged in to reply to this topic.
Home › Forums › Mastering STM32 book support forum › I2C Sequential Read
Hi Carmine,
I trying to read register(s) from my MPC9808 (Temp sensor).
While I can read with HAL_I2C_Mem_Read with this code:
for (int ii = 0x0; ii < 0x9; ++ii) {
while(HAL_I2C_IsDeviceReady(&hi2c1, 0x30, 1, HAL_MAX_DELAY) != HAL_OK);
I2C_Status = HAL_I2C_Mem_Read(&hi2c1, 0x30, ii, I2C_MEMADD_SIZE_8BIT, pData,\
sizeof(pData), HAL_MAX_DELAY);
}
I can read 8 registers as documented in the MPC data sheet ( with correct values).
But I cannot succeed with
I2C_Status = HAL_I2C_Master_Sequential_Transmit_IT(&hi2c1, 0x30, pData, \
sizeof(pData), I2C_FIRST_FRAME);
while(HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
I2C_Status = HAL_I2C_Master_Sequential_Receive_IT(&hi2c1, 0x30, pData, sizeof(pData), I2C_LAST_FRAME);
The data sheet specifies;
Start -> dev addr -> W bit-> ACK -> Register pointer (0x5 for temp) -> ACK
Then
Restart -> Dev addr -> R bit -> ACK -> MSB data -> ACK -> LSB data -> NACK
With HAL_I2C_Master_Sequential_Receive_IT I get the I2C1_EV_IRQHandler(void) fired but with
HAL_I2C_Master_Sequential_Receive_IT and the I2C_LAST_FRAME option I do not get any interrupt fired.
If I change to FIRST AND LAST FRAME then I get an infinite number of interlocks fired and stay blocked in
I2C1_EV_IRQHandler(void).
Could you help me clarify this?
If I look at the data sheet it seems to match what is described in the book for sequential transmission. Correct?
Thank you very much for your help.
Kind regards,
Olivier
Ok I found my mistake.
The config pointer as named by Microship ( Register addr) is only 1 byte long.
I was splitting MSB/LSB from the register address to pData[2].
So I can read with
Flush_Buffer(pData, sizeof(pData));
for (int i = 0; i < 9; ++i) {
reg = (uint8_t)i;
I2C_Status = HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)MCP9808_DEV_ADDR, (uint8_t*)®, sizeof(reg), HAL_MAX_DELAY);
while(HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)MCP9808_DEV_ADDR, 1, HAL_MAX_DELAY) != HAL_OK);
I2C_Status = HAL_I2C_Master_Receive(&hi2c1, (uint16_t)MCP9808_DEV_ADDR, (uint8_t*)&pData, sizeof(pData), HAL_MAX_DELAY);
}
Let see if I can write 😉