Subversion Repositories DashDisplay

Rev

Rev 56 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 56 Rev 61
Line 164... Line 164...
164
    not defined, the callback registration feature is not available
164
    not defined, the callback registration feature is not available
165
    and weak (surcharged) callbacks are used.
165
    and weak (surcharged) callbacks are used.
166
 
166
 
167
  @endverbatim
167
  @endverbatim
168
     [..]
168
     [..]
169
       (@) Additionnal remark: If the parity is enabled, then the MSB bit of the data written
169
       (@) Additional remark: If the parity is enabled, then the MSB bit of the data written
170
           in the data register is transmitted but is changed by the parity bit.
170
           in the data register is transmitted but is changed by the parity bit.
171
           Depending on the frame length defined by the M bit (8-bits or 9-bits),
171
           Depending on the frame length defined by the M bit (8-bits or 9-bits),
172
           the possible USART frame formats are as listed in the following table:
172
           the possible USART frame formats are as listed in the following table:
173
    +-------------------------------------------------------------+
173
    +-------------------------------------------------------------+
174
    |   M bit |  PCE bit  |            USART frame                 |
174
    |   M bit |  PCE bit  |            USART frame                 |
Line 740... Line 740...
740
  * @param  Timeout Timeout duration.
740
  * @param  Timeout Timeout duration.
741
  * @retval HAL status
741
  * @retval HAL status
742
  */
742
  */
