portserial.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "port.h"
  2. #include "main.h"
  3. #include "cmsis_os2.h"
  4. /* ----------------------- Modbus includes ----------------------------------*/
  5. #include "mb.h"
  6. #include "mbport.h"
  7. #include <string.h>
  8. /* ----------------------- Defines ------------------------------------------*/
  9. #define EVENT_MBSLAVE_HANDLE_RECEIVED_DATA 0x00000001UL
  10. /* ----------------------- Start implementation -----------------------------*/
  11. BOOL xMBPortSerialInit(eMBRTUSlaveObj *pObj) {
  12. /* set serial configure parameter */
  13. pObj->pUartHandle.Init.BaudRate = pObj->ulBaudRate;
  14. pObj->pUartHandle.Init.WordLength = UART_WORDLENGTH_8B ;
  15. pObj->pUartHandle.Init.StopBits = UART_STOPBITS_1;
  16. switch (pObj->eParity) {
  17. case MB_PAR_NONE:
  18. pObj->pUartHandle.Init.Parity = UART_PARITY_NONE;
  19. break;
  20. case MB_PAR_ODD:
  21. pObj->pUartHandle.Init.Parity = UART_PARITY_ODD;
  22. break;
  23. case MB_PAR_EVEN:
  24. pObj->pUartHandle.Init.Parity = UART_PARITY_EVEN;
  25. break;
  26. default:
  27. return FALSE;
  28. }
  29. pObj->pUartHandle.Init.Mode = UART_MODE_TX_RX;
  30. pObj->pUartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  31. pObj->pUartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  32. /* open serial device */
  33. if (HAL_UART_Init(&pObj->pUartHandle) != HAL_OK) {
  34. Error_Handler();
  35. return FALSE;
  36. }
  37. return TRUE;
  38. }
  39. void rs485_slave_rx_mode(eMBRTUSlaveObj * obj) {
  40. HAL_GPIO_WritePin(obj->enPort, obj->enPin, GPIO_PIN_RESET);
  41. }
  42. void rs485_slave_tx_mode(eMBRTUSlaveObj * obj) {
  43. HAL_GPIO_WritePin(obj->enPort, obj->enPin, GPIO_PIN_SET);
  44. }
  45. void vMBPortSerialEnable(eMBRTUSlaveObj * pObj, BOOL xRxEnable, BOOL xTxEnable) {
  46. if (xRxEnable) {
  47. /* switch 485 to receive mode */
  48. rs485_slave_rx_mode(pObj);
  49. __HAL_UART_ENABLE_IT(&pObj->pUartHandle, UART_IT_RXNE);
  50. } else {
  51. /* switch 485 to transmit mode */
  52. rs485_slave_tx_mode(pObj);
  53. __HAL_UART_DISABLE_IT(&pObj->pUartHandle, UART_IT_RXNE);
  54. }
  55. if (xTxEnable) {
  56. __HAL_UART_ENABLE_IT(&pObj->pUartHandle, UART_IT_TXE);
  57. } else {
  58. __HAL_UART_DISABLE_IT(&pObj->pUartHandle, UART_IT_TXE);
  59. }
  60. }
  61. void vMBPortClose(eMBRTUSlaveObj *pObj) {
  62. HAL_UART_AbortReceive_IT(&pObj->pUartHandle);
  63. HAL_UART_AbortTransmit_IT(&pObj->pUartHandle);
  64. }
  65. BOOL xMBPortSerialPutByte(eMBRTUSlaveObj *pObj, CHAR ucByte) {
  66. if (HAL_UART_Transmit(&pObj->pUartHandle, (uint8_t *) &ucByte, 1, 0x01) != HAL_OK)
  67. return FALSE;
  68. else
  69. return TRUE;
  70. }
  71. /*
  72. * A Function to send all bytes in one call.
  73. */
  74. BOOL xMBPortSerialPutBytes(eMBRTUSlaveObj *pObj, volatile UCHAR *ucByte, USHORT usSize) {
  75. if (HAL_UART_Transmit(&pObj->pUartHandle, (uint8_t *) ucByte, usSize, 300) != HAL_OK)
  76. return FALSE;
  77. else
  78. return TRUE;
  79. }
  80. BOOL xMBPortSerialGetByte(eMBRTUSlaveObj *pObj, CHAR *pucByte) {
  81. if (HAL_UART_Receive(&pObj->pUartHandle, (uint8_t *) pucByte, 1, 0x01) != HAL_OK)
  82. return FALSE;
  83. else
  84. return TRUE;
  85. }
  86. /*
  87. * Create an interrupt handler for the transmit buffer empty interrupt
  88. * (or an equivalent) for your target processor. This function should then
  89. * call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that
  90. * a new character can be sent. The protocol stack will then call
  91. * xMBPortSerialPutByte( ) to send the character.
  92. */
  93. void prvvUARTTxReadyISR(eMBRTUSlaveObj *pObj) {
  94. pxMBFrameCBTransmitterEmpty(pObj);
  95. }
  96. /*
  97. * Create an interrupt handler for the receive interrupt for your target
  98. * processor. This function should then call pxMBFrameCBByteReceived( ). The
  99. * protocol stack will then call xMBPortSerialGetByte( ) to retrieve the
  100. * character.
  101. *
  102. * quanghona: This function is called when IDLE is detected. thus will then
  103. * trigger the received message handler.
  104. */
  105. void prvvUARTRxISR(eMBRTUSlaveObj *pObj) {
  106. pxMBFrameCBByteReceived(pObj);
  107. }