Files
pw-module/mcc_generated_files/uart/src/eusart1.c
2025-02-02 11:11:54 -05:00

273 lines
6.6 KiB
C

/**
* EUSART1 Generated Driver API Header File
*
* @file eusart1.c
*
* @ingroup eusart1
*
* @brief This is the generated driver implementation file for the EUSART1 driver using the Enhanced Universal Synchronous and Asynchronous Receiver Transceiver (EUSART) module.
*
* @version EUSART1 Driver Version 3.0.2
*/
/*
© [2025] Microchip Technology Inc. and its subsidiaries.
Subject to your compliance with these terms, you may use Microchip
software and any derivatives exclusively with Microchip products.
You are responsible for complying with 3rd party license terms
applicable to your use of 3rd party software (including open source
software) that may accompany Microchip software. SOFTWARE IS ?AS IS.?
NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS
SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT,
MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY
KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF
MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE
FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S
TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT
EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR
THIS SOFTWARE.
*/
/**
Section: Included Files
*/
#include "../eusart1.h"
/**
Section: Macro Declarations
*/
/**
Section: Driver Interface
*/
const uart_drv_interface_t UART1 = {
.Initialize = &EUSART1_Initialize,
.Deinitialize = &EUSART1_Deinitialize,
.Read = &EUSART1_Read,
.Write = &EUSART1_Write,
.IsRxReady = &EUSART1_IsRxReady,
.IsTxReady = &EUSART1_IsTxReady,
.IsTxDone = &EUSART1_IsTxDone,
.TransmitEnable = &EUSART1_TransmitEnable,
.TransmitDisable = &EUSART1_TransmitDisable,
.AutoBaudSet = &EUSART1_AutoBaudSet,
.AutoBaudQuery = &EUSART1_AutoBaudQuery,
.BRGCountSet = NULL,
.BRGCountGet = NULL,
.BaudRateSet = NULL,
.BaudRateGet = NULL,
.AutoBaudEventEnableGet = NULL,
.ErrorGet = &EUSART1_ErrorGet,
.TxCompleteCallbackRegister = NULL,
.RxCompleteCallbackRegister = NULL,
.TxCollisionCallbackRegister = NULL,
.FramingErrorCallbackRegister = &EUSART1_FramingErrorCallbackRegister,
.OverrunErrorCallbackRegister = &EUSART1_OverrunErrorCallbackRegister,
.ParityErrorCallbackRegister = NULL,
.EventCallbackRegister = NULL,
};
/**
Section: EUSART1 variables
*/
/**
* @misradeviation{@advisory,19.2}
* The UART error status necessitates checking the bitfield and accessing the status within the group byte therefore the use of a union is essential.
*/
/* cppcheck-suppress misra-c2012-19.2 */
static volatile eusart1_status_t eusart1RxLastError;
/**
Section: EUSART1 APIs
*/
static void (*EUSART1_FramingErrorHandler)(void) = NULL;
static void (*EUSART1_OverrunErrorHandler)(void) = NULL;
static void EUSART1_DefaultFramingErrorCallback(void);
static void EUSART1_DefaultOverrunErrorCallback(void);
/**
Section: EUSART1 APIs
*/
void EUSART1_Initialize(void)
{
// Set the EUSART1 module to the options selected in the user interface.
//ABDEN disabled; WUE disabled; BRG16 16bit_generator; SCKP Non-Inverted;
BAUD1CON = 0x48;
//ADDEN disabled; CREN enabled; SREN disabled; RX9 8-bit; SPEN enabled;
RC1STA = 0x90;
//TX9D 0x0; BRGH hi_speed; SENDB sync_break_complete; SYNC asynchronous; TXEN enabled; TX9 8-bit; CSRC client;
TX1STA = 0x26;
//SPBRGL 64;
SP1BRGL = 0x40;
//SPBRGH 3;
SP1BRGH = 0x3;
EUSART1_FramingErrorCallbackRegister(EUSART1_DefaultFramingErrorCallback);
EUSART1_OverrunErrorCallbackRegister(EUSART1_DefaultOverrunErrorCallback);
eusart1RxLastError.status = 0;
}
void EUSART1_Deinitialize(void)
{
BAUD1CON = 0x00;
RC1STA = 0x00;
TX1STA = 0x00;
SP1BRGL = 0x00;
SP1BRGH = 0x00;
}
void EUSART1_Enable(void)
{
RC1STAbits.SPEN = 1;
}
void EUSART1_Disable(void)
{
RC1STAbits.SPEN = 0;
}
void EUSART1_TransmitEnable(void)
{
TX1STAbits.TXEN = 1;
}
void EUSART1_TransmitDisable(void)
{
TX1STAbits.TXEN = 0;
}
void EUSART1_ReceiveEnable(void)
{
RC1STAbits.CREN = 1;
}
void EUSART1_ReceiveDisable(void)
{
RC1STAbits.CREN = 0;
}
void EUSART1_SendBreakControlEnable(void)
{
TX1STAbits.SENDB = 1;
}
void EUSART1_SendBreakControlDisable(void)
{
TX1STAbits.SENDB = 0;
}
void EUSART1_AutoBaudSet(bool enable)
{
if(enable)
{
BAUD1CONbits.ABDEN = 1;
}
else
{
BAUD1CONbits.ABDEN = 0;
}
}
bool EUSART1_AutoBaudQuery(void)
{
return (bool)(!BAUD1CONbits.ABDEN);
}
bool EUSART1_IsAutoBaudDetectOverflow(void)
{
return (bool)BAUD1CONbits.ABDOVF;
}
void EUSART1_AutoBaudDetectOverflowReset(void)
{
BAUD1CONbits.ABDOVF = 0;
}
bool EUSART1_IsRxReady(void)
{
return (bool)(PIR3bits.RC1IF);
}
bool EUSART1_IsTxReady(void)
{
return (bool)(PIR3bits.TX1IF && TX1STAbits.TXEN);
}
bool EUSART1_IsTxDone(void)
{
return TX1STAbits.TRMT;
}
size_t EUSART1_ErrorGet(void)
{
return eusart1RxLastError.status;
}
uint8_t EUSART1_Read(void)
{
eusart1RxLastError.status = 0;
if(true == RC1STAbits.OERR)
{
eusart1RxLastError.oerr = 1;
if(NULL != EUSART1_OverrunErrorHandler)
{
EUSART1_OverrunErrorHandler();
}
}
if(true == RC1STAbits.FERR)
{
eusart1RxLastError.ferr = 1;
if(NULL != EUSART1_FramingErrorHandler)
{
EUSART1_FramingErrorHandler();
}
}
return RC1REG;
}
void EUSART1_Write(uint8_t txData)
{
TX1REG = txData;
}
static void EUSART1_DefaultFramingErrorCallback(void)
{
}
static void EUSART1_DefaultOverrunErrorCallback(void)
{
//Continuous Receive must be cleared to clear Overrun Error else Rx will not receive upcoming bytes
RC1STAbits.CREN = 0;
RC1STAbits.CREN = 1;
}
void EUSART1_FramingErrorCallbackRegister(void (* callbackHandler)(void))
{
if(NULL != callbackHandler)
{
EUSART1_FramingErrorHandler = callbackHandler;
}
}
void EUSART1_OverrunErrorCallbackRegister(void (* callbackHandler)(void))
{
if(NULL != callbackHandler)
{
EUSART1_OverrunErrorHandler = callbackHandler;
}
}