743
HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size, uint32_t Timeout)
743
HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size, uint32_t Timeout)
744
{
744
{
-
 
745
  uint8_t  *ptxdata8bits;
745
  uint16_t *tmp;
746
  uint16_t *ptxdata16bits;
746
  uint32_t tickstart = 0U;
747
  uint32_t tickstart;
747
 
748
 
748
  if (husart->State == HAL_USART_STATE_READY)
749
  if (husart->State == HAL_USART_STATE_READY)
749
  {
750
  {
750
    if ((pTxData == NULL) || (Size == 0))
751
    if ((pTxData == NULL) || (Size == 0))
751
    {
752
    {
Line 761... Line 762...
761
    /* Init tickstart for timeout management */
762
    /* Init tickstart for timeout management */
762
    tickstart = HAL_GetTick();
763
    tickstart = HAL_GetTick();
763
 
764
 
764
    husart->TxXferSize = Size;
765
    husart->TxXferSize = Size;
765
    husart->TxXferCount = Size;
766
    husart->TxXferCount = Size;
-
 
767
 
-
 
768
    /* In case of 9bits/No Parity transfer, pTxData needs to be handled as a uint16_t pointer */
-
 
769
    if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
-
 
770
    {
-
 
771
      ptxdata8bits  = NULL;
-
 
772
      ptxdata16bits = (uint16_t *) pTxData;
-
 
773
    }
-
 
774
    else
-
 
775
    {
-
 
776
      ptxdata8bits  = pTxData;
-
 
777
      ptxdata16bits = NULL;
-
 
778
    }
-
 
779
 
766
    while (husart->TxXferCount > 0U)
780
    while (husart->TxXferCount > 0U)
767
    {
781
    {
768
      husart->TxXferCount--;
782
      /* Wait for TXE flag in order to write data in DR */
769
      if (husart->Init.WordLength == USART_WORDLENGTH_9B)
783
      if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
770
      {
784
      {
771
        /* Wait for TC flag in order to write data in DR */
-
 
772
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
-
 
773
        {
-
 
774
          return HAL_TIMEOUT;
785
        return HAL_TIMEOUT;
775
        }
786
      }
776
        tmp = (uint16_t *) pTxData;
787
      if (ptxdata8bits == NULL)
777
        husart->Instance->DR = (*tmp & (uint16_t)0x01FF);
-
 
778
        if (husart->Init.Parity == USART_PARITY_NONE)
-
 
779
        {
788
      {
780
          pTxData += 2U;
789
        husart->Instance->DR = (uint16_t)(*ptxdata16bits & (uint16_t)0x01FF);
781
        }
-
 
782
        else
-
 
783
        {
-
 
784
          pTxData += 1U;
790
        ptxdata16bits++;
785
        }
-
 
786
      }
791
      }
787
      else
792
      else
788
      {
793
      {
789
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
794
        husart->Instance->DR = (uint8_t)(*ptxdata8bits & (uint8_t)0xFF);
790
        {
-
 
791
          return HAL_TIMEOUT;
795
        ptxdata8bits++;
792
        }
-
 
793
        husart->Instance->DR = (*pTxData++ & (uint8_t)0xFF);
-
 
794
      }
796
      }
-
 
797
 
-
 
798
      husart->TxXferCount--;
795
    }
799
    }
796
 
800
 
797
    if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
801
    if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
798
    {
802
    {
799
      return HAL_TIMEOUT;
803
      return HAL_TIMEOUT;
Line 825... Line 829...
825
  * @param  Timeout Timeout duration.
829
  * @param  Timeout Timeout duration.
826
  * @retval HAL status
830
  * @retval HAL status
827
  */
831
  */
828
HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
832
HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
829
{
833
{
-
 
834
  uint8_t  *prxdata8bits;
830
  uint16_t *tmp;
835
  uint16_t *prxdata16bits;
831
  uint32_t tickstart = 0U;
836
  uint32_t tickstart;
832
 
837
 
833
  if (husart->State == HAL_USART_STATE_READY)
838
  if (husart->State == HAL_USART_STATE_READY)
834
  {
839
  {
835
    if ((pRxData == NULL) || (Size == 0))
840
    if ((pRxData == NULL) || (Size == 0))
836
    {
841
    {
Line 845... Line 850...
845
    /* Init tickstart for timeout management */
850
    /* Init tickstart for timeout management */
846
    tickstart = HAL_GetTick();
851
    tickstart = HAL_GetTick();
847
 
852
 
848
    husart->RxXferSize = Size;
853
    husart->RxXferSize = Size;
849
    husart->RxXferCount = Size;
854
    husart->RxXferCount = Size;
-
 
855
 
-
 
856
    /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */
-
 
857
    if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
-
 
858
    {
-
 
859
      prxdata8bits  = NULL;
-
 
860
      prxdata16bits = (uint16_t *) pRxData;
-
 
861
    }
-
 
862
    else
-
 
863
    {
-
 
864
      prxdata8bits  = pRxData;
-
 
865
      prxdata16bits = NULL;
-
 
866
    }
-
 
867
 
850
    /* Check the remain data to be received */
868
    /* Check the remain data to be received */
851
    while (husart->RxXferCount > 0U)
869
    while (husart->RxXferCount > 0U)
852
    {
870
    {
-
 
871
      /* Wait until TXE flag is set to send dummy byte in order to generate the
853
      husart->RxXferCount--;
872
      * clock for the slave to send data.
-
 
873
      * Whatever the frame length (7, 8 or 9-bit long), the same dummy value
854
      if (husart->Init.WordLength == USART_WORDLENGTH_9B)
874
      * can be written for all the cases. */
-
 
875
      if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
855
      {
876
      {
856
        /* Wait until TXE flag is set to send dummy byte in order to generate the clock for the slave to send data */
-
 
857
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
-
 
858
        {
-
 
859
          return HAL_TIMEOUT;
877
        return HAL_TIMEOUT;
860
        }
878
      }
861
        /* Send dummy byte in order to generate clock */
-
 
862
        husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FF);
879
      husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x0FF);
863
 
880
 
864
        /* Wait for RXNE Flag */
881
      /* Wait until RXNE flag is set to receive the byte */
865
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
882
      if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
866
        {
883
      {
867
          return HAL_TIMEOUT;
884
        return HAL_TIMEOUT;
868
        }
885
      }
869
        tmp = (uint16_t *) pRxData ;
-
 
870
        if (husart->Init.Parity == USART_PARITY_NONE)
-
 
871
        {
886
 
872
          *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF);
-
 
873
          pRxData += 2U;
887
      if (prxdata8bits == NULL)
874
        }
-
 
875
        else
-
 
876
        {
888
      {
877
          *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF);
889
        *prxdata16bits = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF);
878
          pRxData += 1U;
890
        prxdata16bits++;
879
        }
-
 
880
      }
891
      }
881
      else
892
      else
882
      {
893
      {
883
        /* Wait until TXE flag is set to send dummy byte in order to generate the clock for the slave to send data */
-
 
884
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
-
 
885
        {
-
 
886
          return HAL_TIMEOUT;
-
 
887
        }
-
 
888
 
-
 
889
        /* Send Dummy Byte in order to generate clock */
-
 
890
        husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x00FF);
-
 
891
 
-
 
892
        /* Wait until RXNE flag is set to receive the byte */
-
 
893
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
894
        if ((husart->Init.WordLength == USART_WORDLENGTH_9B) || ((husart->Init.WordLength == USART_WORDLENGTH_8B) && (husart->Init.Parity == USART_PARITY_NONE)))
894
        {
-
 
895
          return HAL_TIMEOUT;
-
 
896
        }
-
 
897
        if (husart->Init.Parity == USART_PARITY_NONE)
-
 
898
        {
895
        {
899
          /* Receive data */
-
 
900
          *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF);
896
          *prxdata8bits = (uint8_t)(husart->Instance->DR & (uint8_t)0x0FF);
901
        }
897
        }
902
        else
898
        else
903
        {
899
        {
904
          /* Receive data */
-
 
905
          *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F);
900
          *prxdata8bits = (uint8_t)(husart->Instance->DR & (uint8_t)0x07F);
906
        }
901
        }
907
 
-
 
-
 
902
        prxdata8bits++;
908
      }
903
      }
-
 
904
      husart->RxXferCount--;
909
    }
905
    }
910
 
906
 
911
    husart->State = HAL_USART_STATE_READY;
907
    husart->State = HAL_USART_STATE_READY;
912
 
908
 
913
    /* Process Unlocked */
909
    /* Process Unlocked */
Line 934... Line 930...
934
  * @param  Timeout Timeout duration
930
  * @param  Timeout Timeout duration
935
  * @retval HAL status
931
  * @retval HAL status
936
  */
932
  */
937
HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
933
HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
938
{
934
{
-
 
935
  uint8_t  *prxdata8bits;
-
 
936
  uint16_t *prxdata16bits;
-
 
937
  uint8_t  *ptxdata8bits;
-
 
938
  uint16_t *ptxdata16bits;
939
  uint16_t *tmp;
939
  uint16_t rxdatacount;
940
  uint32_t tickstart = 0U;
940
  uint32_t tickstart;
941
 
941
 
942
  if (husart->State == HAL_USART_STATE_READY)
942
  if (husart->State == HAL_USART_STATE_READY)
943
  {
943
  {
944
    if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0))
944
    if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0))
945
    {
945
    {
946
      return  HAL_ERROR;
946
      return  HAL_ERROR;
947
    }
947
    }
-
 
948
 
-
 
949
    /* In case of 9bits/No Parity transfer, pTxData and pRxData buffers provided as input parameter
-
 
950
       should be aligned on a u16 frontier, as data to be filled into TDR/retrieved from RDR will be
-
 
951
       handled through a u16 cast. */
-
 
952
    if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
-
 
953
    {
-
 
954
      if (((((uint32_t)pTxData) & 1U) != 0U) || ((((uint32_t)pRxData) & 1U) != 0U))
-
 
955
      {
-
 
956
        return  HAL_ERROR;
-
 
957
      }
-
 
958
    }
948
    /* Process Locked */
959
    /* Process Locked */
949
    __HAL_LOCK(husart);
960
    __HAL_LOCK(husart);
950
 
961
 
951
    husart->ErrorCode = HAL_USART_ERROR_NONE;
962
    husart->ErrorCode = HAL_USART_ERROR_NONE;
952
    husart->State = HAL_USART_STATE_BUSY_RX;
963
    husart->State = HAL_USART_STATE_BUSY_RX;
Line 957... Line 968...
957
    husart->RxXferSize = Size;
968
    husart->RxXferSize = Size;
958
    husart->TxXferSize = Size;
969
    husart->TxXferSize = Size;
959
    husart->TxXferCount = Size;
970
    husart->TxXferCount = Size;
960
    husart->RxXferCount = Size;
971
    husart->RxXferCount = Size;
961
 
972
 
-
 
973
    /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */
-
 
974
    if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
-
 
975
    {
-
 
976
      prxdata8bits  = NULL;
-
 
977
      ptxdata8bits  = NULL;
-
 
978
      ptxdata16bits = (uint16_t *) pTxData;
-
 
979
      prxdata16bits = (uint16_t *) pRxData;
-
 
980
    }
-
 
981
    else
-
 
982
    {
-
 
983
      prxdata8bits  = pRxData;
-
 
984
      ptxdata8bits  = pTxData;
-
 
985
      ptxdata16bits = NULL;
-
 
986
      prxdata16bits = NULL;
-
 
987
    }
-
 
988
 
962
    /* Check the remain data to be received */
989
    /* Check the remain data to be received */
-
 
990
    /* rxdatacount is a temporary variable for MISRAC2012-Rule-13.5 */
-
 
991
    rxdatacount = husart->RxXferCount;
963
    while (husart->TxXferCount > 0U)
992
    while ((husart->TxXferCount > 0U) || (rxdatacount > 0U))
964
    {
993
    {
965
      husart->TxXferCount--;
994
      if (husart->TxXferCount > 0U)
966
      husart->RxXferCount--;
-
 
967
      if (husart->Init.WordLength == USART_WORDLENGTH_9B)
-
 
968
      {
995
      {
969
        /* Wait for TC flag in order to write data in DR */
996
        /* Wait for TXE flag in order to write data in DR */
970
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
997
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
971
        {
998
        {
972
          return HAL_TIMEOUT;
999
          return HAL_TIMEOUT;
973
        }
1000
        }
974
        tmp = (uint16_t *) pTxData;
-
 
975
        husart->Instance->DR = (*tmp & (uint16_t)0x01FF);
-
 
976
        if (husart->Init.Parity == USART_PARITY_NONE)
-
 
977
        {
-
 
978
          pTxData += 2U;
-
 
979
        }
-
 
980
        else
-
 
981
        {
-
 
982
          pTxData += 1U;
-
 
983
        }
-
 
984
 
1001
 
985
        /* Wait for RXNE Flag */
1002
        if (ptxdata8bits == NULL)
986
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
-
 
987
        {
1003
        {
988
          return HAL_TIMEOUT;
-
 
989
        }
-
 
990
        tmp = (uint16_t *) pRxData ;
-
 
991
        if (husart->Init.Parity == USART_PARITY_NONE)
-
 
992
        {
-
 
993
          *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF);
1004
          husart->Instance->DR = (uint16_t)(*ptxdata16bits & (uint16_t)0x01FF);
994
          pRxData += 2U;
1005
          ptxdata16bits++;
995
        }
1006
        }
996
        else
1007
        else
997
        {
1008
        {
998
          *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF);
1009
          husart->Instance->DR = (uint8_t)(*ptxdata8bits & (uint8_t)0xFF);
999
          pRxData += 1U;
1010
          ptxdata8bits++;
1000
        }
1011
        }
-
 
1012
 
-
 
1013
        husart->TxXferCount--;
1001
      }
1014
      }
1002
      else
-
 
1003
      {
-
 
1004
        /* Wait for TC flag in order to write data in DR */
-
 
1005
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
-
 
1006
        {
-
 
1007
          return HAL_TIMEOUT;
-
 
1008
        }
-
 
1009
        husart->Instance->DR = (*pTxData++ & (uint8_t)0x00FF);
-
 
1010
 
1015
 
-
 
1016
      if (husart->RxXferCount > 0U)
-
 
1017
      {  
1011
        /* Wait for RXNE Flag */
1018
        /* Wait for RXNE Flag */
1012
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
1019
        if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
1013
        {
1020
        {
1014
          return HAL_TIMEOUT;
1021
          return HAL_TIMEOUT;
1015
        }
1022
        }
1016
        if (husart->Init.Parity == USART_PARITY_NONE)
1023
        if (prxdata8bits == NULL)
1017
        {
1024
        {
1018
          /* Receive data */
-
 
1019
          *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF);
1025
          *prxdata16bits = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF);
-
 
1026
          prxdata16bits++;
1020
        }
1027
        }
1021
        else
1028
        else
1022
        {
1029
        {
-
 
1030
          if ((husart->Init.WordLength == USART_WORDLENGTH_9B) || ((husart->Init.WordLength == USART_WORDLENGTH_8B) && (husart->Init.Parity == USART_PARITY_NONE)))
-
 
1031
          {
-
 
1032
            *prxdata8bits = (uint8_t)(husart->Instance->DR & (uint8_t)0x0FF);
-
 
1033
          }
1023
          /* Receive data */
1034
          else
-
 
1035
          {
1024
          *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F);
1036
            *prxdata8bits = (uint8_t)(husart->Instance->DR & (uint8_t)0x07F);
-
 
1037
          }
-
 
1038
 
-
 
1039
          prxdata8bits++;
1025
        }
1040
        }
-
 
1041
 
-
 
1042
        husart->RxXferCount--;
1026
      }
1043
      }
-
 
1044
      rxdatacount = husart->RxXferCount;
1027
    }
1045
    }
1028
 
1046
 
1029
    husart->State = HAL_USART_STATE_READY;
1047
    husart->State = HAL_USART_STATE_READY;
1030
 
1048
 
1031
    /* Process Unlocked */
1049
    /* Process Unlocked */
Line 2152... Line 2170...
2152
    /* Disable the DMA transfer for the Transmit/receiver request by clearing the DMAT/DMAR bit
2170
    /* Disable the DMA transfer for the Transmit/receiver request by clearing the DMAT/DMAR bit
2153
         in the USART CR3 register */
2171
         in the USART CR3 register */
2154
    CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
2172
    CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
2155
    CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
2173
    CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
2156
 
2174
 
2157
    husart->State = HAL_USART_STATE_READY;
-
 
2158
 
-
 
2159
    /* The USART state is HAL_USART_STATE_BUSY_RX */
2175
    /* The USART state is HAL_USART_STATE_BUSY_RX */
2160
    if (husart->State == HAL_USART_STATE_BUSY_RX)
2176
    if (husart->State == HAL_USART_STATE_BUSY_RX)
2161
    {
2177
    {
2162
#if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2178
#if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2163
      /* Call registered Rx Complete Callback */
2179
      /* Call registered Rx Complete Callback */
Line 2176... Line 2192...
2176
#else
2192
#else
2177
      /* Call legacy weak Tx Rx Complete Callback */
2193
      /* Call legacy weak Tx Rx Complete Callback */
2178
      HAL_USART_TxRxCpltCallback(husart);
2194
      HAL_USART_TxRxCpltCallback(husart);
2179
#endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2195
#endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2180
    }
2196
    }
-
 
2197
    husart->State = HAL_USART_STATE_READY;
2181
  }
