mbslvapp.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include <stdbool.h>
  6. #include <limits.h>
  7. #include <gfambrtuslv.h>
  8. #include "mbslvapp.h"
  9. #include "inc/hw_memmap.h"
  10. #include "inc/hw_gpio.h"
  11. #include "inc/hw_uart.h"
  12. #include "inc/hw_ints.h"
  13. #include "driverlib/gpio.h"
  14. #include "driverlib/uart.h"
  15. #include "driverlib/sysctl.h"
  16. #include "driverlib/pin_map.h"
  17. #if HW_PLATFORM == HW_PLATFORM_OLS1V
  18. #include "ols1v.h"
  19. #elif HW_PLATFORM == HW_PLATFORM_EAV1V
  20. #include "eav1v.h"
  21. #else
  22. #error Unknown hardware platform!
  23. #endif // HW_PLATFORM
  24. /////////////////////////////////////////////////////////////////////////////
  25. static uint16_t g_mbRegs[MODBUS_WORD_REGISTER_COUNT];
  26. static HMBRTUSLV g_hMbSlv;
  27. /////////////////////////////////////////////////////////////////////////////
  28. static void _OnSlaveStateChanged(GFA_MODBUS_RTU_SLV_STATES newState, GFA_MODBUS_RTU_SLV_STATES oldState)
  29. {
  30. switch(newState)
  31. {
  32. case MB_RTU_SLV_Idle:
  33. // OlsClearLeds(OLS_LED_MASK);
  34. break;
  35. case MB_RTU_SLV_RxSlvID:
  36. // OlsSetLeds(OLS_LED_GREEN_RIGHT);
  37. break;
  38. case MB_RTU_SLV_RxComplete:
  39. // OlsClearLeds(OLS_LED_GREEN_RIGHT);
  40. break;
  41. case MB_RTU_SLV_TxStart:
  42. // OlsSetLeds(OLS_LED_GREEN_LEFT);
  43. break;
  44. }
  45. }
  46. /////////////////////////////////////////////////////////////////////////////
  47. // maps a modbus register address to a physical register address.
  48. // if not implemented the modbus address is interpreted as physical address.
  49. static uint16_t _MapRegisterAddress(uint16_t nAddr)
  50. {
  51. if(nAddr >= MODBUS_WORD_REGISTER_COUNT)
  52. return (uint16_t)-1;
  53. return nAddr;
  54. }
  55. /////////////////////////////////////////////////////////////////////////////
  56. static void _PreReadRegisters(uint8_t func, uint16_t nRegStart, uint16_t nRegCount)
  57. {
  58. float f1 = GfaBufGetUnaligned_float(&g_mbRegs[0]);
  59. float f2 = GfaBufGetUnaligned_float(&g_mbRegs[2]);
  60. GfaBufSetUnaligned_float(&g_mbRegs[0], ++f1);
  61. GfaBufSetUnaligned_float(&g_mbRegs[2], --f2);
  62. }
  63. static void _PostReadRegisters(uint8_t func, uint16_t nRegStart, uint16_t nRegCount)
  64. {
  65. }
  66. static void _PreWriteRegisters(uint8_t func, uint16_t nRegStart, uint16_t nRegCount)
  67. {
  68. }
  69. static void _PostWriteRegisters(uint8_t func, uint16_t nRegStart, uint16_t nRegCount)
  70. {
  71. }
  72. /////////////////////////////////////////////////////////////////////////////
  73. static void _InitUARTConfig(LPGFA_UART_CONFIG puc)
  74. {
  75. memset(puc, 0, sizeof(LPGFA_UART_CONFIG));
  76. puc->P_UART_BASE = UART_BASE;
  77. puc->P_UART_BASE_SYSCTL = UART_BASE_SYSCTL;
  78. puc->P_UART_PORT = UART_PORT;
  79. puc->P_UART_PORT_SYSCTL = UART_PORT_SYSCTL;
  80. puc->P_UART_RX_PIN = UART_RX_PIN;
  81. puc->P_UART_RX_PIN_MUX = UART_RX_PIN_MUX;
  82. puc->P_UART_TX_PIN = UART_TX_PIN;
  83. puc->P_UART_TX_PIN_MUX = UART_TX_PIN_MUX;
  84. puc->P_UART_INT = UART_INT;
  85. puc->P_UART_INT_PRIORITY = MODBUS_RTU_UART_INT_PRIORITY;
  86. puc->P_EN_485_PORT_SYSCTL = EN_485_PORT_SYSCTL;
  87. puc->P_EN_485_PORT = EN_485_PORT;
  88. puc->P_EN_485_PIN = EN_485_PIN;
  89. puc->nBaud = MODBUS_RTU_BAUDRATE;
  90. puc->nDatabits = MODBUS_RTU_DATABITS;
  91. puc->nStopbits = MODBUS_RTU_STOPBITS;
  92. puc->parity = MODBUS_RTU_PARITY;
  93. puc->nFifoIndexRx = 0;
  94. puc->nFifoIndexTx = 1;
  95. }
  96. /////////////////////////////////////////////////////////////////////////////
  97. /////////////////////////////////////////////////////////////////////////////
  98. /////////////////////////////////////////////////////////////////////////////
  99. bool GfaInitModbusSlaveApp(void)
  100. {
  101. GFA_UART_CONFIG uartParams;
  102. g_hMbSlv = NULL;
  103. _InitUARTConfig(&uartParams);
  104. if(GfaMbUartInit(&uartParams))
  105. {
  106. GFA_MODBUS_RTU_SLAVE_PARAMETERS slvParams;
  107. memset(&slvParams, 0, sizeof(slvParams));
  108. slvParams.slaveID = MODBUS_SLAVE_ID;
  109. slvParams.hFifoRX = GfaMbUartGetRxFifo();
  110. slvParams.hFifoTX = GfaMbUartGetTxFifo();
  111. slvParams.regMap.pRegs = g_mbRegs;
  112. slvParams.regMap.nCountRegs = _countof(g_mbRegs);
  113. slvParams.appItf.pfnMapRegAddr = _MapRegisterAddress;
  114. slvParams.appItf.pfnPreRead = _PreReadRegisters;
  115. slvParams.appItf.pfnPostRead = _PostReadRegisters;
  116. slvParams.appItf.pfnPreWrite = _PreWriteRegisters;
  117. slvParams.appItf.pfnPostWrite = _PostWriteRegisters;
  118. slvParams.appItf.pfnStateChanged = _OnSlaveStateChanged;
  119. slvParams.appItf.pfnPreTransmit = NULL;
  120. slvParams.appItf.pfnPostTransmit = NULL;
  121. if(!(g_hMbSlv = GfaModbusRTUSlvCreate(&slvParams)))
  122. GfaMbUartRelease();
  123. }
  124. return !!g_hMbSlv;
  125. }
  126. /////////////////////////////////////////////////////////////////////////////
  127. void GfaDoModbusSlaveApp(void)
  128. {
  129. GfaModbusRTUSlvStateMachine(g_hMbSlv);
  130. }
  131. /////////////////////////////////////////////////////////////////////////////