Skip to content

Commit 8e473be

Browse files
authored
Merge pull request #2622 from egostm/dev_i2c_asynch
[STM32F4] Add asynchronous I2C
2 parents 63f5854 + 22d6bc0 commit 8e473be

File tree

27 files changed

+749
-253
lines changed

27 files changed

+749
-253
lines changed

hal/targets.json

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@
783783
"progen": {"target": "nucleo-f401re"},
784784
"detect_code": ["0720"],
785785
"macros": ["TRANSACTION_QUEUE_SIZE_SPI=2"],
786-
"device_has": ["ANALOGIN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
786+
"device_has": ["ANALOGIN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
787787
"release_versions": ["2", "5"]
788788
},
789789
"NUCLEO_F410RB": {
@@ -796,7 +796,7 @@
796796
"progen": {"target": "nucleo-f410rb"},
797797
"macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT", "TRANSACTION_QUEUE_SIZE_SPI=2"],
798798
"detect_code": ["0740"],
799-
"device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
799+
"device_has": ["ANALOGIN", "ANALOGOUT", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
800800
"release_versions": ["2", "5"]
801801
},
802802
"NUCLEO_F411RE": {
@@ -809,7 +809,7 @@
809809
"progen": {"target": "nucleo-f411re"},
810810
"detect_code": ["0740"],
811811
"macros": ["TRANSACTION_QUEUE_SIZE_SPI=2"],
812-
"device_has": ["ANALOGIN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
812+
"device_has": ["ANALOGIN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"],
813813
"release_versions": ["2", "5"]
814814
},
815815
"ELMO_F411RE": {
@@ -834,7 +834,7 @@
834834
"supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"],
835835
"progen": {"target": "nucleo-f429zi"},
836836
"macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT", "DEVICE_RTC_LSI=1", "TRANSACTION_QUEUE_SIZE_SPI=2"],
837-
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
837+
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "RTC_LSI", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
838838
"detect_code": ["0796"],
839839
"features": ["IPV4"],
840840
"release_versions": ["2", "5"]
@@ -849,7 +849,7 @@
849849
"progen": {"target": "nucleo-f446re"},
850850
"detect_code": ["0777"],
851851
"macros": ["TRANSACTION_QUEUE_SIZE_SPI=2"],
852-
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
852+
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
853853
"release_versions": ["2", "5"]
854854
},
855855
"NUCLEO_F446ZE": {
@@ -862,7 +862,8 @@
862862
"progen": {"target": "nucleo-f446ze"},
863863
"detect_code": ["0778"],
864864
"macros": ["TRANSACTION_QUEUE_SIZE_SPI=2"],
865-
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"]
865+
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
866+
"release_versions": ["2", "5"]
866867
},
867868

868869
"B96B_F446VE": {
@@ -1077,7 +1078,7 @@
10771078
"macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT","DEVICE_RTC_LSI=1","TRANSACTION_QUEUE_SIZE_SPI=2"],
10781079
"supported_toolchains": ["ARM", "uARM", "GCC_ARM", "IAR"],
10791080
"progen": {"target": "disco-f429zi"},
1080-
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
1081+
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
10811082
"release_versions": ["2", "5"]
10821083
},
10831084
"DISCO_F469NI": {
@@ -1090,7 +1091,7 @@
10901091
"macros": ["MBEDTLS_ENTROPY_HARDWARE_ALT","TRANSACTION_QUEUE_SIZE_SPI=2"],
10911092
"progen": {"target": "disco-f469ni"},
10921093
"detect_code": ["0788"],
1093-
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"],
1094+
"device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"],
10941095
"release_versions": ["2", "5"]
10951096
},
10961097
"DISCO_L053C8": {

hal/targets/cmsis/TARGET_STM/TARGET_STM32F4/stm32f4xx_hal_i2c.c

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,7 +1297,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c,
12971297

12981298
/* Process Unlocked */
12991299
__HAL_UNLOCK(hi2c);
1300-
1300+
13011301
return HAL_TIMEOUT;
13021302
}
13031303
}
@@ -1321,7 +1321,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c,
13211321
hi2c->Devaddress = DevAddress;
13221322

13231323
Prev_State = hi2c->PreviousState;
1324-
1324+
13251325
/* Generate Start */
13261326
if((Prev_State == I2C_STATE_MASTER_BUSY_RX) || (Prev_State == I2C_STATE_NONE))
13271327
{
@@ -3689,7 +3689,7 @@ static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c)
36893689

36903690
/* Generate Stop */
36913691
hi2c->Instance->CR1 |= I2C_CR1_STOP;
3692-
3692+
36933693
hi2c->PreviousState = I2C_STATE_NONE;
36943694
hi2c->State = HAL_I2C_STATE_READY;
36953695

