Created
March 21, 2018 16:04
-
-
Save utzig/0dbdc03aaa21c4ac8d20ac622cef6271 to your computer and use it in GitHub Desktop.
I2C diff from STM32Cube
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
commit 689a232a22df3ad2772792f871e05bf0bd0521d3 | |
Author: Marko Kiiskila <marko@runtime.io> | |
Date: Wed Oct 19 15:34:04 2016 -0700 | |
stm32f4 SDK; add routines to write/read from i2c bus without sending | |
STOP in the end. | |
diff --git a/hw/mcu/stm/stm32f4xx/src/ext/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h b/hw/mcu/stm/stm32f4xx/src/ext/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h | |
index eb08c315d..863e14073 100644 | |
--- a/hw/mcu/stm/stm32f4xx/src/ext/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h | |
+++ b/hw/mcu/stm/stm32f4xx/src/ext/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2c.h | |
@@ -156,7 +156,8 @@ typedef enum | |
HAL_I2C_MODE_NONE = 0x00U, /*!< No I2C communication on going */ | |
HAL_I2C_MODE_MASTER = 0x10U, /*!< I2C communication is in Master Mode */ | |
HAL_I2C_MODE_SLAVE = 0x20U, /*!< I2C communication is in Slave Mode */ | |
- HAL_I2C_MODE_MEM = 0x40U /*!< I2C communication is in Memory Mode */ | |
+ HAL_I2C_MODE_MEM = 0x40U, /*!< I2C communication is in Memory Mode */ | |
+ HAL_I2C_MODE_MASTER_SEL = 0x11U /*!< I2C communication is in Master Mode, no stop sent */ | |
}HAL_I2C_ModeTypeDef; | |
@@ -504,6 +505,9 @@ HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress | |
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); | |
HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout); | |
+HAL_StatusTypeDef HAL_I2C_Master_Transmit_NoStop(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); | |
+HAL_StatusTypeDef HAL_I2C_Master_Receive_NoStop(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); | |
+ | |
/******* Non-Blocking mode: Interrupt */ | |
HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); | |
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); | |
diff --git a/hw/mcu/stm/stm32f4xx/src/ext/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c b/hw/mcu/stm/stm32f4xx/src/ext/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c | |
index 51e74513f..113f9af04 100644 | |
--- a/hw/mcu/stm/stm32f4xx/src/ext/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c | |
+++ b/hw/mcu/stm/stm32f4xx/src/ext/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c | |
@@ -563,7 +563,7 @@ HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c) | |
* @param Timeout Timeout duration | |
* @retval HAL status | |
*/ | |
-HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) | |
+static HAL_StatusTypeDef HAL_I2C_Master_Transmit_Common(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout, uint8_t sendStop) | |
{ | |
uint32_t tickstart = 0x00U; | |
@@ -572,10 +572,12 @@ HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevA | |
if(hi2c->State == HAL_I2C_STATE_READY) | |
{ | |
- /* Wait until BUSY flag is reset */ | |
- if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) | |
- { | |
- return HAL_BUSY; | |
+ if (hi2c->Mode != HAL_I2C_MODE_MASTER_SEL) { | |
+ /* Wait until BUSY flag is reset */ | |
+ if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) | |
+ { | |
+ return HAL_BUSY; | |
+ } | |
} | |
/* Process Locked */ | |
@@ -654,10 +656,14 @@ HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevA | |
} | |
/* Generate Stop */ | |
- hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
+ if (sendStop) { | |
+ hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
+ hi2c->Mode = HAL_I2C_MODE_NONE; | |
+ } else { | |
+ hi2c->Mode = HAL_I2C_MODE_MASTER_SEL; | |
+ } | |
hi2c->State = HAL_I2C_STATE_READY; | |
- hi2c->Mode = HAL_I2C_MODE_NONE; | |
/* Process Unlocked */ | |
__HAL_UNLOCK(hi2c); | |
@@ -670,6 +676,18 @@ HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevA | |
} | |
} | |
+HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) | |
+{ | |
+ return HAL_I2C_Master_Transmit_Common(hi2c, DevAddress, pData, Size, | |
+ Timeout, 1); | |
+} | |
+ | |
+HAL_StatusTypeDef HAL_I2C_Master_Transmit_NoStop(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) | |
+{ | |
+ return HAL_I2C_Master_Transmit_Common(hi2c, DevAddress, pData, Size, | |
+ Timeout, 0); | |
+} | |
+ | |
/** | |
* @brief Receives in master mode an amount of data in blocking mode. | |
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains | |
@@ -681,7 +699,7 @@ HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevA | |
* @param Timeout Timeout duration | |
* @retval HAL status | |
*/ | |
-HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) | |
+static HAL_StatusTypeDef HAL_I2C_Master_Receive_Common(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout, int sendStop) | |
{ | |
uint32_t tickstart = 0x00U; | |
@@ -690,10 +708,12 @@ HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAd | |
if(hi2c->State == HAL_I2C_STATE_READY) | |
{ | |
- /* Wait until BUSY flag is reset */ | |
- if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) | |
- { | |
- return HAL_BUSY; | |
+ if (hi2c->Mode != HAL_I2C_MODE_MASTER_SEL) { | |
+ /* Wait until BUSY flag is reset */ | |
+ if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK) | |
+ { | |
+ return HAL_BUSY; | |
+ } | |
} | |
/* Process Locked */ | |
@@ -728,9 +748,11 @@ HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAd | |
{ | |
/* Clear ADDR flag */ | |
__HAL_I2C_CLEAR_ADDRFLAG(hi2c); | |
- | |
- /* Generate Stop */ | |
- hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
+ | |
+ if (sendStop) { | |
+ /* Generate Stop */ | |
+ hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
+ } | |
} | |
else if(Size == 1U) | |
{ | |
@@ -740,8 +762,10 @@ HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAd | |
/* Clear ADDR flag */ | |
__HAL_I2C_CLEAR_ADDRFLAG(hi2c); | |
- /* Generate Stop */ | |
- hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
+ if (sendStop) { | |
+ /* Generate Stop */ | |
+ hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
+ } | |
} | |
else if(Size == 2U) | |
{ | |
@@ -796,9 +820,10 @@ HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAd | |
return HAL_TIMEOUT; | |
} | |
- /* Generate Stop */ | |
- hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
- | |
+ if (sendStop) { | |
+ /* Generate Stop */ | |
+ hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
+ } | |
/* Read data from DR */ | |
(*pData++) = hi2c->Instance->DR; | |
Size--; | |
@@ -829,8 +854,10 @@ HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAd | |
return HAL_TIMEOUT; | |
} | |
- /* Generate Stop */ | |
- hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
+ if (sendStop) { | |
+ /* Generate Stop */ | |
+ hi2c->Instance->CR1 |= I2C_CR1_STOP; | |
+ } | |
/* Read data from DR */ | |
(*pData++) = hi2c->Instance->DR; | |
@@ -870,7 +897,11 @@ HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAd | |
} | |
hi2c->State = HAL_I2C_STATE_READY; | |
- hi2c->Mode = HAL_I2C_MODE_NONE; | |
+ if (!sendStop) { | |
+ hi2c->Mode = HAL_I2C_MODE_MASTER_SEL; | |
+ } else { | |
+ hi2c->Mode = HAL_I2C_MODE_NONE; | |
+ } | |
/* Process Unlocked */ | |
__HAL_UNLOCK(hi2c); | |
@@ -883,6 +914,18 @@ HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAd | |
} | |
} | |
+HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) | |
+{ | |
+ return HAL_I2C_Master_Receive_Common(hi2c, DevAddress, pData, Size, | |
+ Timeout, 1); | |
+} | |
+ | |
+HAL_StatusTypeDef HAL_I2C_Master_Receive_NoStop(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) | |
+{ | |
+ return HAL_I2C_Master_Receive_Common(hi2c, DevAddress, pData, Size, | |
+ Timeout, 0); | |
+} | |
+ | |
/** | |
* @brief Transmits in slave mode an amount of data in blocking mode. | |
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment