µC/Modbus can work with just about any UART. You need to provide a few simple interface functions to work with your hardware. These functions should be placed in a file called mb_bsp.c
. Micrium provides examples of mb_bsp.c
as part of the µC/Modbus release.
BSP, MB_CommExit()
This function is called by MB_Exit()
to close all serial interfaces used by µC/Modbus. Your application DOES NOT need to call this function. The pseudo-code for this function is shown below:
void MB_CommExit (void) { /* Disable all uC/Modbus Rx interrupts */ /* Disable all uC/Modbus Tx interrupts */ /* Remove interrupt vectors (if needed) */ }
BSP, MB_CommPortCfg()
This function is called by MB_CfgCh()
to configure the UART communication settings for a channel. MB_CommPortCfg()
must NOT be called by your application. The function prototype is shown below:
void MB_CommPortCfg (MODBUS_CH *pch, CPU_INT08U port_nbr, CPU_INT32U baud, CPU_INT08U bits, CPU_INT08U parity, CPU_INT08U stops);
pch
is a pointer to the communication channel to configure. This pointer is returned to your application when you call MB_CfgCh()
.
port_nbr
is the ‘physical’ port number associated with the µC/Modbus communication channel. For example, µC/Modbuschannel #0 could be associated with your 5th UART. In other words, µC/Modbuschannels can be assigned to any ‘physical’ serial port in your system – there doesn’t need to be a one-to-one correspondence.
baud
is the desired baud rate for the channel. You should write code to support the standard baud rates: 9600
, 19200
, 38400
, 76800
, 115200
and 256000
baud.
bits
is the number of bits used for the UART. It’s typically 7
or 8
. The most common is 8
bits.
parity
is the type of parity checking scheme used for the serial port. The choices are: MODBUS_PARITY_NONE
, MODBUS_PARITY_ODD
and MODBUS_PARITY_EVEN
. The most common is MODBUS_PARITY_NONE
.
stops
specifies the number of stop bits used. The choices are typically 1 or 2. 1
stop bit is the most common.
BSP, MB_CommRxTxISR_x_Handler()
Most UARTs allow you to generate an interrupt when either a byte is received or when a byte has been sent. If your UART generates an interrupt when either a byte is received or when one has been sent then, you would need to write a function that determines whether the interrupt was caused by a received by or by a byte sent. In this case, you would write a function called MBS_CommRxTxISR_x_Handler()
where the ‘x’ indicates the physical UART (example 1, 2, 3 …). The pseudo-code for this function is shown below. The code in RED is code that you have to write. You should COPY all the other code as is.
void MB_CommRxTxISR_x_Handler (void) { CPU_INT08U c; CPU_INT08U ch; MODBUS_CH *pch; pch = &MB_ChTbl[0]; for (ch = 0; ch < MODBUS_MAX_CH; ch++) { if (pch->PortNbr == port_nbr) { if (Rx Interrupt) { c = Read byte from UART; Clear Rx Interrupt; pch->RxCtr++; MB_RxByte(pch, c); // Pass byte to Modbus to process } if (Tx Interrupt) { pch->TxCtr++; MB_TxByte(pch); // Send next byte in response Clear Tx Interrupt; } break; } else { pch++; } } Clear spurious interrupts; }
BSP, MB_CommRxIntEn()
This function is called by µC/Modbus to enable Rx interrupts from a UART.
void MB_CommRxIntEn (MODBUS_CH * pch) { switch (pch->PortNbr) { /* Enable Rx interrupts for specified UART */ } }
BSP, MB_CommRxIntDis()
This function is called by µC/Modbus to disable Rx interrupts from a UART.
void MB_CommRxIntDis(MODBUS_CH * pch) { switch (pch->PortNbr) { /* Disable Rx interrupts for specified UART */ } }
BSP, MB_CommTx1()
This function is called by µC/Modbusto send a SINGLE byte to the UART associated with the µC/Modbuschannel.
void MB_CommTx1 (MODBUS_CH * pch, CPU_INT08U c) { switch (pch->PortNbr) { /* Write byte 'c' to specified UART */ } }
BSP, MB_CommTxIntEn()
This function is called by µC/Modbusto enable Tx interrupts from a UART.
void MB_CommTxIntEn(MODBUS_CH * pch) { switch (pch->PortNbr) { /* Enable Tx interrupts from specified UART */ } }
BSP, MB_CommTxIntDis()
This function is called by µC/Modbusto disable Tx interrupts from a UART.
void MB_CommTxIntDis(MODBUS_CH * pch) { switch (pch->PortNbr) { /* Disable Tx interrupts from specified UART */ } }
BSP, MB_RTU_TmrInit()
This function is called by MB_Init()
to initialize the RTU timer. freq
specifies the frequency used for the RTU timer interrupts.
void MB_RTU_TmrInit(CPU_INT32U freq);
BSP, MB_RTU_TmrExit()
This function is called by MB_Exit()
to stop RTU timer interrupts.
void MB_RTU_TmrExit(void);
BSP, MB_RTU_TmrISR_Handler()
This function is the ISR handler for RTU timer interrupts. The pseudo-code for this function is shown below:
void MB_RTU_TmrISR_Handler (void) { Clear the RTU timer interrupt source; MB_RTU_TmrCtr++; // Indicate that we had activities on this interrupt MB_RTU_TmrUpdate(); // Check for RTU timers that have expired }