2198
  }
2182
  /* DMA circular mode */
2199
  /* DMA circular mode */
2183
  else
2200
  else
2184
  {
2201
  {
2185
    if (husart->State == HAL_USART_STATE_BUSY_RX)
2202
    if (husart->State == HAL_USART_STATE_BUSY_RX)
Line 2455... Line 2472...
2455
{
2472
{
2456
  uint16_t *tmp;
2473
  uint16_t *tmp;
2457
 
2474
 
2458
  if (husart->State == HAL_USART_STATE_BUSY_TX)
2475
  if (husart->State == HAL_USART_STATE_BUSY_TX)
2459
  {
2476
  {
2460
    if (husart->Init.WordLength == USART_WORDLENGTH_9B)
2477
    if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
2461
    {
2478
    {
2462
      tmp = (uint16_t *) husart->pTxBuffPtr;
2479
      tmp = (uint16_t *) husart->pTxBuffPtr;
2463
      husart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF);
2480
      husart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF);
2464
      if (husart->Init.Parity == USART_PARITY_NONE)
-
 
2465
      {
-
 
2466
        husart->pTxBuffPtr += 2U;
2481
      husart->pTxBuffPtr += 2U;
2467
      }
-
 
2468
      else
-
 
2469
      {
-
 
2470
        husart->pTxBuffPtr += 1U;
-
 
2471
      }
-
 
2472
    }
2482
    }
2473
    else
2483
    else
2474
    {
2484
    {
2475
      husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FF);
2485
      husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FF);
2476
    }
2486
    }
Line 2524... Line 2534...
2524
  *                the configuration information for the specified USART module.
2534
  *                the configuration information for the specified USART module.
2525
  * @retval HAL status
2535
  * @retval HAL status
2526
  */
2536
  */
2527
static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart)
2537
static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart)
2528
{
2538
{
-
 
2539
  uint8_t  *pdata8bits;
2529
  uint16_t *tmp;
2540
  uint16_t *pdata16bits;
-
 
2541
 
2530
  if (husart->State == HAL_USART_STATE_BUSY_RX)
2542
  if (husart->State == HAL_USART_STATE_BUSY_RX)
2531
  {
2543
  {
2532
    if (husart->Init.WordLength == USART_WORDLENGTH_9B)
2544
    if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
2533
    {
2545
    {
2534
      tmp = (uint16_t *) husart->pRxBuffPtr;
2546
      pdata8bits  = NULL;
2535
      if (husart->Init.Parity == USART_PARITY_NONE)
-
 
2536
      {
-
 
2537
        *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF);
2547
      pdata16bits = (uint16_t *) husart->pRxBuffPtr;
2538
        husart->pRxBuffPtr += 2U;
-
 
2539
      }
-
 
2540
      else
-
 
2541
      {
-
 
2542
        *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF);
2548
      *pdata16bits = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF);
2543
        husart->pRxBuffPtr += 1U;
2549
      husart->pRxBuffPtr += 2U;
2544
      }
-
 
2545
      if (--husart->RxXferCount != 0x00U)
-
 
2546
      {
-
 
2547
        /* Send dummy byte in order to generate the clock for the slave to send the next data */
-
 
2548
        husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FF);
-
 
2549
      }
-
 
2550
    }
2550
    }