@@ -3840,6 +3840,7 @@ static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c)
38403840
*/
38413841
static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
38423842
{
3843+
38433844
if(hi2c->State == HAL_I2C_STATE_BUSY_RX)
38443845
{
38453846
uint32_t tmp = 0U;
@@ -3853,34 +3854,24 @@ static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c)
38533854
}
38543855
else if((tmp == 2U) || (tmp == 3U))
38553856
{
3856-
if(hi2c->XferOptions != I2C_NEXT_FRAME)
3857-
{
3858-
/* Disable Acknowledge */
3859-
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3860-
3861-
/* Enable Pos */
3862-
hi2c->Instance->CR1 |= I2C_CR1_POS;
3863-
}
3864-
else
3865-
{
3866-
/* Enable Acknowledge */
3867-
hi2c->Instance->CR1 |= I2C_CR1_ACK;
3868-
}
3857+
/* Disable Acknowledge */
3858+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3859+
3860+
/* Enable Pos */
3861+
hi2c->Instance->CR1 |= I2C_CR1_POS;
38693862

38703863
/* Disable BUF interrupt */
38713864
__HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF);
38723865
}
38733866
else
38743867
{
3875-
if(hi2c->XferOptions != I2C_NEXT_FRAME)
3876-
{
3877-
/* Disable Acknowledge */
3878-
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3879-
}
3880-
else
3868+
/* Disable Acknowledge */
3869+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3870+
3871+
if(hi2c->XferOptions == I2C_NEXT_FRAME)
38813872
{
3882-
/* Enable Acknowledge */
3883-
hi2c->Instance->CR1 |= I2C_CR1_ACK;
3873+
/* Enable Pos */
3874+
hi2c->Instance->CR1 |= I2C_CR1_POS;
38843875
}
38853876

38863877
/* Disable EVT, BUF and ERR interrupt */
@@ -3938,15 +3929,13 @@ static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c)
39383929
/* Prepare next transfer or stop current transfer */
39393930
if((CurrentXferOptions != I2C_FIRST_AND_LAST_FRAME) && (CurrentXferOptions != I2C_LAST_FRAME) && (CurrentXferOptions != I2C_NO_OPTION_FRAME))
39403931
{
3941-
if(CurrentXferOptions != I2C_NEXT_FRAME)
3942-
{
3943-
/* Disable Acknowledge */
3944-
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3945-
}
3946-
else
3932+
/* Disable Acknowledge */
3933+
hi2c->Instance->CR1 &= ~I2C_CR1_ACK;
3934+
3935+
if((CurrentXferOptions == I2C_NEXT_FRAME) || (CurrentXferOptions == I2C_FIRST_FRAME))
39473936
{
3948-
/* Enable Acknowledge */
3949-
hi2c->Instance->CR1 |= I2C_CR1_ACK;
3937+
/* Generate Start */
3938+
hi2c->Instance->CR1 |= I2C_CR1_START;
39503939
}
39513940
tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
39523941
hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_ARCH_MAX/objects.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,7 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
68+
7269

7370
#include "common_objects.h"
7471
#include "gpio_object.h"

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_B96B_F446VE/objects.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,6 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
7268

7369
struct can_s {
7470
CANName can;

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F401VC/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ struct analogin_s {
6060
uint8_t channel;
6161
};
6262

63-
struct i2c_s {
64-
I2CName i2c;
65-
uint32_t slave;
66-
};
67-
6863
#include "common_objects.h"
6964
#include "gpio_object.h"
7065

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F407VG/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
72-
7368
#include "common_objects.h"
7469
#include "gpio_object.h"
7570

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F429ZI/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
72-
7368
struct can_s {
7469
CANName can;
7570
int index;

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_DISCO_F469NI/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
72-
7368
struct can_s {
7469
CANName can;
7570
int index;

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_ELMO_F411RE/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ struct analogin_s {
6060
uint8_t channel;
6161
};
6262

63-
struct i2c_s {
64-
I2CName i2c;
65-
uint32_t slave;
66-
};
67-
6863
#include "common_objects.h"
6964
#include "gpio_object.h"
7065

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_MTS_DRAGONFLY_F411RE/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ struct analogin_s {
6060
uint8_t channel;
6161
};
6262

63-
struct i2c_s {
64-
I2CName i2c;
65-
uint32_t slave;
66-
};
67-
6863
#include "common_objects.h"
6964
#include "gpio_object.h"
7065

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_MTS_MDOT_F405RG/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
72-
7368
#include "common_objects.h"
7469
#include "gpio_object.h"
7570

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_MTS_MDOT_F411RE/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ struct analogin_s {
6060
uint8_t channel;
6161
};
6262

63-
struct i2c_s {
64-
I2CName i2c;
65-
uint32_t slave;
66-
};
67-
6863
#include "common_objects.h"
6964
#include "gpio_object.h"
7065

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F401RE/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ struct analogin_s {
6060
uint8_t channel;
6161
};
6262

63-
struct i2c_s {
64-
I2CName i2c;
65-
uint32_t slave;
66-
};
67-
6863
#include "common_objects.h"
6964
#include "gpio_object.h"
7065

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F410RB/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
72-
7368
#include "common_objects.h"
7469
#include "gpio_object.h"
7570

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F411RE/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ struct analogin_s {
6060
uint8_t channel;
6161
};
6262

63-
struct i2c_s {
64-
I2CName i2c;
65-
uint32_t slave;
66-
};
67-
6863
#include "common_objects.h"
6964
#include "gpio_object.h"
7065

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F429ZI/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
72-
7368
struct can_s {
7469
CANName can;
7570
int index;

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F446RE/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
72-
7368
struct can_s {
7469
CANName can;
7570
int index;

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F446ZE/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ struct dac_s {
6565
uint8_t channel;
6666
};
6767

68-
struct i2c_s {
69-
I2CName i2c;
70-
uint32_t slave;
71-
};
72-
7368
struct can_s {
7469
CANName can;
7570
int index;

hal/targets/hal/TARGET_STM/TARGET_STM32F4/TARGET_UBLOX_C029/objects.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,6 @@ struct analogin_s {
6262

6363

6464

65-
struct i2c_s {
66-
I2CName i2c;
67-
uint32_t slave;
68-
};
69-
7065
#include "common_objects.h"
7166
struct can_s {
7267
CANName can;

0 commit comments

Comments
 (0)