/***************************************************************************//** * \file cy_scb_uart.h * \version 3.10 * * Provides UART API declarations of the SCB driver. * ******************************************************************************** * \copyright * Copyright 2016-2021 Cypress Semiconductor Corporation * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ /** * \addtogroup group_scb_uart * \{ * Driver API for UART * * The functions and other declarations used in this part of the driver are in * cy_scb_uart.h. You can also include cy_pdl.h to get access * to all functions and declarations in the PDL. * * The Universal Asynchronous Receiver/Transmitter (UART) protocol is an * asynchronous serial interface protocol. UART communication is typically * point-to-point. The UART interface consists of two signals: * * TX: Transmitter output * * RX: Receiver input * * Additionally, two side-band signals are used to implement flow control in * UART. Note that the flow control applies only to TX functionality. * * Clear to Send (CTS): This is an input signal to the transmitter. * When active, it indicates that the slave is ready for the master to * transmit data. * * Ready to Send (RTS): This is an output signal from the receiver. When * active, it indicates that the receiver is ready to receive data * * Features: * * Supports UART protocol * * Standard UART * * Multi-processor mode * * SmartCard (ISO7816) reader * * IrDA * * Data frame size programmable from 4 to 16 bits * * Programmable number of STOP bits, which can be set in terms of half bit * periods between 1 and 4 * * Parity support (odd and even parity) * * Median filter on Rx input * * Programmable oversampling * * Start skipping * ******************************************************************************** * \section group_scb_uart_configuration Configuration Considerations ******************************************************************************** * The UART driver configuration can be divided to number of sequential * steps listed below: * * \ref group_scb_uart_config * * \ref group_scb_uart_pins * * \ref group_scb_uart_clock * * \ref group_scb_uart_data_rate * * \ref group_scb_uart_intr * * \ref group_scb_uart_enable * * \note * UART driver is built on top of the SCB hardware block. The SCB5 instance is * used as an example for all code snippets. Modify the code to match your * design. * ******************************************************************************** * \subsection group_scb_uart_config Configure UART ******************************************************************************** * To set up the UART driver, provide the configuration parameters in the * \ref cy_stc_scb_uart_config_t structure. For example: provide uartMode, * oversample, dataWidth, enableMsbFirst, parity, and stopBits. The other * parameters are optional. To initialize the driver, call \ref Cy_SCB_UART_Init * function providing a pointer to the populated \ref cy_stc_scb_uart_config_t * structure and the allocated \ref cy_stc_scb_uart_context_t structure. * * \snippet scb/uart_snippet/main.c UART_CFG * ******************************************************************************** * \subsection group_scb_uart_pins Assign and Configure Pins ******************************************************************************** * Only dedicated SCB pins can be used for UART operation. The HSIOM * register must be configured to connect dedicated SCB UART pins to the * SCB block. Also, the UART output pins must be configured in Strong Drive * Input Off mode and UART input pins in Digital High-Z: * * \snippet scb/uart_snippet/main.c UART_CFG_PINS * ******************************************************************************** * \subsection group_scb_uart_clock Assign Clock Divider ******************************************************************************** * A clock source must be connected to the SCB block to oversample input and * output signals, in this document this clock will be referred as clk_scb. * You must use one of available integer or fractional dividers. Use the * \ref group_sysclk driver API to do this. * * \snippet scb/uart_snippet/main.c UART_CFG_ASSIGN_CLOCK * ******************************************************************************** * \subsection group_scb_uart_data_rate Configure Baud Rate ******************************************************************************** * To get the UART to operate with the desired baud rate, the clk_scb frequency * and the oversample must be configured. Use the \ref group_sysclk driver API * to configure clk_scb frequency. Set the oversample parameter * in configuration structure to define the number of the SCB clocks * within one UART bit-time. * * \snippet scb/uart_snippet/main.c UART_CFG_DATA_RATE * * Refer to the technical reference manual (TRM) section UART sub-section * Clocking and Oversampling to get information about how to configure the UART to run with * desired baud rate. * ******************************************************************************** * \subsection group_scb_uart_intr Configure Interrupt ******************************************************************************** * The interrupt is optional for the UART operation. To configure interrupt * the \ref Cy_SCB_UART_Interrupt function must be called in the interrupt * handler for the selected SCB instance. Also, this interrupt must be enabled * in the NVIC. * The interrupt must be configured when \ref group_scb_uart_hl will be used. * * \snippet scb/uart_snippet/main.c UART_INTR_A * \snippet scb/uart_snippet/main.c UART_INTR_B * ******************************************************************************** * \subsection group_scb_uart_enable Enable UART ******************************************************************************** * Finally, enable the UART operation by calling \ref Cy_SCB_UART_Enable. * * \snippet scb/uart_snippet/main.c UART_ENABLE * ******************************************************************************** * \section group_scb_uart_use_cases Common Use Cases ******************************************************************************** * The UART API is divided into two categories: \ref group_scb_uart_low_level_functions * and \ref group_scb_uart_high_level_functions. \n * Do not mix High-Level and Low-Level API because a Low-Level * API can adversely affect the operation of a High-Level API. * ******************************************************************************** * \subsection group_scb_uart_ll Low-Level API ******************************************************************************** * The \ref group_scb_uart_low_level_functions functions allow * interacting directly with the hardware and do not use \ref Cy_SCB_UART_Interrupt. * These functions do not require context for operation. Thus, NULL can be * passed for context parameter in \ref Cy_SCB_UART_Init and \ref Cy_SCB_UART_Disable * instead of a pointer to the context structure. * * * To write data into the TX FIFO, use one of the provided functions: * \ref Cy_SCB_UART_Put, \ref Cy_SCB_UART_PutArray, * \ref Cy_SCB_UART_PutArrayBlocking or \ref Cy_SCB_UART_PutString. * Note that putting data into the TX FIFO starts data transfer. * * * To read data from the RX FIFO, use one of the provided functions: * \ref Cy_SCB_UART_Get, \ref Cy_SCB_UART_GetArray or * \ref Cy_SCB_UART_GetArrayBlocking. * * * The statuses can be polled using: \ref Cy_SCB_UART_GetRxFifoStatus and * \ref Cy_SCB_UART_GetTxFifoStatus. * The statuses are W1C (Write 1 to Clear) and after a status * is set, it must be cleared. Note that there are statuses evaluated as level. * These statuses remain set until an event is true. Therefore, after the clear * operation, the status is cleared but then it is restored (if event is still * true). * Also, the following functions can be used for polling as well * \ref Cy_SCB_UART_IsTxComplete, \ref Cy_SCB_UART_GetNumInRxFifo and * \ref Cy_SCB_UART_GetNumInTxFifo. * * \snippet scb/uart_snippet/main.c UART_TRANSMIT_DATA_LL * ******************************************************************************** * \subsection group_scb_uart_hl High-Level API ******************************************************************************** * The \ref group_scb_uart_high_level_functions API use \ref Cy_SCB_UART_Interrupt * to execute the transfer. Call \ref Cy_SCB_UART_Transmit to start transmission. * Call \ref Cy_SCB_UART_Receive to start receive operation. After the * operation is started the \ref Cy_SCB_UART_Interrupt handles the data * transfer until its completion. * Therefore \ref Cy_SCB_UART_Interrupt must be called inside the user * interrupt handler to make the High-Level API work. To monitor status * of transmit operation, use \ref Cy_SCB_UART_GetTransmitStatus and * \ref Cy_SCB_UART_GetReceiveStatus to monitor receive status appropriately. * Alternatively use \ref Cy_SCB_UART_RegisterCallback to register callback * function to be notified about \ref group_scb_uart_macros_callback_events. * * Receive Operation * \snippet scb/uart_snippet/main.c UART_RECEIVE_DATA_HL * * Transmit Operation * \snippet scb/uart_snippet/main.c UART_TRANSMIT_DATA_HL * * There is also capability to insert a receive ring buffer that operates between * the RX FIFO and the user buffer. The received data is copied into the ring * buffer from the RX FIFO. This process runs in the background after the ring * buffer operation is started by \ref Cy_SCB_UART_StartRingBuffer. * When \ref Cy_SCB_UART_Receive is called, it first reads data from the ring * buffer and then sets up an interrupt to receive more data if the required * amount has not yet been read. * ******************************************************************************** * \section group_scb_uart_dma_trig DMA Trigger ******************************************************************************** * The SCB provides TX and RX output trigger signals that can be routed to the * DMA controller inputs. These signals are assigned based on the data availability * in the TX and RX FIFOs appropriately. * * * The RX trigger signal is active while the number of data * elements in the RX FIFO is greater than the value of RX FIFO level. Use * function \ref Cy_SCB_SetRxFifoLevel or set configuration structure * rxFifoTriggerLevel parameter to configure RX FIFO level value. \n * For example, the RX FIFO has 8 data elements and the RX FIFO level is 0. * The RX trigger signal is active until DMA reads all data from * the RX FIFO. * * * The TX trigger signal is active while the number of data elements * in the TX FIFO is less than the value of TX FIFO level. Use function * \ref Cy_SCB_SetTxFifoLevel or set configuration structure txFifoTriggerLevel * parameter to configure TX FIFO level value. \n * For example, the TX FIFO has 0 data elements (empty) and the TX FIFO level * is 7. The TX trigger signal is active until DMA loads TX FIFO * with 8 data elements (note that after the first TX load operation, the data * element goes to the shift register and TX FIFO is empty). * * To route SCB TX or RX trigger signals to DMA controller use \ref group_trigmux * driver API. * * \note * To properly handle DMA level request signal activation and de-activation from the SCB * peripheral block the DMA Descriptor typically must be configured to re-trigger * after 16 Clk_Slow cycles. * ******************************************************************************** * \section group_scb_uart_lp Low Power Support ******************************************************************************** * The UART driver provides callback functions to handle power mode * transition. The callback \ref Cy_SCB_UART_DeepSleepCallback must be called * during execution of \ref Cy_SysPm_CpuEnterDeepSleep \ref Cy_SCB_UART_HibernateCallback * must be called during execution of \ref Cy_SysPm_SystemEnterHibernate. To trigger the * callback execution, the callback must be registered before calling the * power mode transition function. Refer to \ref group_syspm driver for more * information about power mode transitions and callback registration. * * The UART is disabled during Deep Sleep and Hibernate and stops driving * the output pins. The state of the UART output pins TX and RTS is High-Z, * which can cause unexpected behavior of the UART receiver due to possible * glitches on these lines. These pins must be set to the inactive state before * entering Deep Sleep or Hibernate mode. * These pins must keep the inactive level (the same state * when UART TX is enabled and does not transfer data) before entering Deep * Sleep or Hibernate mode. To do that, write the GPIO data register of each pin * to the inactive level for each output pin. Then configure High-Speed Input * Output Multiplexer (HSIOM) of each pin to be controlled by the GPIO (use * \ref group_gpio driver API). After exiting Deep Sleep mode the UART * must be enabled and the pins configuration restored to return the * UART control of the pins (after exiting Hibernate mode, the * system initialization code does the same). Copy either or * both \ref Cy_SCB_UART_DeepSleepCallback and \ref Cy_SCB_UART_HibernateCallback * as appropriate, and make the changes described above inside the function. * Alternately, external pull-up or pull-down resistors can be connected * to the appropriate UART lines to keep them inactive during Deep-Sleep or * Hibernate. * * \defgroup group_scb_uart_macros Macros * \defgroup group_scb_uart_functions Functions * \{ * \defgroup group_scb_uart_general_functions General * \defgroup group_scb_uart_high_level_functions High-Level * \defgroup group_scb_uart_low_level_functions Low-Level * \defgroup group_scb_uart_interrupt_functions Interrupt * \defgroup group_scb_uart_low_power_functions Low Power Callbacks * \} * \defgroup group_scb_uart_data_structures Data Structures * \defgroup group_scb_uart_enums Enumerated Types */ #if !defined(CY_SCB_UART_H) #define CY_SCB_UART_H #include "cy_device.h" #if (defined (CY_IP_MXSCB) || defined (CY_IP_MXS22SCB)) #include "cy_scb_common.h" #if defined(__cplusplus) extern "C" { #endif /*************************************** * Enumerated Types ***************************************/ /** * \addtogroup group_scb_uart_enums * \{ */ /** UART status codes */ typedef enum { /** Operation completed successfully */ CY_SCB_UART_SUCCESS = 0U, /** One or more of input parameters are invalid */ CY_SCB_UART_BAD_PARAM = (CY_SCB_ID | CY_PDL_STATUS_ERROR | CY_SCB_UART_ID | 1U), /** * The UART is busy processing a receive operation. */ CY_SCB_UART_RECEIVE_BUSY = (CY_SCB_ID | CY_PDL_STATUS_ERROR | CY_SCB_UART_ID | 2U), /** * The UART is busy processing a transmit operation. */ CY_SCB_UART_TRANSMIT_BUSY = (CY_SCB_ID | CY_PDL_STATUS_ERROR | CY_SCB_UART_ID | 3U) } cy_en_scb_uart_status_t; /** UART Mode */ typedef enum { CY_SCB_UART_STANDARD = 0U, /**< Configures the SCB for Standard UART operation */ CY_SCB_UART_SMARTCARD = 1U, /**< Configures the SCB for SmartCard operation */ CY_SCB_UART_IRDA = 2U, /**< Configures the SCB for IrDA operation */ } cy_en_scb_uart_mode_t; /** UART Stop Bits */ typedef enum { CY_SCB_UART_STOP_BITS_1 = 2U, /**< UART looks for 1 Stop Bit */ CY_SCB_UART_STOP_BITS_1_5 = 3U, /**< UART looks for 1.5 Stop Bits */ CY_SCB_UART_STOP_BITS_2 = 4U, /**< UART looks for 2 Stop Bits */ CY_SCB_UART_STOP_BITS_2_5 = 5U, /**< UART looks for 2.5 Stop Bits */ CY_SCB_UART_STOP_BITS_3 = 6U, /**< UART looks for 3 Stop Bits */ CY_SCB_UART_STOP_BITS_3_5 = 7U, /**< UART looks for 3.5 Stop Bits */ CY_SCB_UART_STOP_BITS_4 = 8U, /**< UART looks for 4 Stop Bits */ } cy_en_scb_uart_stop_bits_t; /** UART Parity */ typedef enum { CY_SCB_UART_PARITY_NONE = 0U, /**< UART has no parity check */ CY_SCB_UART_PARITY_EVEN = 2U, /**< UART has even parity check */ CY_SCB_UART_PARITY_ODD = 3U, /**< UART has odd parity check */ } cy_en_scb_uart_parity_t; /** UART Polarity */ typedef enum { CY_SCB_UART_ACTIVE_LOW = 0U, /**< Signal is active low */ CY_SCB_UART_ACTIVE_HIGH = 1U, /**< Signal is active high */ } cy_en_scb_uart_polarity_t; /** \} group_scb_uart_enums */ /******************************************************************************* * Type Definitions *******************************************************************************/ /** * \addtogroup group_scb_uart_data_structures * \{ */ /** * Provides the typedef for the callback function called in the * \ref Cy_SCB_UART_Interrupt to notify the user about occurrences of * \ref group_scb_uart_macros_callback_events. */ typedef void (* cy_cb_scb_uart_handle_events_t)(uint32_t event); /** UART configuration structure */ typedef struct stc_scb_uart_config { /** Specifies the UART's mode of operation */ cy_en_scb_uart_mode_t uartMode; /** * Oversample factor for UART. * * The UART baud rate is the SCB Clock frequency / oversample * (valid range is 8-16). * * For IrDA, the oversample is always 16, unless * \ref irdaEnableLowPowerReceiver is enabled. Then the oversample is * reduced to the \ref group_scb_uart_macros_irda_lp_ovs set. */ uint32_t oversample; /** The width of UART data (valid range is 5 to 9) */ uint32_t dataWidth; /** * Enables the hardware to shift out data element MSB first; otherwise, * LSB first */ bool enableMsbFirst; /** * Specifies the number of stop bits in the UART transaction, in half-bit * increments */ cy_en_scb_uart_stop_bits_t stopBits; /** Configures the UART parity */ cy_en_scb_uart_parity_t parity; /** * Enables a digital 3-tap median filter (2 out of 3 voting) to be applied * to the input of the RX FIFO to filter glitches on the line (for IrDA, * this parameter is ignored) * */ bool enableInputFilter; /** * Enables the hardware to drop data in the RX FIFO when a parity error is * detected */ bool dropOnParityError; /** * Enables the hardware to drop data in the RX FIFO when a frame error is * detected */ bool dropOnFrameError; /** * Enables the UART operation in Multi-Processor mode which requires * dataWidth to be 9 bits (the 9th bit is used to indicate address byte) */ bool enableMutliProcessorMode; /** * If Multi Processor mode is enabled, this is the address of the RX * FIFO. If the address matches, data is accepted into the FIFO. If * it does not match, the data is ignored. */ uint32_t receiverAddress; /** * This is the address mask for the Multi Processor address. 1 indicates * that the incoming address must match the corresponding bit in the slave * address. A 0 in the mask indicates that the incoming address does * not need to match. */ uint32_t receiverAddressMask; /** * Enables the hardware to accept the matching address in the RX FIFO. * This is useful when the device supports more than one address. */ bool acceptAddrInFifo; /** Inverts the IrDA RX input */ bool irdaInvertRx; /** * Enables the low-power receive for IrDA mode. * Note that the transmission must be disabled if this mode is enabled. */ bool irdaEnableLowPowerReceiver; /** * Enables retransmission of the frame placed in the TX FIFO when * NACK is received in SmartCard mode (for Standard and IrDA , this parameter * is ignored) */ bool smartCardRetryOnNack; /** * Enables the usage of the CTS input signal for the transmitter. The * transmitter waits for CTS to be active before sending data */ bool enableCts; /** Sets the CTS Polarity */ cy_en_scb_uart_polarity_t ctsPolarity; /** * When the RX FIFO has fewer entries than rtsRxFifoLevel, the * RTS signal is active (note to disable RTS, set this field to zero) */ uint32_t rtsRxFifoLevel; /** Sets the RTS Polarity */ cy_en_scb_uart_polarity_t rtsPolarity; /** Specifies the number of bits to detect a break condition */ uint32_t breakWidth; #if(((defined (CY_IP_MXSCB_VERSION) && (CY_IP_MXSCB_VERSION>=2)) || defined (CY_IP_MXS22SCB)) || defined (CY_DOXYGEN)) /** Specifies the low or high level pulse detection for break condition */ /** * \note * This parameter is available for CAT1B and CAT1C devices. **/ bool breaklevel; #endif /* (((CY_IP_MXSCB_VERSION>=2) || defined (CY_IP_MXS22SCB)) || defined (CY_DOXYGEN)) */ /** * When there are more entries in the RX FIFO than this level * the RX trigger output goes high. This output can be connected * to a DMA channel through a trigger mux. * Also, it controls the \ref CY_SCB_UART_RX_TRIGGER interrupt source. */ uint32_t rxFifoTriggerLevel; /** * The bits set in this mask allow the event to cause an interrupt * (See \ref group_scb_uart_macros_rx_fifo_status for the set of constants) */ uint32_t rxFifoIntEnableMask; /** * When there are fewer entries in the TX FIFO then this level * the TX trigger output goes high. This output can be connected * to a DMA channel through a trigger mux. * Also, it controls \ref CY_SCB_UART_TX_TRIGGER interrupt source. */ uint32_t txFifoTriggerLevel; /** * Bits set in this mask allows the event to cause an interrupt * (See \ref group_scb_uart_macros_tx_fifo_status for the set of constants) */ uint32_t txFifoIntEnableMask; } cy_stc_scb_uart_config_t; /** UART context structure. * All fields for the context structure are internal. Firmware never reads or * writes these values. Firmware allocates the structure and provides the * address of the structure to the driver in function calls. Firmware must * ensure that the defined instance of this structure remains in scope * while the drive is in use. */ typedef struct cy_stc_scb_uart_context { /** \cond INTERNAL */ uint32_t volatile txStatus; /**< The transmit status */ uint32_t volatile rxStatus; /**< The receive status */ void *rxRingBuf; /**< The pointer to the ring buffer */ uint32_t rxRingBufSize; /**< The ring buffer size */ uint32_t volatile rxRingBufHead; /**< The ring buffer head index */ uint32_t volatile rxRingBufTail; /**< The ring buffer tail index */ void *rxBuf; /**< The pointer to the receive buffer */ uint32_t rxBufSize; /**< The receive buffer size */ uint32_t volatile rxBufIdx; /**< The current location in the receive buffer */ void *txBuf; /**< The pointer to the transmit buffer */ uint32_t txBufSize; /**< The transmit buffer size */ uint32_t volatile txLeftToTransmit; /**< The number of data elements left to be transmitted */ /** * Enables the low-power receive for IrDA mode. * Note that the transmission must be disabled if this mode is enabled. */ bool irdaEnableLowPowerReceiver; /** The pointer to an event callback that is called when any of * \ref group_scb_uart_macros_callback_events occurs */ cy_cb_scb_uart_handle_events_t cbEvents; #if !defined(NDEBUG) uint32_t initKey; /**< Tracks the context initialization */ #endif /* !(NDEBUG) */ /** \endcond */ } cy_stc_scb_uart_context_t; /** \} group_scb_uart_data_structures */ /******************************************************************************* * Function Prototypes *******************************************************************************/ /** * \addtogroup group_scb_uart_general_functions * \{ */ cy_en_scb_uart_status_t Cy_SCB_UART_Init(CySCB_Type *base, cy_stc_scb_uart_config_t const *config, cy_stc_scb_uart_context_t *context); void Cy_SCB_UART_DeInit (CySCB_Type *base); __STATIC_INLINE void Cy_SCB_UART_Enable(CySCB_Type *base); void Cy_SCB_UART_Disable(CySCB_Type *base, cy_stc_scb_uart_context_t *context); __STATIC_INLINE void Cy_SCB_UART_EnableCts (CySCB_Type *base); __STATIC_INLINE void Cy_SCB_UART_DisableCts (CySCB_Type *base); __STATIC_INLINE void Cy_SCB_UART_SetRtsFifoLevel(CySCB_Type *base, uint32_t level); __STATIC_INLINE uint32_t Cy_SCB_UART_GetRtsFifoLevel(CySCB_Type const *base); __STATIC_INLINE void Cy_SCB_UART_EnableSkipStart (CySCB_Type *base); __STATIC_INLINE void Cy_SCB_UART_DisableSkipStart(CySCB_Type *base); /** \} group_scb_uart_general_functions */ /** * \addtogroup group_scb_uart_high_level_functions * \{ */ void Cy_SCB_UART_StartRingBuffer (CySCB_Type *base, void *buffer, uint32_t size, cy_stc_scb_uart_context_t *context); void Cy_SCB_UART_StopRingBuffer (CySCB_Type *base, cy_stc_scb_uart_context_t *context); uint32_t Cy_SCB_UART_GetNumInRingBuffer(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); void Cy_SCB_UART_ClearRingBuffer (CySCB_Type const *base, cy_stc_scb_uart_context_t *context); cy_en_scb_uart_status_t Cy_SCB_UART_Receive(CySCB_Type *base, void *buffer, uint32_t size, cy_stc_scb_uart_context_t *context); void Cy_SCB_UART_AbortReceive (CySCB_Type *base, cy_stc_scb_uart_context_t *context); uint32_t Cy_SCB_UART_GetReceiveStatus(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); uint32_t Cy_SCB_UART_GetNumReceived (CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); cy_en_scb_uart_status_t Cy_SCB_UART_Transmit(CySCB_Type *base, void *buffer, uint32_t size, cy_stc_scb_uart_context_t *context); void Cy_SCB_UART_AbortTransmit (CySCB_Type *base, cy_stc_scb_uart_context_t *context); uint32_t Cy_SCB_UART_GetTransmitStatus (CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); uint32_t Cy_SCB_UART_GetNumLeftToTransmit(CySCB_Type const *base, cy_stc_scb_uart_context_t const *context); /** \} group_scb_uart_high_level_functions */ /** * \addtogroup group_scb_uart_low_level_functions * \{ */ __STATIC_INLINE uint32_t Cy_SCB_UART_Put (CySCB_Type *base, uint32_t data); __STATIC_INLINE uint32_t Cy_SCB_UART_PutArray (CySCB_Type *base, void *buffer, uint32_t size); __STATIC_INLINE void Cy_SCB_UART_PutArrayBlocking(CySCB_Type *base, void *buffer, uint32_t size); __STATIC_INLINE void Cy_SCB_UART_PutString (CySCB_Type *base, char_t const string[]); void Cy_SCB_UART_SendBreakBlocking(CySCB_Type *base, uint32_t breakWidth); __STATIC_INLINE uint32_t Cy_SCB_UART_Get (CySCB_Type const *base); __STATIC_INLINE uint32_t Cy_SCB_UART_GetArray (CySCB_Type const *base, void *buffer, uint32_t size); __STATIC_INLINE void Cy_SCB_UART_GetArrayBlocking(CySCB_Type const *base, void *buffer, uint32_t size); __STATIC_INLINE uint32_t Cy_SCB_UART_GetTxFifoStatus (CySCB_Type const *base); __STATIC_INLINE void Cy_SCB_UART_ClearTxFifoStatus(CySCB_Type *base, uint32_t clearMask); __STATIC_INLINE uint32_t Cy_SCB_UART_GetRxFifoStatus (CySCB_Type const *base); __STATIC_INLINE void Cy_SCB_UART_ClearRxFifoStatus(CySCB_Type *base, uint32_t clearMask); __STATIC_INLINE uint32_t Cy_SCB_UART_GetNumInTxFifo (CySCB_Type const *base); __STATIC_INLINE bool Cy_SCB_UART_IsTxComplete (CySCB_Type const *base); __STATIC_INLINE uint32_t Cy_SCB_UART_GetNumInRxFifo (CySCB_Type const *base); __STATIC_INLINE void Cy_SCB_UART_ClearRxFifo (CySCB_Type *base); __STATIC_INLINE void Cy_SCB_UART_ClearTxFifo (CySCB_Type *base); __STATIC_INLINE uint32_t Cy_SCB_UART_GetOverSample(CySCB_Type const *base); cy_en_scb_uart_status_t Cy_SCB_UART_SetOverSample(CySCB_Type *base, uint32_t overSample, cy_stc_scb_uart_context_t *context); __STATIC_INLINE uint32_t Cy_SCB_UART_GetDataWidth(CySCB_Type const *base); void Cy_SCB_UART_SetDataWidth(CySCB_Type *base, uint32_t dataWidth); __STATIC_INLINE uint32_t Cy_SCB_UART_GetParity(CySCB_Type const *base); void Cy_SCB_UART_SetParity(CySCB_Type *base, cy_en_scb_uart_parity_t parity); __STATIC_INLINE uint32_t Cy_SCB_UART_GetStopBits(CySCB_Type const *base); void Cy_SCB_UART_SetStopBits(CySCB_Type *base, cy_en_scb_uart_stop_bits_t stopBits); __STATIC_INLINE bool Cy_SCB_UART_GetDropOnParityError(CySCB_Type const *base); void Cy_SCB_UART_SetDropOnParityError(CySCB_Type *base, bool dropOnParityError); __STATIC_INLINE bool Cy_SCB_UART_GetEnableMsbFirst(CySCB_Type const *base); void Cy_SCB_UART_SetEnableMsbFirst(CySCB_Type *base, bool enableMsbFirst); /** \} group_scb_uart_low_level_functions */ /** * \addtogroup group_scb_uart_interrupt_functions * \{ */ void Cy_SCB_UART_Interrupt(CySCB_Type *base, cy_stc_scb_uart_context_t *context); __STATIC_INLINE void Cy_SCB_UART_RegisterCallback(CySCB_Type const *base, cy_cb_scb_uart_handle_events_t callback, cy_stc_scb_uart_context_t *context); /** \} group_scb_uart_interrupt_functions */ /** * \addtogroup group_scb_uart_low_power_functions * \{ */ cy_en_syspm_status_t Cy_SCB_UART_DeepSleepCallback(cy_stc_syspm_callback_params_t *callbackParams, cy_en_syspm_callback_mode_t mode); cy_en_syspm_status_t Cy_SCB_UART_HibernateCallback(cy_stc_syspm_callback_params_t *callbackParams, cy_en_syspm_callback_mode_t mode); /** \} group_scb_uart_low_power_functions */ /******************************************************************************* * API Constants *******************************************************************************/ /** * \addtogroup group_scb_uart_macros * \{ */ /** * \defgroup group_scb_uart_macros_irda_lp_ovs UART IRDA Low Power Oversample factors * \{ */ #define CY_SCB_UART_IRDA_LP_OVS16 (1UL) /**< IrDA in low-power mode oversampled by 16 */ #define CY_SCB_UART_IRDA_LP_OVS32 (2UL) /**< IrDA in low-power mode oversampled by 32 */ #define CY_SCB_UART_IRDA_LP_OVS48 (3UL) /**< IrDA in low-power mode oversampled by 48 */ #define CY_SCB_UART_IRDA_LP_OVS96 (4UL) /**< IrDA in low-power mode oversampled by 96 */ #define CY_SCB_UART_IRDA_LP_OVS192 (5UL) /**< IrDA in low-power mode oversampled by 192 */ #define CY_SCB_UART_IRDA_LP_OVS768 (6UL) /**< IrDA in low-power mode oversampled by 768 */ #define CY_SCB_UART_IRDA_LP_OVS1536 (7UL) /**< IrDA in low-power mode oversampled by 1536 */ /** \} group_scb_uart_macros_irda_lp_ovs */ /** * \defgroup group_scb_uart_macros_rx_fifo_status UART RX FIFO status. * \{ * Macros to check UART RX FIFO status returned by \ref Cy_SCB_UART_GetRxFifoStatus * function or assign mask for \ref Cy_SCB_UART_ClearRxFifoStatus function. * Each UART RX FIFO status is encoded in a separate bit, therefore multiple * bits may be set to indicate the current status. */ /** The number of entries in the RX FIFO is more than the RX FIFO trigger level * value */ #define CY_SCB_UART_RX_TRIGGER (SCB_INTR_RX_TRIGGER_Msk) /** The RX FIFO is not empty, there is data to read */ #define CY_SCB_UART_RX_NOT_EMPTY (SCB_INTR_RX_NOT_EMPTY_Msk) /** * The RX FIFO is full, there is no more space for additional data, and * any additional data will be dropped */ #define CY_SCB_UART_RX_FULL (SCB_INTR_RX_FULL_Msk) /** * The RX FIFO was full and there was an attempt to write to it. * That additional data was dropped. */ #define CY_SCB_UART_RX_OVERFLOW (SCB_INTR_RX_OVERFLOW_Msk) /** An attempt to read from an empty RX FIFO */ #define CY_SCB_UART_RX_UNDERFLOW (SCB_INTR_RX_UNDERFLOW_Msk) /** The RX FIFO detected a frame error, either a stop or stop-bit error */ #define CY_SCB_UART_RX_ERR_FRAME (SCB_INTR_RX_FRAME_ERROR_Msk) /** The RX FIFO detected a parity error */ #define CY_SCB_UART_RX_ERR_PARITY (SCB_INTR_RX_PARITY_ERROR_Msk) /** The RX FIFO detected a break transmission from the transmitter */ #define CY_SCB_UART_RX_BREAK_DETECT (SCB_INTR_RX_BREAK_DETECT_Msk) /** \} group_scb_uart_macros_rx_fifo_status */ /** * \defgroup group_scb_uart_macros_tx_fifo_status UART TX FIFO Statuses * \{ * Macros to check UART TX FIFO status returned by \ref Cy_SCB_UART_GetTxFifoStatus * function or assign mask for \ref Cy_SCB_UART_ClearTxFifoStatus function. * Each UART TX FIFO status is encoded in a separate bit, therefore multiple bits * may be set to indicate the current status. */ /** The number of entries in the TX FIFO is less than the TX FIFO trigger level * value */ #define CY_SCB_UART_TX_TRIGGER (SCB_INTR_TX_TRIGGER_Msk) /** The TX FIFO is not full, there is a space for more data */ #define CY_SCB_UART_TX_NOT_FULL (SCB_INTR_TX_NOT_FULL_Msk) /** The TX FIFO is empty, note there may still be data in the shift register.*/ #define CY_SCB_UART_TX_EMPTY (SCB_INTR_TX_EMPTY_Msk) /** An attempt to write to the full TX FIFO */ #define CY_SCB_UART_TX_OVERFLOW (SCB_INTR_TX_OVERFLOW_Msk) /** An attempt to read from an empty transmitter FIFO (hardware reads). */ #define CY_SCB_UART_TX_UNDERFLOW (SCB_INTR_TX_UNDERFLOW_Msk) /** All data has been transmitted out of the FIFO, including shifter */ #define CY_SCB_UART_TX_DONE (SCB_INTR_TX_UART_DONE_Msk) /** SmartCard only: the transmitter received a NACK */ #define CY_SCB_UART_TX_NACK (SCB_INTR_TX_UART_NACK_Msk) /** SmartCard only: the transmitter lost arbitration */ #define CY_SCB_UART_TX_ARB_LOST (SCB_INTR_TX_UART_ARB_LOST_Msk) /** \} group_scb_uart_macros_tx_fifo_status */ /** * \defgroup group_scb_uart_macros_receive_status UART Receive Statuses * \{ * Macros to check current UART receive status returned by * \ref Cy_SCB_UART_GetReceiveStatus function. * Each UART receive status is encoded in a separate bit, therefore multiple bits * may be set to indicate the current status. */ /** The receive operation started by \ref Cy_SCB_UART_Receive is in progress */ #define CY_SCB_UART_RECEIVE_ACTIVE (0x01UL) /** * The hardware RX FIFO was full and there was an attempt to write to it. * That additional data was dropped. */ #define CY_SCB_UART_RECEIVE_OVERFLOW (SCB_INTR_RX_OVERFLOW_Msk) /** The receive hardware detected a frame error, either a start or * stop bit error */ #define CY_SCB_UART_RECEIVE_ERR_FRAME (SCB_INTR_RX_FRAME_ERROR_Msk) /** The receive hardware detected a parity error */ #define CY_SCB_UART_RECEIVE_ERR_PARITY (SCB_INTR_RX_PARITY_ERROR_Msk) /** The receive hardware detected a break transmission from transmitter */ #define CY_SCB_UART_RECEIVE_BREAK_DETECT (SCB_INTR_RX_BREAK_DETECT_Msk) /** \} group_scb_uart_macros_receive_status */ /** * \defgroup group_scb_uart_macros_transmit_status UART Transmit Status * \{ * Macros to check current UART transmit status returned by * \ref Cy_SCB_UART_GetTransmitStatus function. * Each UART transmit status is encoded in a separate bit, therefore multiple bits * may be set to indicate the current status. */ /** The transmit operation started by \ref Cy_SCB_UART_Transmit is in progress */ #define CY_SCB_UART_TRANSMIT_ACTIVE (0x01UL) /** * All data elements specified by \ref Cy_SCB_UART_Transmit have been loaded * into the TX FIFO */ #define CY_SCB_UART_TRANSMIT_IN_FIFO (0x02UL) /** SmartCard only: the transmitter received a NACK */ #define CY_SCB_UART_TRANSMIT_NACK (SCB_INTR_TX_UART_NACK_Msk) /** SmartCard only: the transmitter lost arbitration */ #define CY_SCB_UART_TRANSMIT_ARB_LOST (SCB_INTR_TX_UART_ARB_LOST_Msk) /** \} group_scb_uart_macros_transmit_status */ /** * \defgroup group_scb_uart_macros_callback_events UART Callback Events * \{ * Macros to check UART events passed by \ref cy_cb_scb_uart_handle_events_t callback. * Note that only single event is notified by the callback when it is called. */ /** * All data elements specified by \ref Cy_SCB_UART_Transmit have been loaded * into the TX FIFO */ #define CY_SCB_UART_TRANSMIT_IN_FIFO_EVENT (0x01UL) /** The transmit operation started by \ref Cy_SCB_UART_Transmit is complete */ #define CY_SCB_UART_TRANSMIT_DONE_EVENT (0x02UL) /** The receive operation started by \ref Cy_SCB_UART_Receive is complete */ #define CY_SCB_UART_RECEIVE_DONE_EVENT (0x04UL) /** * The ring buffer is full, there is no more space for additional data. * Additional data is stored in the RX FIFO until it becomes full, at which * point data is dropped. */ #define CY_SCB_UART_RB_FULL_EVENT (0x08UL) /** * An error was detected during the receive operation. This includes overflow, * frame error, or parity error. Check \ref Cy_SCB_UART_GetReceiveStatus to * determine the source of the error. */ #define CY_SCB_UART_RECEIVE_ERR_EVENT (0x10UL) /** * An error was detected during the transmit operation. This includes a NACK * or lost arbitration. Check \ref Cy_SCB_UART_GetTransmitStatus to determine * the source of the error */ #define CY_SCB_UART_TRANSMIT_ERR_EVENT (0x20UL) /** The receive fifo is not empty. To use this event the \ref CY_SCB_RX_INTR_NOT_EMPTY interrupt must be enabled by the user. */ #define CY_SCB_UART_RECEIVE_NOT_EMTPY (0x40UL) /** The transmit fifo is empty. To use this event the \ref CY_SCB_UART_TX_EMPTY interrupt must be enabled by the user. */ #define CY_SCB_UART_TRANSMIT_EMTPY (0x80UL) /** \} group_scb_uart_macros_callback_events */ /** Data returned by the hardware when an empty RX FIFO is read */ #define CY_SCB_UART_RX_NO_DATA (0xFFFFFFFFUL) /******************************************************************************* * Internal Constants *******************************************************************************/ /** \cond INTERNAL */ #define CY_SCB_UART_TX_INTR_MASK (CY_SCB_UART_TX_TRIGGER | CY_SCB_UART_TX_NOT_FULL | CY_SCB_UART_TX_EMPTY | \ CY_SCB_UART_TX_OVERFLOW | CY_SCB_UART_TX_UNDERFLOW | CY_SCB_UART_TX_DONE | \ CY_SCB_UART_TX_NACK | CY_SCB_UART_TX_ARB_LOST) #define CY_SCB_UART_RX_INTR_MASK (CY_SCB_UART_RX_TRIGGER | CY_SCB_UART_RX_NOT_EMPTY | CY_SCB_UART_RX_FULL | \ CY_SCB_UART_RX_OVERFLOW | CY_SCB_UART_RX_UNDERFLOW | CY_SCB_UART_RX_ERR_FRAME | \ CY_SCB_UART_RX_ERR_PARITY | CY_SCB_UART_RX_BREAK_DETECT) #define CY_SCB_UART_TX_INTR (CY_SCB_TX_INTR_LEVEL | CY_SCB_TX_INTR_UART_NACK | CY_SCB_TX_INTR_UART_ARB_LOST) #define CY_SCB_UART_RX_INTR (CY_SCB_RX_INTR_LEVEL | CY_SCB_RX_INTR_OVERFLOW | CY_SCB_RX_INTR_UART_FRAME_ERROR | \ CY_SCB_RX_INTR_UART_PARITY_ERROR | CY_SCB_RX_INTR_UART_BREAK_DETECT) #define CY_SCB_UART_RECEIVE_ERR (CY_SCB_RX_INTR_OVERFLOW | CY_SCB_RX_INTR_UART_FRAME_ERROR | \ CY_SCB_RX_INTR_UART_PARITY_ERROR) #define CY_SCB_UART_TRANSMIT_ERR (CY_SCB_TX_INTR_UART_NACK | CY_SCB_TX_INTR_UART_ARB_LOST) #define CY_SCB_UART_INIT_KEY (0x00ABCDEFUL) #define CY_SCB_UART_IS_MODE_VALID(mode) ( (CY_SCB_UART_STANDARD == (mode)) || \ (CY_SCB_UART_SMARTCARD == (mode)) || \ (CY_SCB_UART_IRDA == (mode)) ) #define CY_SCB_UART_IS_STOP_BITS_VALID(stopBits) ( (CY_SCB_UART_STOP_BITS_1 == (stopBits)) || \ (CY_SCB_UART_STOP_BITS_1_5 == (stopBits)) || \ (CY_SCB_UART_STOP_BITS_2 == (stopBits)) || \ (CY_SCB_UART_STOP_BITS_2_5 == (stopBits)) || \ (CY_SCB_UART_STOP_BITS_3 == (stopBits)) || \ (CY_SCB_UART_STOP_BITS_3_5 == (stopBits)) || \ (CY_SCB_UART_STOP_BITS_4 == (stopBits)) ) #define CY_SCB_UART_IS_PARITY_VALID(parity) ( (CY_SCB_UART_PARITY_NONE == (parity)) || \ (CY_SCB_UART_PARITY_EVEN == (parity)) || \ (CY_SCB_UART_PARITY_ODD == (parity)) ) #define CY_SCB_UART_IS_POLARITY_VALID(polarity) ( (CY_SCB_UART_ACTIVE_LOW == (polarity)) || \ (CY_SCB_UART_ACTIVE_HIGH == (polarity)) ) #define CY_SCB_UART_IS_IRDA_LP_OVS_VALID(ovs) ( (CY_SCB_UART_IRDA_LP_OVS16 == (ovs)) || \ (CY_SCB_UART_IRDA_LP_OVS32 == (ovs)) || \ (CY_SCB_UART_IRDA_LP_OVS48 == (ovs)) || \ (CY_SCB_UART_IRDA_LP_OVS96 == (ovs)) || \ (CY_SCB_UART_IRDA_LP_OVS192 == (ovs)) || \ (CY_SCB_UART_IRDA_LP_OVS768 == (ovs)) || \ (CY_SCB_UART_IRDA_LP_OVS1536 == (ovs)) ) #define CY_SCB_UART_IS_ADDRESS_VALID(addr) ((addr) <= 0xFFUL) #define CY_SCB_UART_IS_ADDRESS_MASK_VALID(mask) ((mask) <= 0xFFUL) #define CY_SCB_UART_IS_DATA_WIDTH_VALID(width) ( ((width) >= 5UL) && ((width) <= 9UL) ) #define CY_SCB_UART_IS_OVERSAMPLE_VALID(ovs, mode, lpRx) ( ((CY_SCB_UART_STANDARD == (mode)) || (CY_SCB_UART_SMARTCARD == (mode))) ? \ (((ovs) >= 8UL) && ((ovs) <= 16UL)) : \ (bool) ((lpRx) ? CY_SCB_UART_IS_IRDA_LP_OVS_VALID(ovs) : true) ) #define CY_SCB_UART_IS_RX_BREAK_WIDTH_VALID(base, width) ( ((width) >= (_FLD2VAL(SCB_RX_CTRL_DATA_WIDTH, (base)->RX_CTRL) + 3UL)) && \ ((width) <= 16UL) ) #define CY_SCB_UART_IS_TX_BREAK_WIDTH_VALID(width) ( ((width) >= 4UL) && ((width) <= 16UL) ) #define CY_SCB_UART_IS_MUTLI_PROC_VALID(mp, mode, width, parity) ( (mp) ? ((CY_SCB_UART_STANDARD == (mode)) && ((width) == 9UL) && \ (CY_SCB_UART_PARITY_NONE == (parity))) : true) /** \endcond */ /** \} group_scb_uart_macros */ /******************************************************************************* * In-line Function Implementation *******************************************************************************/ /** * \addtogroup group_scb_uart_general_functions * \{ */ /******************************************************************************* * Function Name: Cy_SCB_UART_Enable ****************************************************************************//** * * Enables the SCB block for the UART operation. * * \param base * The pointer to the UART SCB instance. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_Enable(CySCB_Type *base) { SCB_CTRL(base) |= SCB_CTRL_ENABLED_Msk; } /******************************************************************************* * Function Name: Cy_SCB_UART_EnableCts ****************************************************************************//** * * Enables the Clear to Send (CTS) input for the UART. The UART will not transmit * data while this signal is inactive. * * \param base * The pointer to the UART SCB instance. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_EnableCts(CySCB_Type *base) { SCB_UART_FLOW_CTRL(base) |= SCB_UART_FLOW_CTRL_CTS_ENABLED_Msk; } /******************************************************************************* * Function Name: Cy_SCB_UART_DisableCts ****************************************************************************//** * * Disables the Clear to Send (CTS) input for the UART. * See \ref Cy_SCB_UART_EnableCts for the details. * * \param base * The pointer to the UART SCB instance. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_DisableCts(CySCB_Type *base) { SCB_UART_FLOW_CTRL(base) &= (uint32_t) ~SCB_UART_FLOW_CTRL_CTS_ENABLED_Msk; } /******************************************************************************* * Function Name: Cy_SCB_UART_SetRtsFifoLevel ****************************************************************************//** * * Sets a level for the Ready To Send (RTS) signal activation. * When the number of data elements in the receive FIFO is below this level, * then the RTS output is active. Otherwise, the RTS signal is inactive. * To disable the RTS signal generation, set this level to zero. * * \param base * The pointer to the UART SCB instance. * * \param level * The level in the RX FIFO for RTS signal activation. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_SetRtsFifoLevel(CySCB_Type *base, uint32_t level) { CY_ASSERT_L2(CY_SCB_IS_TRIGGER_LEVEL_VALID(base, level)); CY_REG32_CLR_SET(SCB_UART_FLOW_CTRL(base), SCB_UART_FLOW_CTRL_TRIGGER_LEVEL, level); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetRtsFifoLevel ****************************************************************************//** * * Returns the level in the RX FIFO for the RTS signal activation. * * \param base * The pointer to the UART SCB instance. * * \return * The level in the RX FIFO for RTS signal activation. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetRtsFifoLevel(CySCB_Type const *base) { return _FLD2VAL(SCB_UART_FLOW_CTRL_TRIGGER_LEVEL, SCB_UART_FLOW_CTRL(base)); } /******************************************************************************* * Function Name: Cy_SCB_UART_EnableSkipStart ****************************************************************************//** * * Enables the skip start-bit functionality. * When skip start is enabled the UART hardware does not synchronize to a * start bit but synchronizes to the first rising edge. To create a rising edge, * the first data bit must be a 1. This feature is useful when the start bit * falling edge is used to wake the device through a GPIO interrupt. * * \param base * The pointer to the UART SCB instance. * * \note * When skip start-bit feature is enabled, it is applied (UART synchronizes * to the first rising edge after start bit) whenever the SCB is enabled. * This can cause incorrect UART synchronization and data reception when * the first data bit is not a 1. Therefore, disable the skip start-bit * when it should not be applied. * Note that SCB is disabled before enter Deep Sleep mode or after calling * \ref Cy_SCB_UART_Disable. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_EnableSkipStart(CySCB_Type *base) { SCB_UART_RX_CTRL(base) |= SCB_UART_RX_CTRL_SKIP_START_Msk; } /******************************************************************************* * Function Name: Cy_SCB_UART_DisableSkipStart ****************************************************************************//** * * Disable the skip start-bit functionality. * See \ref Cy_SCB_UART_EnableSkipStart for the details. * * \param base * The pointer to the UART SCB instance. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_DisableSkipStart(CySCB_Type *base) { SCB_UART_RX_CTRL(base) &= (uint32_t) ~SCB_UART_RX_CTRL_SKIP_START_Msk; } /** \} group_scb_uart_general_functions */ /** * \addtogroup group_scb_uart_low_level_functions * \{ */ /******************************************************************************* * Function Name: Cy_SCB_UART_GetOverSample ****************************************************************************//** * * Returns the value of oversample. * * \param base * The pointer to the UART SCB instance. * * \return * The value of oversample. * * \snippet scb/uart_snippet/main.c UART_GET_OVS * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetOverSample(CySCB_Type const *base) { return (_FLD2VAL(SCB_CTRL_OVS, SCB_CTRL(base))+1UL); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetDataWidth ****************************************************************************//** * * Returns the value of datawidth. * * \param base * The pointer to the UART SCB instance. * * \return * The value of datawidth. * * \note * Values of Tx and Rx datawidth are same. * * \snippet scb/uart_snippet/main.c UART_GET_DATA_WIDTH * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetDataWidth(CySCB_Type const *base) { return (_FLD2VAL(SCB_TX_CTRL_DATA_WIDTH, SCB_TX_CTRL(base))+1UL); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetParity ****************************************************************************//** * * Returns the value of parity. * * \param base * The pointer to the UART SCB instance. * * \return * The value of parity. * * \note * Values of Tx and Rx parity are same. * * \snippet scb/uart_snippet/main.c UART_GET_PARITY * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetParity(CySCB_Type const *base) { return _FLD2VAL(CY_SCB_UART_TX_CTRL_SET_PARITY, SCB_UART_TX_CTRL(base)); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetStopBits ****************************************************************************//** * * Returns the value of stop bits. * * \param base * The pointer to the UART SCB instance. * * \return * The value of stop bits. * * \note * Values of Tx and Rx stop bits are same. * * \snippet scb/uart_snippet/main.c UART_GET_STOP_BITS * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetStopBits(CySCB_Type const *base) { return (_FLD2VAL(SCB_UART_TX_CTRL_STOP_BITS, SCB_UART_TX_CTRL(base))+1UL); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetDropOnParityError ****************************************************************************//** * * Returns the value of SetDropOnParityError. * * \param base * The pointer to the UART SCB instance. * * \return * The value of SetDropOnParityError. * * \snippet scb/uart_snippet/main.c UART_GET_DROP_ON_PARITY_ERROR * *******************************************************************************/ __STATIC_INLINE bool Cy_SCB_UART_GetDropOnParityError(CySCB_Type const *base) { return _FLD2BOOL(SCB_UART_RX_CTRL_DROP_ON_PARITY_ERROR, SCB_UART_RX_CTRL(base)); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetEnableMsbFirst ****************************************************************************//** * * Returns the value of enableMsbFirst. * * \param base * The pointer to the UART SCB instance. * * \return * The value of enableMsbFirst. * * \note * Values of Tx and Rx enableMsbFirst are same. * * \snippet scb/uart_snippet/main.c UART_GET_ENABLE_MSB_FIRST * *******************************************************************************/ __STATIC_INLINE bool Cy_SCB_UART_GetEnableMsbFirst(CySCB_Type const *base) { return _FLD2BOOL(SCB_TX_CTRL_MSB_FIRST, SCB_TX_CTRL(base)); } /******************************************************************************* * Function Name: Cy_SCB_UART_Get ****************************************************************************//** * * Reads a single data element from the UART RX FIFO. * This function does not check whether the RX FIFO has data before reading it. * If the RX FIFO is empty, the function returns \ref CY_SCB_UART_RX_NO_DATA. * * \param base * The pointer to the UART SCB instance. * * \return * Data from the RX FIFO. * The data element size is defined by the configured data width. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_Get(CySCB_Type const *base) { return Cy_SCB_ReadRxFifo(base); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetArray ****************************************************************************//** * * Reads an array of data out of the UART RX FIFO. * This function does not block. It returns how many data elements were read * from the RX FIFO. * * \param base * The pointer to the UART SCB instance. * * \param buffer * The pointer to the location to place the data read from the RX FIFO. * The element size is defined by the data type, which depends on the configured * data width. * * \param size * The number of data elements to read from the RX FIFO. * * \return * The number of data elements read from the RX FIFO. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetArray(CySCB_Type const *base, void *buffer, uint32_t size) { CY_ASSERT_L1(CY_SCB_IS_BUFFER_VALID(buffer, size)); return Cy_SCB_ReadArray(base, buffer, size); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetArrayBlocking ****************************************************************************//** * * Reads an array of data out of the UART RX FIFO. * This function blocks until the number of data elements specified by the * size has been read from the RX FIFO. * * \param base * The pointer to the UART SCB instance. * * \param buffer * The pointer to the location to place the data read from the RX FIFO. * The element size is defined by the data type, which depends on the configured * data width. * * \param size * The number of data elements to read from the RX FIFO. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_GetArrayBlocking(CySCB_Type const *base, void *buffer, uint32_t size) { CY_ASSERT_L1(CY_SCB_IS_BUFFER_VALID(buffer, size)); Cy_SCB_ReadArrayBlocking(base, buffer, size); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetRxFifoStatus ****************************************************************************//** * * Returns the current status of the RX FIFO. * * \param base * The pointer to the UART SCB instance. * * \return * \ref group_scb_uart_macros_rx_fifo_status * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetRxFifoStatus(CySCB_Type const *base) { return (Cy_SCB_GetRxInterruptStatus(base) & CY_SCB_UART_RX_INTR_MASK); } /******************************************************************************* * Function Name: Cy_SCB_UART_ClearRxFifoStatus ****************************************************************************//** * * Clears the selected statuses of the RX FIFO. * * \param base * The pointer to the UART SCB instance. * * \param clearMask * The mask whose statuses to clear. * See \ref group_scb_uart_macros_rx_fifo_status for the set of constants. * * \note * * This status is also used for interrupt generation, so clearing it also * clears the interrupt sources. * * Level-sensitive statuses such as \ref CY_SCB_UART_RX_TRIGGER, * \ref CY_SCB_UART_RX_NOT_EMPTY and \ref CY_SCB_UART_RX_FULL are set high again after * being cleared if the condition remains true. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_ClearRxFifoStatus(CySCB_Type *base, uint32_t clearMask) { CY_ASSERT_L2(CY_SCB_IS_INTR_VALID(clearMask, CY_SCB_UART_RX_INTR_MASK)); Cy_SCB_ClearRxInterrupt(base, clearMask); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetNumInRxFifo ****************************************************************************//** * * Returns the number of data elements in the UART RX FIFO. * * \param base * The pointer to the UART SCB instance. * * \return * The number of data elements in the RX FIFO. * The size of date element defined by the configured data width. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetNumInRxFifo(CySCB_Type const *base) { return Cy_SCB_GetNumInRxFifo(base); } /******************************************************************************* * Function Name: Cy_SCB_UART_ClearRxFifo ****************************************************************************//** * * Clears all data out of the UART RX FIFO. * * \param base * The pointer to the UART SCB instance. * * \sideeffect * Any data currently in the shifter is cleared and lost. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_ClearRxFifo(CySCB_Type *base) { Cy_SCB_ClearRxFifo(base); } /******************************************************************************* * Function Name: Cy_SCB_UART_Put ****************************************************************************//** * * Places a single data element in the UART TX FIFO. * This function does not block and returns how many data elements were placed * in the TX FIFO. * * \param base * The pointer to the UART SCB instance. * * \param data * Data to put in the TX FIFO. * The element size is defined by the data type, which depends on the configured * data width. * * \return * The number of data elements placed in the TX FIFO: 0 or 1. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_Put(CySCB_Type *base, uint32_t data) { return Cy_SCB_Write(base, data); } /******************************************************************************* * Function Name: Cy_SCB_UART_PutArray ****************************************************************************//** * * Places an array of data in the UART TX FIFO. * This function does not block. It returns how many data elements were * placed in the TX FIFO. * * \param base * The pointer to the UART SCB instance. * * \param buffer * The pointer to data to place in the TX FIFO. * The element size is defined by the data type, which depends on the configured * TX data width. * * \param size * The number of data elements to TX. * * \return * The number of data elements placed in the TX FIFO. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_PutArray(CySCB_Type *base, void *buffer, uint32_t size) { CY_ASSERT_L1(CY_SCB_IS_BUFFER_VALID(buffer, size)); return Cy_SCB_WriteArray(base, buffer, size); } /******************************************************************************* * Function Name: Cy_SCB_UART_PutArrayBlocking ****************************************************************************//** * * Places an array of data in the UART TX FIFO. * This function blocks until the number of data elements specified by the size * is placed in the TX FIFO. * * \param base * The pointer to the UART SCB instance. * * \param buffer * The pointer to data to place in the TX FIFO. * The element size is defined by the data type, which depends on the configured * data width. * * \param size * The number of data elements to write into the TX FIFO. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_PutArrayBlocking(CySCB_Type *base, void *buffer, uint32_t size) { CY_ASSERT_L1(CY_SCB_IS_BUFFER_VALID(buffer, size)); Cy_SCB_WriteArrayBlocking(base, buffer, size); } /******************************************************************************* * Function Name: Cy_SCB_UART_PutString ****************************************************************************//** * * Places a NULL terminated string in the UART TX FIFO. * This function blocks until the entire string is placed in the TX FIFO. * * \param base * The pointer to the UART SCB instance. * * \param string * The pointer to the null terminated string array. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_PutString(CySCB_Type *base, char_t const string[]) { CY_ASSERT_L1(CY_SCB_IS_BUFFER_VALID(string, 1UL)); Cy_SCB_WriteString(base, string); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetTxFifoStatus ****************************************************************************//** * * Returns the current status of the TX FIFO. * * \param base * The pointer to the UART SCB instance. * * \return * \ref group_scb_uart_macros_tx_fifo_status * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetTxFifoStatus(CySCB_Type const *base) { return (Cy_SCB_GetTxInterruptStatus(base) & CY_SCB_UART_TX_INTR_MASK); } /******************************************************************************* * Function Name: Cy_SCB_UART_ClearTxFifoStatus ****************************************************************************//** * * Clears the selected statuses of the TX FIFO. * * \param base * The pointer to the UART SCB instance. * * \param clearMask * The mask whose statuses to clear. * See \ref group_scb_uart_macros_tx_fifo_status for the set of constants. * * \note * * The status is also used for interrupt generation, so clearing it also * clears the interrupt sources. * * Level-sensitive statuses such as \ref CY_SCB_UART_TX_TRIGGER, * \ref CY_SCB_UART_TX_EMPTY and \ref CY_SCB_UART_TX_NOT_FULL are set high again after * being cleared if the condition remains true. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_ClearTxFifoStatus(CySCB_Type *base, uint32_t clearMask) { CY_ASSERT_L2(CY_SCB_IS_INTR_VALID(clearMask, CY_SCB_UART_TX_INTR_MASK)); Cy_SCB_ClearTxInterrupt(base, clearMask); } /******************************************************************************* * Function Name: Cy_SCB_UART_GetNumInTxFifo ****************************************************************************//** * * Returns the number of data elements in the UART TX FIFO. * * \param base * The pointer to the UART SCB instance. * * \return * The number of data elements in the TX FIFO. * The size of date element defined by the configured data width. * * \note * This number does not include any data currently in the TX shifter. * *******************************************************************************/ __STATIC_INLINE uint32_t Cy_SCB_UART_GetNumInTxFifo(CySCB_Type const *base) { return Cy_SCB_GetNumInTxFifo(base); } /******************************************************************************* * Function Name: Cy_SCB_UART_IsTxComplete ****************************************************************************//** * * Checks whether the TX FIFO and Shifter are empty and there is no more data to send * * \param base * Pointer to the UART SCB instance. * * \return * If true, transmission complete. If false, transmission is not complete. * *******************************************************************************/ __STATIC_INLINE bool Cy_SCB_UART_IsTxComplete(CySCB_Type const *base) { return Cy_SCB_IsTxComplete(base); } /******************************************************************************* * Function Name: Cy_SCB_UART_ClearTxFifo ****************************************************************************//** * * Clears all data out of the UART TX FIFO. * * \param base * The pointer to the UART SCB instance. * * \sideeffect * The TX FIFO clear operation also clears the shift register, so that * the shifter could be cleared in the middle of a data element transfer, * corrupting it. The data element corruption means that all bits that have * not been transmitted are transmitted as 1s on the bus. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_ClearTxFifo(CySCB_Type *base) { Cy_SCB_ClearTxFifo(base); } /** \} group_scb_uart_low_level_functions */ /** * \addtogroup group_scb_uart_interrupt_functions * \{ */ /******************************************************************************* * Function Name: Cy_SCB_UART_RegisterCallback ****************************************************************************//** * * Registers a callback function that notifies that * \ref group_scb_uart_macros_callback_events occurred in the * \ref Cy_SCB_UART_Interrupt. * * \param base * The pointer to the UART SCB instance. * * \param callback * The pointer to the callback function. * See \ref cy_cb_scb_uart_handle_events_t for the function prototype. * * \param context * The pointer to the context structure \ref cy_stc_scb_uart_context_t allocated * by the user. The structure is used during the UART operation for internal * configuration and data retention. The user should not modify anything * in this structure. * * \note * To remove the callback, pass NULL as the pointer to the callback function. * *******************************************************************************/ __STATIC_INLINE void Cy_SCB_UART_RegisterCallback(CySCB_Type const *base, cy_cb_scb_uart_handle_events_t callback, cy_stc_scb_uart_context_t *context) { /* Suppress a compiler warning about unused variables */ (void) base; context->cbEvents = callback; } /** \} group_scb_uart_interrupt_functions */ #if defined(__cplusplus) } #endif /** \} group_scb_uart */ #endif /* (defined (CY_IP_MXSCB) || defined (CY_IP_MXS22SCB)) */ #endif /* (CY_SCB_UART_H) */ /* [] END OF FILE */