/************************************************************************** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file Comm.c * * @date 28-Oct-2019 * @author S. Nash * * @brief Support for communication. * **************************************************************************/ #include "can.h" #include "sci.h" #include "sys_dma.h" #include "Comm.h" // ********** private definitions ********** #define DMA_CH_STATUS_BIT(ch) ((U32)1U << (ch)) // ********** private data ********** static volatile BOOL canXmitsInProgress = FALSE; #ifdef DEBUG_ENABLED static volatile BOOL uartXmitsInProgress = FALSE; #endif /************************************************************************* * @brief signalCANXmitsInitiated * The signalCANXmitsInitiated function sets the CAN transmits in \n * progress flag. * @details * Inputs : none * Outputs : canXmitsInProgress * @param none * @return none *************************************************************************/ void signalCANXmitsInitiated( void ) { canXmitsInProgress = TRUE; } /************************************************************************* * @brief signalCANXmitsCompleted * The signalCANXmitsCompleted function resets the CAN transmits in \n * progress flag. * @details * Inputs : none * Outputs : canXmitsInProgress * @param none * @return none *************************************************************************/ void signalCANXmitsCompleted( void ) { canXmitsInProgress = FALSE; } /************************************************************************* * @brief signalSCI1XmitsInitiated * The signalSCI1XmitsInitiated function sets the SCI1 transmits in \n * progress flag. * @details * Inputs : none * Outputs : uartXmitsInProgress * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED void signalSCI1XmitsInitiated( void ) { uartXmitsInProgress = TRUE; } #endif /************************************************************************* * @brief signalSCI1XmitsCompleted * The signalSCI1XmitsCompleted function resets the SCI1 transmits in \n * progress flag. * @details * Inputs : none * Outputs : uartXmitsInProgress * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED void signalSCI1XmitsCompleted( void ) { uartXmitsInProgress = FALSE; } #endif /************************************************************************* * @brief setSCI1DMAReceiveInterrupt * The setSCI1DMAReceiveInterrupt function enables DMA receive interrupts \n * for the SCI1 peripheral. * @details * Inputs : none * Outputs : DMA receive interrupt is enabled. * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED void setSCI1DMAReceiveInterrupt( void ) { sciREG->SETINT = SCI_DMA_RECEIVE_INT; } #endif /************************************************************************* * @brief setSCI1DMATransmitInterrupt * The setSCI1DMATransmitInterrupt function enables DMA transmit interrupts \n * for the SCI1 peripheral. * @details * Inputs : none * Outputs : DMA transmit interrupt is enabled. * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED void setSCI1DMATransmitInterrupt( void ) { sciREG->SETINT = SCI_DMA_TRANSMIT_INT; } #endif /************************************************************************* * @brief clearSCI1DMAReceiveInterrupt * The clearSCI1DMAReceiveInterrupt function disables DMA receive interrupts \n * for the SCI1 peripheral. * @details * Inputs : none * Outputs : DMA receive interrupt is disabled. * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED void clearSCI1DMAReceiveInterrupt( void ) { sciREG->CLEARINT = SCI_DMA_RECEIVE_INT; } #endif /************************************************************************* * @brief clearSCI1DMATransmitInterrupt * The clearSCI1DMATransmitInterrupt function disables DMA transmit interrupts \n * for the SCI1 peripheral. * @details * Inputs : none * Outputs : DMA transmit interrupt is disabled. * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED void clearSCI1DMATransmitInterrupt( void ) { sciREG->CLEARINT = SCI_DMA_TRANSMIT_INT; } #endif /************************************************************************* * @brief setSCI2DMAReceiveInterrupt * The setSCI2DMAReceiveInterrupt function enables DMA receive interrupts \n * for the SCI2 peripheral. * @details * Inputs : none * Outputs : DMA receive interrupt is enabled. * @param none * @return none *************************************************************************/ void setSCI2DMAReceiveInterrupt( void ) { scilinREG->SETINT = SCI_DMA_RECEIVE_INT; } /************************************************************************* * @brief setSCI2DMATransmitInterrupt * The setSCI2DMATransmitInterrupt function enables DMA transmit interrupts \n * for the SCI2 peripheral. * @details * Inputs : none * Outputs : DMA transmit interrupt is enabled. * @param none * @return none *************************************************************************/ void setSCI2DMATransmitInterrupt( void ) { scilinREG->SETINT = SCI_DMA_TRANSMIT_INT; } /************************************************************************* * @brief clearSCI2DMAReceiveInterrupt * The clearSCI2DMAReceiveInterrupt function disables DMA receive interrupts \n * for the SCI2 peripheral. * @details * Inputs : none * Outputs : DMA receive interrupt is disabled. * @param none * @return none *************************************************************************/ void clearSCI2DMAReceiveInterrupt( void ) { scilinREG->CLEARINT = SCI_DMA_RECEIVE_INT; } /************************************************************************* * @brief clearSCI2DMATransmitInterrupt * The clearSCI2DMATransmitInterrupt function disables DMA transmit interrupts \n * for the SCI2 peripheral. * @details * Inputs : none * Outputs : DMA transmit interrupt is disabled. * @param none * @return none *************************************************************************/ void clearSCI2DMATransmitInterrupt( void ) { scilinREG->CLEARINT = SCI_DMA_TRANSMIT_INT; } /************************************************************************* * @brief clearSCI1CommErrors * The clearSCI1CommErrors function clears framing and/or overrun error flags \ * for the SCI1 peripheral. * @details * Inputs : none * Outputs : SCI1 error flags cleared. * @param none * @return none *************************************************************************/ #ifdef DEBUG_ENABLED void clearSCI1CommErrors( void ) { sciReceiveByte( sciREG ); sciREG->FLR |= ( SCI_FE_INT | SCI_OE_INT ); } #endif /************************************************************************* * @brief clearSCI2CommErrors * The clearSCI2CommErrors function clears framing and/or overrun error flags \n * for the SCI2 peripheral. * @details * Inputs : none * Outputs : SCI2 error flags cleared. * @param none * @return none *************************************************************************/ void clearSCI2CommErrors( void ) { sciReceiveByte( scilinREG ); scilinREG->FLR |= ( SCI_FE_INT | SCI_OE_INT ); } /************************************************************************* * @brief isSCI1DMATransmitInProgress * The isSCI2DMATransmitInProgress function determines whether a DMA transmit \n * is in progress on the SCI1 peripheral. * @details * Inputs : status registers * Outputs : none * @param none * @return TRUE if a transmit is in progress, FALSE if not *************************************************************************/ #ifdef DEBUG_ENABLED BOOL isSCI1DMATransmitInProgress( void ) { BOOL transmitterBusy = ( ( sciREG->FLR & (U32)SCI_TX_INT ) == 0U ? TRUE : FALSE ); BOOL dmaTransmitterBusy = ( ( dmaREG->PEND & DMA_CH_STATUS_BIT(DMA_CH3) ) != 0U ? TRUE : FALSE ); return ( ( TRUE == uartXmitsInProgress ) || ( transmitterBusy == TRUE ) || ( dmaTransmitterBusy == TRUE ) ? TRUE : FALSE ); } #endif /************************************************************************* * @brief isSCI2DMATransmitInProgress * The isSCI2DMATransmitInProgress function determines whether a DMA transmit \n * is in progress on the SCI2 peripheral. * @details * Inputs : status registers * Outputs : none * @param none * @return TRUE if a transmit is in progress, FALSE if not *************************************************************************/ BOOL isSCI2DMATransmitInProgress( void ) { BOOL transmitterBusy = ( ( scilinREG->FLR & (U32)SCI_TX_INT ) == 0U ? TRUE : FALSE ); BOOL dmaTransmitterBusy = ( ( dmaREG->PEND & DMA_CH_STATUS_BIT(DMA_CH2) ) != 0U ? TRUE : FALSE ); return ( ( transmitterBusy == TRUE ) || ( dmaTransmitterBusy == TRUE ) ? TRUE : FALSE ); } /************************************************************************* * @brief isCAN1TransmitInProgress * The isCAN1TransmitInProgress function determines whether a transmit \n * is in progress on the CAN1 peripheral. * @details * Inputs : status registers * Outputs : none * @param none * @return TRUE if a transmit is in progress, FALSE if not *************************************************************************/ BOOL isCAN1TransmitInProgress( void ) { BOOL result = ( ( TRUE == canXmitsInProgress ) || ( canREG1->TXRQx[ 0 ] != 0 ) || ( canREG1->TXRQx[ 1 ] != 0 ) ? TRUE : FALSE ); return result; }