Support for "repeated start" in STM32 HAL I2C library
Q:
I am working with a slave I2C device (Kionix KX022 acccelerometer) which uses a "repeated start" mechanism to send data requested by the master (STM32F405), e.g. to read two bytes of data (from register N and register N+1) the following sequence
Master Slave
--------------------- ------------------------
START
Slave Address + Write
ACK
N (starting register)
ACK
START (repeat)
Slave Address + Read
ACK
Data
ACK
Data
NACK
STOP
It appears the STM32F4xx HAL I2C library does not support this directly, since HAL_I2C_Master_Transmit() sends STOP after the data.
I just want to confirm this before writing some code (i.e. gluing together the HAL_I2C_Master_Transmit() and HAL_I2C_Master_Recieve() functions and removing the intervening STOP).
Thanks in advance,
Mike
Master Slave
--------------------- ------------------------
START
Slave Address + Write
ACK
N (starting register)
ACK
START (repeat)
Slave Address + Read
ACK
Data
ACK
Data
NACK
STOP
It appears the STM32F4xx HAL I2C library does not support this directly, since HAL_I2C_Master_Transmit() sends STOP after the data.
I just want to confirm this before writing some code (i.e. gluing together the HAL_I2C_Master_Transmit() and HAL_I2C_Master_Recieve() functions and removing the intervening STOP).
Thanks in advance,
Mike
A:
Hi Mike,
Regarding your needs, it seems that your I2C slave device have a comportment like a EEPROM memory. For this prefer to use HAL_I2C_Mem_Write or HAL_I2C_Mem_Read interface.
To give you more explanation about functionality of this interface :
1- First step of this interface is to send this sequence => START + Slave addr + R/W bit + ACK + Regvalue to write or read + ACK
2- Second step of this interface is to send this sequence => Repeated Start + Slave addr + R/W bit + ACK + DataValue to write or read on RegValue + ACK ….+ STOP
Hope that help,
Best regards,
Heisenberg.
Regarding your needs, it seems that your I2C slave device have a comportment like a EEPROM memory. For this prefer to use HAL_I2C_Mem_Write or HAL_I2C_Mem_Read interface.
To give you more explanation about functionality of this interface :
1- First step of this interface is to send this sequence => START + Slave addr + R/W bit + ACK + Regvalue to write or read + ACK
2- Second step of this interface is to send this sequence => Repeated Start + Slave addr + R/W bit + ACK + DataValue to write or read on RegValue + ACK ….+ STOP
Hope that help,
Best regards,
Heisenberg.
注:
HAL_I2C_Mem_Read和HAL_I2C_Mem_Write 操作真的很方便。
应用如:
SD3088 读数据方法 1 示例(从 7H~9H 地址读取数据):
模拟读写I2C,再见。