2551
    else
2551
    else
2552
    {
2552
    {
2553
      if (husart->Init.Parity == USART_PARITY_NONE)
2553
      pdata8bits = (uint8_t *) husart->pRxBuffPtr;
-
 
2554
      pdata16bits  = NULL;
-
 
2555
 
-
 
2556
      if ((husart->Init.WordLength == USART_WORDLENGTH_9B) || ((husart->Init.WordLength == USART_WORDLENGTH_8B) && (husart->Init.Parity == USART_PARITY_NONE)))
2554
      {
2557
      {
2555
        *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF);
2558
        *pdata8bits = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF);
2556
      }
2559
      }
2557
      else
2560
      else
2558
      {
2561
      {
2559
        *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F);
2562
        *pdata8bits = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F);
2560
      }
2563
      }
2561
 
2564
 
2562
      if (--husart->RxXferCount != 0x00U)
2565
      husart->pRxBuffPtr += 1U;
2563
      {
-
 
2564
        /* Send dummy byte in order to generate the clock for the slave to send the next data */
-
 
2565
        husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x00FF);
-
 
2566
      }
-
 
2567
    }
2566
    }
2568
 
2567
 
-
 
2568
    husart->RxXferCount--;
-
 
2569
 
2569
    if (husart->RxXferCount == 0U)
