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