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 */ |