2570
    if (husart->RxXferCount == 0U)
2570
    {
2571
    {
2571
      /* Disable the USART RXNE Interrupt */
2572
      /* Disable the USART RXNE Interrupt */
2572
      CLEAR_BIT(husart->Instance->CR1, USART_CR1_RXNEIE);
2573
      CLEAR_BIT(husart->Instance->CR1, USART_CR1_RXNEIE);
2573
 
2574
 
Line 2586... Line 2587...
2586
      HAL_USART_RxCpltCallback(husart);
2587
      HAL_USART_RxCpltCallback(husart);
2587
#endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2588
#endif /* USE_HAL_USART_REGISTER_CALLBACKS */
2588
 
2589
 
2589
      return HAL_OK;
2590
      return HAL_OK;
2590
    }
2591
    }
-
 
2592
    else
-
 
2593
    {
-
 
2594
      /* Send dummy byte in order to generate the clock for the slave to send the next data.
-
 
2595
      * Whatever the frame length (7, 8 or 9-bit long), the same dummy value
-
 
2596
      * can be written for all the cases. */
-
 
2597
      husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x0FF);
-
 
2598
    }
2591
    return HAL_OK;
2599
    return HAL_OK;
2592
  }
2600
  }
2593
  else
2601
  else
2594
  {
2602
  {
2595
    return HAL_BUSY;
2603
    return HAL_BUSY;
Line 2602... Line 2610...
2602
  *                the configuration information for the specified USART module.
2610
  *                the configuration information for the specified USART module.
2603
  * @retval HAL status
2611
  * @retval HAL status
2604
  */
2612
  */
2605
static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart)
2613
static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart)
2606
{
2614
{
-
 
2615
  uint8_t  *pdata8bits;
2607
  uint16_t *tmp;
2616
  uint16_t *pdata16bits;
2608
 
2617
 
2609
  if (husart->State == HAL_USART_STATE_BUSY_TX_RX)
2618
  if (husart->State == HAL_USART_STATE_BUSY_TX_RX)
2610
  {
2619
  {
2611
    if (husart->TxXferCount != 0x00U)
2620
    if (husart->TxXferCount != 0x00U)
2612
    {
2621
    {
2613
      if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXE) != RESET)
2622
      if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXE) != RESET)
2614
      {
2623
      {
2615
        if (husart->Init.WordLength == USART_WORDLENGTH_9B)
2624
        if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
2616
        {
2625
        {
-
 
2626
          pdata8bits  = NULL;
2617
          tmp = (uint16_t *) husart->pTxBuffPtr;
2627
          pdata16bits = (uint16_t *) husart->pTxBuffPtr;
2618
          husart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF);
2628
          husart->Instance->DR = (uint16_t)(*pdata16bits & (uint16_t)0x01FF);
2619
          if (husart->Init.Parity == USART_PARITY_NONE)
-
 
2620
          {
-
 
2621
            husart->pTxBuffPtr += 2U;
2629
          husart->pTxBuffPtr += 2U;
2622
          }
-
 
2623
          else
-
 
2624
          {
-
 
2625
            husart->pTxBuffPtr += 1U;
-
 
2626
          }
-
 
2627
        }
2630
        }
2628
        else
2631
        else
2629
        {
2632
        {
2630
          husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FF);
2633
          husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FF);
2631
        }
2634
        }
-
 
2635
 
2632
        husart->TxXferCount--;
2636
        husart->TxXferCount--;
2633
 
2637
 
2634
        /* Check the latest data transmitted */
2638
        /* Check the latest data transmitted */
2635
        if (husart->TxXferCount == 0U)
2639
        if (husart->TxXferCount == 0U)
2636
        {
2640
        {
Line 2641... Line 2645...
2641
 
2645
 
2642
    if (husart->RxXferCount != 0x00U)
2646
    if (husart->RxXferCount != 0x00U)
2643
    {
2647
    {
2644
      if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXNE) != RESET)
2648
      if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXNE) != RESET)
2645
      {
2649
      {
2646
        if (husart->Init.WordLength == USART_WORDLENGTH_9B)
2650
        if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
2647
        {
2651
        {
2648
          tmp = (uint16_t *) husart->pRxBuffPtr;
2652
           pdata8bits  = NULL;
2649
          if (husart->Init.Parity == USART_PARITY_NONE)
-
 
2650
          {
-
 
2651
            *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF);
2653
           pdata16bits = (uint16_t *) husart->pRxBuffPtr;
2652
            husart->pRxBuffPtr += 2U;
-
 
2653
          }
-
 
2654
          else
-
 
2655
          {
-
 
2656
            *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF);
2654
           *pdata16bits = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF);
2657
            husart->pRxBuffPtr += 1U;
2655
           husart->pRxBuffPtr += 2U;
2658
          }
-
 
2659
        }
2656
        }
2660
        else
2657
        else
2661
        {
2658
        {
2662
          if (husart->Init.Parity == USART_PARITY_NONE)
2659
          pdata8bits = (uint8_t *) husart->pRxBuffPtr;
-
 
2660
          pdata16bits  = NULL;
-
 
2661
          if ((husart->Init.WordLength == USART_WORDLENGTH_9B) || ((husart->Init.WordLength == USART_WORDLENGTH_8B) && (husart->Init.Parity == USART_PARITY_NONE)))
2663
          {
2662
          {
2664
            *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF);
2663
            *pdata8bits = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF);
2665
          }
2664
          }
2666
          else
2665
          else
2667
          {
2666
          {
2668
            *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F);
2667
            *pdata8bits = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F);
2669
          }
2668
          }
-
 
2669
          husart->pRxBuffPtr += 1U;
2670
        }
2670
        }
-
 
2671
 
2671
        husart->RxXferCount--;
2672
        husart->RxXferCount--;
2672
      }
2673
      }
2673
    }
2674
    }
2674
 
2675
 
2675
    /* Check the latest data received */
2676
    /* Check the latest data received */