[HAL][SPI] Add assert on 16-bit aligned address
diff --git a/Inc/stm32g0xx_hal_spi.h b/Inc/stm32g0xx_hal_spi.h
index 4416e93..5788ac0 100644
--- a/Inc/stm32g0xx_hal_spi.h
+++ b/Inc/stm32g0xx_hal_spi.h
@@ -754,6 +754,12 @@
   */
 #define IS_SPI_DMA_HANDLE(__HANDLE__) ((__HANDLE__) != NULL)
 
+/** @brief  Checks if a data address is 16bit aligned.
+  * @param  __DATA__ specifies a data address.
+  * @retval None
+  */
+#define IS_SPI_16BIT_ALIGNED_ADDRESS(__DATA__) (((uint32_t)(__DATA__) % 2U) == 0U)
+
 /**
   * @}
   */
diff --git a/Src/stm32g0xx_hal_spi.c b/Src/stm32g0xx_hal_spi.c
index 6284e41..72f7b19 100644
--- a/Src/stm32g0xx_hal_spi.c
+++ b/Src/stm32g0xx_hal_spi.c
@@ -68,6 +68,14 @@
           (##) HAL_SPI_DeInit()
           (##) HAL_SPI_Init()
      [..]
+       Data buffer address alignment restriction:
+      (#) There is no support for unaligned accesses on the Cortex-M0 processor.
+          If the user wants to transfer in 16Bit data mode, it shall ensure that 16-bit aligned address is used for:
+          (##) pData parameter in HAL_SPI_Transmit(), HAL_SPI_Transmit_IT(), HAL_SPI_Receive() and HAL_SPI_Receive_IT()
+          (##) pTxData and pRxData parameters in HAL_SPI_TransmitReceive() and HAL_SPI_TransmitReceive_IT()
+      (#) There is no such restriction when going through DMA by using HAL_SPI_Transmit_DMA(), HAL_SPI_Receive_DMA()
+          and HAL_SPI_TransmitReceive_DMA().
+     [..]
        Callback registration:
 
       (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U
@@ -823,6 +831,13 @@
   uint32_t tickstart;
   uint16_t initial_TxXferCount;
 
+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
+  {
+    /* in this case, 16-bit access is performed on Data
+       So, check Data is 16-bit aligned address */
+    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pData));
+  }
+
   /* Check Direction parameter */
   assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
 
@@ -993,6 +1008,13 @@
 #endif /* USE_SPI_CRC */
   uint32_t tickstart;
 
+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
+  {
+    /* in this case, 16-bit access is performed on Data
+       So, check Data is 16-bit aligned address */
+    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pData));
+  }
+
   if (hspi->State != HAL_SPI_STATE_READY)
   {
     return HAL_BUSY;
@@ -1245,6 +1267,14 @@
   /* Variable used to alternate Rx and Tx during transfer */
   uint32_t             txallowed = 1U;
 
+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
+  {
+    /* in this case, 16-bit access is performed on Data
+       So, check Data is 16-bit aligned address */
+    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pTxData));
+    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pRxData));
+  }
+
   /* Check Direction parameter */
   assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));
 
@@ -1543,6 +1573,13 @@
 HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
 {
 
+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
+  {
+    /* in this case, 16-bit access is performed on Data
+       So, check Data is 16-bit aligned address */
+    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pData));
+  }
+
   /* Check Direction parameter */
   assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction));
 
@@ -1624,6 +1661,13 @@
   */
 HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
 {
+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
+  {
+    /* in this case, 16-bit access is performed on Data
+       So, check Data is 16-bit aligned address */
+    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pData));
+  }
+
 
   if (hspi->State != HAL_SPI_STATE_READY)
   {
@@ -1731,6 +1775,14 @@
   uint32_t             tmp_mode;
   HAL_SPI_StateTypeDef tmp_state;
 
+  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
+  {
+    /* in this case, 16-bit access is performed on Data
+       So, check Data is 16-bit aligned address */
+    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pTxData));
+    assert_param(IS_SPI_16BIT_ALIGNED_ADDRESS(pRxData));
+  }
+
   /* Check Direction parameter */
   assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction));