//########################################################################### // // FILE: spi.h // // TITLE: C28x SPI driver. // //########################################################################### // $Copyright: // Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the // distribution. // // Neither the name of Texas Instruments Incorporated nor the names of // its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // $ //########################################################################### #ifndef SPI_H #define SPI_H //***************************************************************************** // // If building with a C++ compiler, make all of the definitions in this header // have a C binding. // //***************************************************************************** #ifdef __cplusplus extern "C" { #endif //***************************************************************************** // //! \addtogroup spi_api SPI //! \brief This module is used for SPI configurations. //! @{ // //***************************************************************************** #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_spi.h" #include "debug.h" #include "hw_reg_inclusive_terminology.h" #ifndef DOXYGEN_PDF_IGNORE //***************************************************************************** // // Values that can be passed to SPI_enableInterrupt(), SPI_disableInterrupt(), // and SPI_clearInterruptStatus() as the intFlags parameter, and returned by // SPI_getInterruptStatus(). // //***************************************************************************** #define SPI_INT_RX_OVERRUN 0x0001U //!< Receive overrun interrupt #define SPI_INT_RX_DATA_TX_EMPTY 0x0002U //!< Data received, transmit empty #define SPI_INT_RXFF 0x0004U //!< RX FIFO level interrupt #define SPI_INT_TXFF 0x0008U //!< TX FIFO level interrupt #define SPI_INT_RXFF_OVERFLOW 0x0010U //!< RX FIFO overflow #endif //***************************************************************************** // //! This macro definition is used to transmit a byte of data //! //! \param base specifies the SPI module base address. //! \param txData is the data to be transmitted over SPI //! //! This macro definition is to transmit a byte of data. //! This macro uses SPI_pollingNonFIFOTransaction function //! SPI character length is hardcoded to 8 (1 byte = 8 bits)of character length //! //! \return None. // //***************************************************************************** #define SPI_transmitByte(base, txData) \ SPI_pollingNonFIFOTransaction(base, 8U, txData) //***************************************************************************** // //! This macro definition is used to transmit a 16-bit word of data //! //! \param base specifies the SPI module base address. //! \param txData is the data to be transmitted over SPI //! //! This macro definition is to transmit a 16-bit word of data. //! This macro uses SPI_pollingNonFIFOTransaction function //! SPI character length is hardcoded to 16 (16bit word) of character length //! //! \return None. // //***************************************************************************** #define SPI_transmit16Bits(base, txData) \ SPI_pollingNonFIFOTransaction(base, 16U, txData) //***************************************************************************** // //! This macro definition can be used to transmit 'N' bytes of data //! //! \param base specifies the SPI module base address. //! \param txBuffer is the transmit buffer to be transmitted over SPI //! \param numOfWords is the number of bytes to be transmitted //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This macro definition can be used to transmit 'N' bytes of data. //! This macro definition uses SPI_pollingFIFOTransaction function. //! //! SPI character length is hardcoded to 8 (8bits) of character length //! //! \return None. // //***************************************************************************** #define SPI_transmitNBytes(base, txBuffer, numOfWords, txDelay) \ SPI_pollingFIFOTransaction(base, 8U, txBuffer, NULL, numOfWords, txDelay) //***************************************************************************** // //! This macro definition can be used to transmit 'N' 16-bit words of data //! //! \param base specifies the SPI module base address. //! \param txBuffer is the transmit buffer to be transmitted over SPI //! \param numOfWords is the number of 16-bit word to be transmitted //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This function can be used to transmit 'N' 16-bit words of data. //! This function uses SPI_pollingFIFOTransaction function. //! SPI character length is hardcoded to 16 (16-bit word) //! //! \return None. // //***************************************************************************** #define SPI_transmitN16BitWord(base, txBuffer, numOfWords, txDelay) \ SPI_pollingFIFOTransaction(base, 16U, txBuffer, NULL, numOfWords, txDelay) //***************************************************************************** // //! This macro definition can be used to transmit 'N' with configurable //! SPI character length //! //! \param base specifies the SPI module base address //! \param charLength specifies the SPI character length //! \param txBuffer is the transmit buffer to be transmitted over SPI //! \param numOfWords is the number of 16-bit word to be transmitted //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This macro definition can be used to transmit 'N' with configurable //! SPI character length. //! //! This macro uses SPIpolling_FIFO_Transaction function. //! SPI character length is configurable using charLength variable. //! //! \return None. // //***************************************************************************** #define SPI_transmitNWordsWithCharLength(base, charLength, txBuffer, \ numOfWords, txDelay) \ SPI_pollingFIFOTransaction(base, charLength, txBuffer, NULL, \ numOfWords, txDelay) //***************************************************************************** // //! This macro definition is used to receive a byte of data //! //! \param base specifies the SPI module base address. //! \param dummyData is the data which is transmitted to initiate //! SPI transaction to receive SPI data //! //! This macro definition is to receive a byte of data. //! This macro uses SPI_pollingNonFIFOTransaction function //! SPI character length is hardcoded to 8 (1byte = 8bits) of character length //! //! \return the received byte. // //***************************************************************************** #define SPI_receiveByte(base, dummyData) \ SPI_pollingNonFIFOTransaction(base, 8U, dummyData) //***************************************************************************** // //! This macro is used to receive 'N' bytes of data //! //! \param base specifies the SPI module base address. //! \param rxBuffer specifies receive buffer which will store the received bytes //! \param numOfWords specifies the number of bytes to be received //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This function is used to receive 'N' bytes of data //! This function uses SPIpolling_FIFO_Transaction function. //! SPI character length is hardcoded to 8 (1 byte = 8 bits) //! //! \return None. // //***************************************************************************** #define SPI_receiveNBytes(base, rxBuffer, numOfWords, txDelay) \ SPI_pollingFIFOTransaction(base, 8U, NULL, rxBuffer, numOfWords, txDelay) //***************************************************************************** // //! This macro is used to receive 'N' 16-bits words of data //! //! \param base specifies the SPI module base address. //! \param rxBuffer specifies receive buffer which will store the received bytes //! \param numOfWords specifies the number of 16-bit words to be received //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This function is used to receive 'N' 16-bit words of data //! This function uses SPIpolling_FIFO_Transaction function. //! SPI character length is hardcoded to 16bits //! //! \return None. // //***************************************************************************** #define SPI_receiveN16BitWord(base, rxBuffer, numOfWords, txDelay) \ SPI_pollingFIFOTransaction(base, 16U, NULL, rxBuffer, numOfWords, txDelay) //***************************************************************************** // //! This macro is used to receive 'N' words with specified character length //! //! \param base specifies the SPI module base address. //! \param charLength specifies the SPI character length of SPI transaction //! \param rxBuffer specifies receive buffer which will store the received bytes //! \param numOfWords specifies the number of words with specified character //! length //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This function is used to receive 'N' words with specified character length //! This function uses SPIpolling_FIFO_Transaction function. //! SPI character length is configurable using charLength variable //! //! \return None. // //***************************************************************************** #define SPI_receiveNWordsWithcharLength(base, charLength, rxBuffer, \ numOfWords, txDelay) \ SPI_pollingFIFOTransaction(base, charLength, NULL, rxBuffer, \ numOfWords, txDelay) //***************************************************************************** // //! Values that can be passed to SPI_setConfig() as the \e protocol parameter. // //***************************************************************************** typedef enum { //! Mode 0. Polarity 0, phase 0. Rising edge without delay. SPI_PROT_POL0PHA0 = 0x0000U, //! Mode 1. Polarity 0, phase 1. Rising edge with delay. SPI_PROT_POL0PHA1 = 0x0002U, //! Mode 2. Polarity 1, phase 0. Falling edge without delay. SPI_PROT_POL1PHA0 = 0x0001U, //! Mode 3. Polarity 1, phase 1. Falling edge with delay. SPI_PROT_POL1PHA1 = 0x0003U } SPI_TransferProtocol; //***************************************************************************** // //! Values that can be passed to SPI_setConfig() as the \e mode parameter. // //***************************************************************************** typedef enum { SPI_MODE_PERIPHERAL = 0x0002U, //!< SPI peripheral SPI_MODE_CONTROLLER = 0x0006U, //!< SPI controller SPI_MODE_PERIPHERAL_OD = 0x0000U, //!< SPI peripheral w/ output disabled SPI_MODE_CONTROLLER_OD = 0x0004U //!< SPI controller w/ output disabled } SPI_Mode; //***************************************************************************** // //! Values that can be passed to SPI_setFIFOInterruptLevel() as the \e txLevel //! parameter, returned by SPI_getFIFOInterruptLevel() in the \e txLevel //! parameter, and returned by SPI_getTxFIFOStatus(). // //***************************************************************************** typedef enum { SPI_FIFO_TXEMPTY = 0x0000U, //!< Transmit FIFO empty SPI_FIFO_TX0 = 0x0000U, //!< Transmit FIFO empty SPI_FIFO_TX1 = 0x0001U, //!< Transmit FIFO 1/16 full SPI_FIFO_TX2 = 0x0002U, //!< Transmit FIFO 2/16 full SPI_FIFO_TX3 = 0x0003U, //!< Transmit FIFO 3/16 full SPI_FIFO_TX4 = 0x0004U, //!< Transmit FIFO 4/16 full SPI_FIFO_TX5 = 0x0005U, //!< Transmit FIFO 5/16 full SPI_FIFO_TX6 = 0x0006U, //!< Transmit FIFO 6/16 full SPI_FIFO_TX7 = 0x0007U, //!< Transmit FIFO 7/16 full SPI_FIFO_TX8 = 0x0008U, //!< Transmit FIFO 8/16 full SPI_FIFO_TX9 = 0x0009U, //!< Transmit FIFO 9/16 full SPI_FIFO_TX10 = 0x000AU, //!< Transmit FIFO 10/16 full SPI_FIFO_TX11 = 0x000BU, //!< Transmit FIFO 11/16 full SPI_FIFO_TX12 = 0x000CU, //!< Transmit FIFO 12/16 full SPI_FIFO_TX13 = 0x000DU, //!< Transmit FIFO 13/16 full SPI_FIFO_TX14 = 0x000EU, //!< Transmit FIFO 14/16 full SPI_FIFO_TX15 = 0x000FU, //!< Transmit FIFO 15/16 full SPI_FIFO_TX16 = 0x0010U, //!< Transmit FIFO full SPI_FIFO_TXFULL = 0x0010U //!< Transmit FIFO full } SPI_TxFIFOLevel; //***************************************************************************** // //! Values that can be passed to SPI_setFIFOInterruptLevel() as the \e rxLevel //! parameter, returned by SPI_getFIFOInterruptLevel() in the \e rxLevel //! parameter, and returned by SPI_getRxFIFOStatus(). // //***************************************************************************** typedef enum { SPI_FIFO_RXEMPTY = 0x0000U, //!< Receive FIFO empty SPI_FIFO_RX0 = 0x0000U, //!< Receive FIFO empty SPI_FIFO_RX1 = 0x0001U, //!< Receive FIFO 1/16 full SPI_FIFO_RX2 = 0x0002U, //!< Receive FIFO 2/16 full SPI_FIFO_RX3 = 0x0003U, //!< Receive FIFO 3/16 full SPI_FIFO_RX4 = 0x0004U, //!< Receive FIFO 4/16 full SPI_FIFO_RX5 = 0x0005U, //!< Receive FIFO 5/16 full SPI_FIFO_RX6 = 0x0006U, //!< Receive FIFO 6/16 full SPI_FIFO_RX7 = 0x0007U, //!< Receive FIFO 7/16 full SPI_FIFO_RX8 = 0x0008U, //!< Receive FIFO 8/16 full SPI_FIFO_RX9 = 0x0009U, //!< Receive FIFO 9/16 full SPI_FIFO_RX10 = 0x000AU, //!< Receive FIFO 10/16 full SPI_FIFO_RX11 = 0x000BU, //!< Receive FIFO 11/16 full SPI_FIFO_RX12 = 0x000CU, //!< Receive FIFO 12/16 full SPI_FIFO_RX13 = 0x000DU, //!< Receive FIFO 13/16 full SPI_FIFO_RX14 = 0x000EU, //!< Receive FIFO 14/16 full SPI_FIFO_RX15 = 0x000FU, //!< Receive FIFO 15/16 full SPI_FIFO_RX16 = 0x0010U, //!< Receive FIFO full SPI_FIFO_RXFULL = 0x0010U, //!< Receive FIFO full SPI_FIFO_RXDEFAULT = 0x001FU //!< To prevent interrupt at reset } SPI_RxFIFOLevel; //***************************************************************************** // //! Values that can be passed to SPI_setEmulationMode() as the \e mode //! parameter. // //***************************************************************************** typedef enum { //! Transmission stops after midway in the bit stream SPI_EMULATION_STOP_MIDWAY = 0x0000U, //! Continue SPI operation regardless SPI_EMULATION_FREE_RUN = 0x0010U, //! Transmission will stop after a started transmission completes SPI_EMULATION_STOP_AFTER_TRANSMIT = 0x0020U } SPI_EmulationMode; //***************************************************************************** // //! Values that can be passed to SPI_setPTESignalPolarity() as the \e polarity //! parameter. // //***************************************************************************** typedef enum { SPI_PTE_ACTIVE_LOW = 0x0000U, //!< SPIPTE is active low (normal) SPI_PTE_ACTIVE_HIGH = SPI_PRI_PTEINV //!< SPIPTE is active high (inverted) } SPI_PTEPolarity; //***************************************************************************** // //! Values that can be passed to SPI_receive16Bits(), SPI_receive24Bits(), //! SPI_receive32Bits() // //***************************************************************************** typedef enum { SPI_DATA_LITTLE_ENDIAN = 0U, //!< LITTLE ENDIAN SPI_DATA_BIG_ENDIAN = 1U, //!< BIG ENDIAN } SPI_endianess; //***************************************************************************** // // Prototypes for the APIs. // //***************************************************************************** //***************************************************************************** // //! \internal //! Checks an SPI base address. //! //! \param base specifies the SPI module base address. //! //! This function determines if a SPI module base address is valid. //! //! \return Returns \b true if the base address is valid and \b false //! otherwise. // //***************************************************************************** #ifdef DEBUG static inline bool SPI_isBaseValid(uint32_t base) { return( (base == SPIA_BASE) || (base == SPIB_BASE) || (base == SPIC_BASE) ); } #endif //***************************************************************************** // //! Enables the serial peripheral interface. //! //! \param base specifies the SPI module base address. //! //! This function enables operation of the serial peripheral interface. The //! serial peripheral interface must be configured before it is enabled. //! //! \return None. // //***************************************************************************** static inline void SPI_enableModule(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); HWREGH(base + SPI_O_CCR) |= SPI_CCR_SPISWRESET; } //***************************************************************************** // //! Disables the serial peripheral interface. //! //! \param base specifies the SPI module base address. //! //! This function disables operation of the serial peripheral interface. Call //! this function before doing any configuration. //! //! \return None. // //***************************************************************************** static inline void SPI_disableModule(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); HWREGH(base + SPI_O_CCR) &= ~(SPI_CCR_SPISWRESET); } //***************************************************************************** // //! Sets the character length of SPI transaction //! //! \param base specifies the SPI module base address. //! \param charLength specifies the character length of SPI transaction //! //! This function configures the character length of SPI transaction. //! SPI character length can be from anywhere between 1-bit word to 16 bit word //! of character length //! //! \return None. // //***************************************************************************** static inline void SPI_setcharLength(uint32_t base, uint16_t charLength) { ASSERT((charLength >= 1U) && (charLength <= 16U)); SPI_disableModule(base); HWREGH(base + SPI_O_CCR) = (HWREGH(base + SPI_O_CCR) & ~SPI_CCR_SPICHAR_M) | (charLength - 1U); SPI_enableModule(base); } //***************************************************************************** // //! Enables the transmit and receive FIFOs. //! //! \param base is the base address of the SPI port. //! //! This functions enables the transmit and receive FIFOs in the SPI. //! //! \return None. // //***************************************************************************** static inline void SPI_enableFIFO(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Enable the FIFO. // HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_SPIFFENA | SPI_FFTX_TXFIFO; HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFIFORESET; } //***************************************************************************** // //! Disables the transmit and receive FIFOs. //! //! \param base is the base address of the SPI port. //! //! This functions disables the transmit and receive FIFOs in the SPI. //! //! \return None. // //***************************************************************************** static inline void SPI_disableFIFO(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Disable the FIFO. // HWREGH(base + SPI_O_FFTX) &= ~(SPI_FFTX_SPIFFENA | SPI_FFTX_TXFIFO); HWREGH(base + SPI_O_FFRX) &= ~SPI_FFRX_RXFIFORESET; } //***************************************************************************** // //! Resets the transmit FIFO. //! //! \param base is the base address of the SPI port. //! //! This function resets the transmit FIFO, setting the FIFO pointer back to //! zero. //! //! \return None. // //***************************************************************************** static inline void SPI_resetTxFIFO(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Reset the TX FIFO. // HWREGH(base + SPI_O_FFTX) &= ~SPI_FFTX_TXFIFO; HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_TXFIFO; } //***************************************************************************** // //! Resets the receive FIFO. //! //! \param base is the base address of the SPI port. //! //! This function resets the receive FIFO, setting the FIFO pointer back to //! zero. //! //! \return None. // //***************************************************************************** static inline void SPI_resetRxFIFO(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Reset the RX FIFO. // HWREGH(base + SPI_O_FFRX) &= ~SPI_FFRX_RXFIFORESET; HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFIFORESET; } //***************************************************************************** // //! Sets the FIFO level at which interrupts are generated. //! //! \param base is the base address of the SPI port. //! \param txLevel is the transmit FIFO interrupt level, specified as //! \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, \b SPI_FIFO_TX2, . . . or //! \b SPI_FIFO_TX16. //! \param rxLevel is the receive FIFO interrupt level, specified as //! \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, \b SPI_FIFO_RX2, . . . or //! \b SPI_FIFO_RX16. //! //! This function sets the FIFO level at which transmit and receive interrupts //! are generated. //! //! \return None. // //***************************************************************************** static inline void SPI_setFIFOInterruptLevel(uint32_t base, SPI_TxFIFOLevel txLevel, SPI_RxFIFOLevel rxLevel) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Set the FIFO interrupt levels. // HWREGH(base + SPI_O_FFTX) = (HWREGH(base + SPI_O_FFTX) & (~SPI_FFTX_TXFFIL_M)) | (uint16_t)txLevel; HWREGH(base + SPI_O_FFRX) = (HWREGH(base + SPI_O_FFRX) & (~SPI_FFRX_RXFFIL_M)) | (uint16_t)rxLevel; } //***************************************************************************** // //! Gets the FIFO level at which interrupts are generated. //! //! \param base is the base address of the SPI port. //! \param txLevel is a pointer to storage for the transmit FIFO level, //! returned as one of \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, //! \b SPI_FIFO_TX2, . . . or \b SPI_FIFO_TX16. //! \param rxLevel is a pointer to storage for the receive FIFO level, //! returned as one of \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, //! \b SPI_FIFO_RX2, . . . or \b SPI_FIFO_RX16. //! //! This function gets the FIFO level at which transmit and receive interrupts //! are generated. //! //! \return None. // //***************************************************************************** static inline void SPI_getFIFOInterruptLevel(uint32_t base, SPI_TxFIFOLevel *txLevel, SPI_RxFIFOLevel *rxLevel) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Extract the transmit and receive FIFO levels. // *txLevel = (SPI_TxFIFOLevel)(HWREGH(base + SPI_O_FFTX) & SPI_FFTX_TXFFIL_M); *rxLevel = (SPI_RxFIFOLevel)(HWREGH(base + SPI_O_FFRX) & SPI_FFRX_RXFFIL_M); } //***************************************************************************** // //! Get the transmit FIFO status //! //! \param base is the base address of the SPI port. //! //! This function gets the current number of words in the transmit FIFO. //! //! \return Returns the current number of words in the transmit FIFO specified //! as one of the following: //! \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, \b SPI_FIFO_TX2, \b SPI_FIFO_TX3, //! ..., or \b SPI_FIFO_TX16 // //***************************************************************************** static inline SPI_TxFIFOLevel SPI_getTxFIFOStatus(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Get the current FIFO status // return((SPI_TxFIFOLevel)((HWREGH(base + SPI_O_FFTX) & SPI_FFTX_TXFFST_M) >> SPI_FFTX_TXFFST_S)); } //***************************************************************************** // //! Get the receive FIFO status //! //! \param base is the base address of the SPI port. //! //! This function gets the current number of words in the receive FIFO. //! //! \return Returns the current number of words in the receive FIFO specified //! as one of the following: //! \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, \b SPI_FIFO_RX2, \b SPI_FIFO_RX3, //! ..., or \b SPI_FIFO_RX16 // //***************************************************************************** static inline SPI_RxFIFOLevel SPI_getRxFIFOStatus(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Get the current FIFO status // return((SPI_RxFIFOLevel)((HWREGH(base + SPI_O_FFRX) & SPI_FFRX_RXFFST_M) >> SPI_FFRX_RXFFST_S)); } //***************************************************************************** // //! Determines whether the SPI transmitter is busy or not. //! //! \param base is the base address of the SPI port. //! //! This function allows the caller to determine whether all transmitted bytes //! have cleared the transmitter hardware. If \b false is returned, then the //! transmit FIFO is empty and all bits of the last transmitted word have left //! the hardware shift register. This function is only valid when operating in //! FIFO mode. //! //! \return Returns \b true if the SPI is transmitting or \b false if all //! transmissions are complete. // //***************************************************************************** static inline bool SPI_isBusy(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Determine if the SPI is busy. // return((HWREGH(base + SPI_O_FFTX) & SPI_FFTX_TXFFST_M) != 0U); } //***************************************************************************** // //! Puts a data element into the SPI transmit buffer. //! //! \param base specifies the SPI module base address. //! \param data is the left-justified data to be transmitted over SPI. //! //! This function places the supplied data into the transmit buffer of the //! specified SPI module. //! //! \note The data being sent must be left-justified in \e data. The lower //! 16 - N bits will be discarded where N is the data width selected in //! SPI_setConfig(). For example, if configured for a 6-bit data width, the //! lower 10 bits of data will be discarded. //! //! \return None. // //***************************************************************************** static inline void SPI_writeDataNonBlocking(uint32_t base, uint16_t data) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Write data to the transmit buffer. // HWREGH(base + SPI_O_TXBUF) = data; } //***************************************************************************** // //! Gets a data element from the SPI receive buffer. //! //! \param base specifies the SPI module base address. //! //! This function gets received data from the receive buffer of the specified //! SPI module and returns it. //! //! \note Only the lower N bits of the value written to \e data contain valid //! data, where N is the data width as configured by SPI_setConfig(). For //! example, if the interface is configured for 8-bit data width, only the //! lower 8 bits of the value written to \e data contain valid data. //! //! \return Returns the word of data read from the SPI receive buffer. // //***************************************************************************** static inline uint16_t SPI_readDataNonBlocking(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Check for data to read. // return(HWREGH(base + SPI_O_RXBUF)); } //***************************************************************************** // //! Waits for space in the FIFO and then puts data into the transmit buffer. //! //! \param base specifies the SPI module base address. //! \param data is the left-justified data to be transmitted over SPI. //! //! This function places the supplied data into the transmit buffer of the //! specified SPI module once space is available in the transmit FIFO. This //! function should only be used when the FIFO is enabled. //! //! \note The data being sent must be left-justified in \e data. The lower //! 16 - N bits will be discarded where N is the data width selected in //! SPI_setConfig(). For example, if configured for a 6-bit data width, the //! lower 10 bits of data will be discarded. //! //! \return None. // //***************************************************************************** static inline void SPI_writeDataBlockingFIFO(uint32_t base, uint16_t data) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Wait until space is available in the receive FIFO. // while(SPI_getTxFIFOStatus(base) == SPI_FIFO_TXFULL) { } // // Write data to the transmit buffer. // HWREGH(base + SPI_O_TXBUF) = data; } //***************************************************************************** // //! Waits for data in the FIFO and then reads it from the receive buffer. //! //! \param base specifies the SPI module base address. //! //! This function waits until there is data in the receive FIFO and then reads //! received data from the receive buffer. This function should only be used //! when FIFO mode is enabled. //! //! \note Only the lower N bits of the value written to \e data contain valid //! data, where N is the data width as configured by SPI_setConfig(). For //! example, if the interface is configured for 8-bit data width, only the //! lower 8 bits of the value written to \e data contain valid data. //! //! \return Returns the word of data read from the SPI receive buffer. // //***************************************************************************** static inline uint16_t SPI_readDataBlockingFIFO(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Wait until data is available in the receive FIFO. // while(SPI_getRxFIFOStatus(base) == SPI_FIFO_RXEMPTY) { } // // Check for data to read. // return(HWREGH(base + SPI_O_RXBUF)); } //***************************************************************************** // //! Waits for the transmit buffer to empty and then writes data to it. //! //! \param base specifies the SPI module base address. //! \param data is the left-justified data to be transmitted over SPI. //! //! This function places the supplied data into the transmit buffer of the //! specified SPI module once it is empty. This function should not be used //! when FIFO mode is enabled. //! //! \note The data being sent must be left-justified in \e data. The lower //! 16 - N bits will be discarded where N is the data width selected in //! SPI_setConfig(). For example, if configured for a 6-bit data width, the //! lower 10 bits of data will be discarded. //! //! \return None. // //***************************************************************************** static inline void SPI_writeDataBlockingNonFIFO(uint32_t base, uint16_t data) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Wait until the transmit buffer is not full. // while((HWREGH(base + SPI_O_STS) & SPI_STS_BUFFULL_FLAG) != 0U) { } // // Write data to the transmit buffer. // HWREGH(base + SPI_O_TXBUF) = data; } //***************************************************************************** // //! Waits for data to be received and then reads it from the buffer. //! //! \param base specifies the SPI module base address. //! //! This function waits for data to be received and then reads it from the //! receive buffer of the specified SPI module. This function should not be //! used when FIFO mode is enabled. //! //! \note Only the lower N bits of the value written to \e data contain valid //! data, where N is the data width as configured by SPI_setConfig(). For //! example, if the interface is configured for 8-bit data width, only the //! lower 8 bits of the value written to \e data contain valid data. //! //! \return Returns the word of data read from the SPI receive buffer. // //***************************************************************************** static inline uint16_t SPI_readDataBlockingNonFIFO(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Wait until data has been received. // while((HWREGH(base + SPI_O_STS) & SPI_STS_INT_FLAG) == 0U) { } // // Check for data to read. // return(HWREGH(base + SPI_O_RXBUF)); } //***************************************************************************** // //! Enables SPI 3-wire mode. //! //! \param base is the base address of the SPI port. //! //! This function enables 3-wire mode. When in controller mode, this allows //! SPIPICO to become SPICOCI and SPIPOCI to become free for non-SPI use. //! When in peripheral mode, SPIPOCI because the SPIPIPO pin and SPIPICO is //! free for non-SPI use. //! //! \return None. // //***************************************************************************** static inline void SPI_enableTriWire(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Set the tri-wire bit to enable 3-wire mode. // HWREGH(base + SPI_O_PRI) |= SPI_PRI_TRIWIRE; } //***************************************************************************** // //! Disables SPI 3-wire mode. //! //! \param base is the base address of the SPI port. //! //! This function disables 3-wire mode. SPI will operate in normal 4-wire mode. //! //! \return None. // //***************************************************************************** static inline void SPI_disableTriWire(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Clear the tri-wire bit to disable 3-wire mode. // HWREGH(base + SPI_O_PRI) &= ~SPI_PRI_TRIWIRE; } //***************************************************************************** // //! Enables SPI loopback mode. //! //! \param base is the base address of the SPI port. //! //! This function enables loopback mode. This mode is only valid during //! controller mode and is helpful during device testing as it internally //! connects PICO and POCI. //! //! \return None. // //***************************************************************************** static inline void SPI_enableLoopback(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Set the bit that enables loopback mode. // HWREGH(base + SPI_O_CCR) |= SPI_CCR_SPILBK; } //***************************************************************************** // //! Disables SPI loopback mode. //! //! \param base is the base address of the SPI port. //! //! This function disables loopback mode. Loopback mode is disabled by default //! after reset. //! //! \return None. // //***************************************************************************** static inline void SPI_disableLoopback(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Clear the bit that enables loopback mode. // HWREGH(base + SPI_O_CCR) &= ~SPI_CCR_SPILBK; } //***************************************************************************** // //! Set the peripheral select (SPIPTE) signal polarity. //! //! \param base is the base address of the SPI port. //! \param polarity is the SPIPTE signal polarity. //! //! This function sets the polarity of the peripheral select (SPIPTE) signal. //! The two modes to choose from for the \e polarity parameter are //! \b SPI_PTE_ACTIVE_LOW for active-low polarity (typical) and //! \b SPI_PTE_ACTIVE_HIGH for active-high polarity (considered inverted). //! //! \note This has no effect on the PTE signal when in controller mode. It is //! only applicable to peripheral mode. //! //! \return None. // //***************************************************************************** static inline void SPI_setPTESignalPolarity(uint32_t base, SPI_PTEPolarity polarity) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Write the polarity of the SPIPTE signal to the register. // HWREGH(base + SPI_O_PRI) = (HWREGH(base + SPI_O_PRI) & ~SPI_PRI_PTEINV) | (uint16_t)polarity; } //***************************************************************************** // //! Enables SPI high speed mode. //! //! \param base is the base address of the SPI port. //! //! This function enables high speed mode. //! //! \return None. // //***************************************************************************** static inline void SPI_enableHighSpeedMode(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Set the bit that enables high speed mode. // HWREGH(base + SPI_O_CCR) |= SPI_CCR_HS_MODE; } //***************************************************************************** // //! Disables SPI high speed mode. //! //! \param base is the base address of the SPI port. //! //! This function disables high speed mode. High speed mode is disabled by //! default after reset. //! //! \return None. // //***************************************************************************** static inline void SPI_disableHighSpeedMode(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Clear the bit that enables high speed mode. // HWREGH(base + SPI_O_CCR) &= ~SPI_CCR_HS_MODE; } //***************************************************************************** // //! Sets SPI emulation mode. //! //! \param base is the base address of the SPI port. //! \param mode is the emulation mode. //! //! This function sets the behavior of the SPI operation when an emulation //! suspend occurs. The \e mode parameter can be one of the following: //! //! - \b SPI_EMULATION_STOP_MIDWAY - Transmission stops midway through the bit //! stream. The rest of the bits will be transmitting after the suspend is //! deasserted. //! - \b SPI_EMULATION_STOP_AFTER_TRANSMIT - If the suspend occurs before the //! first SPICLK pulse, the transmission will not start. If it occurs later, //! the transmission will be completed. //! - \b SPI_EMULATION_FREE_RUN - SPI operation continues regardless of a //! the suspend. //! //! \return None. // //***************************************************************************** static inline void SPI_setEmulationMode(uint32_t base, SPI_EmulationMode mode) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Write the desired emulation mode to the register. // HWREGH(base + SPI_O_PRI) = (HWREGH(base + SPI_O_PRI) & ~(SPI_PRI_FREE | SPI_PRI_SOFT)) | (uint16_t)mode; } //***************************************************************************** // //! Configures the FIFO Transmit Delay //! //! \param base is the base address of the SPI port. //! \param delay Tx FIFO delay to be configured in cycles (0..0xFF) //! //! This function sets the delay between every transfer from FIFO //! transmit buffer to transmit shift register. The delay is defined in //! number SPI serial clock cycles. //! //! \return None // //***************************************************************************** static inline void SPI_setTxFifoTransmitDelay(uint32_t base, uint16_t delay) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); ASSERT(delay <= 0xFFU); // // Configure the FIFO Transmit Delay Bits // HWREGH(base + SPI_O_FFCT) = delay; } //***************************************************************************** // //! Returns the Emulation Buffer Received Data //! //! \param base is the base address of the SPI port. //! //! This function returns the Emulation Buffer Received Data //! //! \return Rx emulation buffer data // //***************************************************************************** static inline uint16_t SPI_readRxEmulationBuffer(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Return Emulation Buffer Received Data // return(HWREGH(base + SPI_O_RXEMU)); } //***************************************************************************** // //! Enable Trasnmit //! //! \param base is the base address of the SPI port. //! //! This function sets the TALK bit enabling the data trasnmission. //! This bit is enabled by SPI_setConfig if the parameter \r mode is selected as //! SPI_MODE_PERIPHERAL or SPI_MODE_CONTROLLER. //! //! \return None // //***************************************************************************** static inline void SPI_enableTalk(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Set the TALK bit // HWREGH(base + SPI_O_CTL) |= SPI_CTL_TALK; } //***************************************************************************** // //! Disable Trasnmit //! //! \param base is the base address of the SPI port. //! //! This function clears the TALK bit disabling the data trasnmission. The //! output pin will be put in high-impedance state. //! This bit is enabled by SPI_setConfig if the parameter \r mode is selected as //! SPI_MODE_PERIPHERAL or SPI_MODE_CONTROLLER. //! //! \return None // //***************************************************************************** static inline void SPI_disableTalk(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Set the TALK bit // HWREGH(base + SPI_O_CTL) &= ~SPI_CTL_TALK; } //***************************************************************************** // //! Reset SPI transmit and receive channels //! //! \param base is the base address of the SPI port. //! //! This function resets the SPI transmit and receive channels. //! //! \return None // //***************************************************************************** static inline void SPI_reset(uint32_t base) { // // Check the arguments. // ASSERT(SPI_isBaseValid(base)); // // Write to SPRST bit the TX FIFO. // HWREGH(base + SPI_O_FFTX) &= ~SPI_FFTX_SPIRST; HWREGH(base + SPI_O_FFTX) |= SPI_FFTX_SPIRST; } //***************************************************************************** // //! Configures the serial peripheral interface. //! //! \param base specifies the SPI module base address. //! \param lspclkHz is the rate of the clock supplied to the SPI module //! (LSPCLK) in Hz. //! \param protocol specifies the data transfer protocol. //! \param mode specifies the mode of operation. //! \param bitRate specifies the clock rate in Hz. //! \param dataWidth specifies number of bits transferred per frame. //! //! This function configures the serial peripheral interface. It sets the SPI //! protocol, mode of operation, bit rate, and data width. //! //! The \e protocol parameter defines the data frame format. The \e protocol //! parameter can be one of the following values: \b SPI_PROT_POL0PHA0, //! \b SPI_PROT_POL0PHA1, \b SPI_PROT_POL1PHA0, or //! \b SPI_PROT_POL1PHA1. These frame formats encode the following polarity //! and phase configurations: //! //!
//! Polarity Phase       Mode
//!   0       0   SPI_PROT_POL0PHA0
//!   0       1   SPI_PROT_POL0PHA1
//!   1       0   SPI_PROT_POL1PHA0
//!   1       1   SPI_PROT_POL1PHA1
//! 
//! //! The \e mode parameter defines the operating mode of the SPI module. The //! SPI module can operate as a controller or peripheral; the SPI can also be be //! configured to disable output on its serial output line. The \e mode //! parameter can be one of the following values: \b SPI_MODE_CONTROLLER, //! \b SPI_MODE_PERIPHERAL, \b SPI_MODE_CONTROLLER_OD or //! \b SPI_MODE_PERIPHERAL_OD ("OD" indicates "output disabled"). //! //! The \e bitRate parameter defines the bit rate for the SPI. This bit rate //! must satisfy the following clock ratio criteria: //! //! - \e bitRate can be no greater than lspclkHz divided by 4. //! - \e lspclkHz / \e bitRate cannot be greater than 128. //! //! The \e dataWidth parameter defines the width of the data transfers and //! can be a value between 1 and 16, inclusive. //! //! The peripheral clock is the low speed peripheral clock. This value is //! returned by SysCtl_getLowSpeedClock(), or it can be explicitly hard coded //! if it is constant and known (to save the code/execution overhead of a call //! to SysCtl_getLowSpeedClock()). //! //! \note SPI operation should be disabled via SPI_disableModule() before any //! changes to its configuration. //! //! \return None. // //***************************************************************************** extern void SPI_setConfig(uint32_t base, uint32_t lspclkHz, SPI_TransferProtocol protocol, SPI_Mode mode, uint32_t bitRate, uint16_t dataWidth); //***************************************************************************** // //! Configures the baud rate of the serial peripheral interface. //! //! \param base specifies the SPI module base address. //! \param lspclkHz is the rate of the clock supplied to the SPI module //! (LSPCLK) in Hz. //! \param bitRate specifies the clock rate in Hz. //! //! This function configures the SPI baud rate. The \e bitRate parameter //! defines the bit rate for the SPI. This bit rate must satisfy the following //! clock ratio criteria: //! //! - \e bitRate can be no greater than \e lspclkHz divided by 4. //! - \e lspclkHz / \e bitRate cannot be greater than 128. //! //! The peripheral clock is the low speed peripheral clock. This value is //! returned by SysCtl_getLowSpeedClock(), or it can be explicitly hard coded //! if it is constant and known (to save the code/execution overhead of a call //! to SysCtl_getLowSpeedClock()). //! //! \note SPI_setConfig() also sets the baud rate. Use SPI_setBaudRate() //! if you wish to configure it separately from protocol and mode. //! //! \return None. // //***************************************************************************** extern void SPI_setBaudRate(uint32_t base, uint32_t lspclkHz, uint32_t bitRate); //***************************************************************************** // //! Enables individual SPI interrupt sources. //! //! \param base specifies the SPI module base address. //! \param intFlags is a bit mask of the interrupt sources to be enabled. //! //! This function enables the indicated SPI interrupt sources. Only the sources //! that are enabled can be reflected to the processor interrupt; disabled //! sources have no effect on the processor. The \e intFlags parameter can be //! any of the following values: //! - \b SPI_INT_RX_OVERRUN - Receive overrun interrupt //! - \b SPI_INT_RX_DATA_TX_EMPTY - Data received, transmit empty //! - \b SPI_INT_RXFF (also enables \b SPI_INT_RXFF_OVERFLOW) - RX FIFO level //! interrupt (and RX FIFO overflow) //! - \b SPI_INT_TXFF - TX FIFO level interrupt //! //! \note \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY, //! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with //! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT. //! //! \return None. // //***************************************************************************** extern void SPI_enableInterrupt(uint32_t base, uint32_t intFlags); //***************************************************************************** // //! Disables individual SPI interrupt sources. //! //! \param base specifies the SPI module base address. //! \param intFlags is a bit mask of the interrupt sources to be disabled. //! //! This function disables the indicated SPI interrupt sources. The //! \e intFlags parameter can be any of the following values: //! - \b SPI_INT_RX_OVERRUN //! - \b SPI_INT_RX_DATA_TX_EMPTY //! - \b SPI_INT_RXFF (also disables \b SPI_INT_RXFF_OVERFLOW) //! - \b SPI_INT_TXFF //! //! \note \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY, //! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with //! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT. //! //! \return None. // //***************************************************************************** extern void SPI_disableInterrupt(uint32_t base, uint32_t intFlags); //***************************************************************************** // //! Gets the current interrupt status. //! //! \param base specifies the SPI module base address. //! //! This function returns the interrupt status for the SPI module. //! //! \return The current interrupt status, enumerated as a bit field of the //! following values: //! - \b SPI_INT_RX_OVERRUN - Receive overrun interrupt //! - \b SPI_INT_RX_DATA_TX_EMPTY - Data received, transmit empty //! - \b SPI_INT_RXFF - RX FIFO level interrupt //! - \b SPI_INT_RXFF_OVERFLOW - RX FIFO overflow //! - \b SPI_INT_TXFF - TX FIFO level interrupt // //***************************************************************************** extern uint32_t SPI_getInterruptStatus(uint32_t base); //***************************************************************************** // //! Clears SPI interrupt sources. //! //! \param base specifies the SPI module base address. //! \param intFlags is a bit mask of the interrupt sources to be cleared. //! //! This function clears the specified SPI interrupt sources so that they no //! longer assert. This function must be called in the interrupt handler to //! keep the interrupts from being triggered again immediately upon exit. The //! \e intFlags parameter can consist of a bit field of the following values: //! - \b SPI_INT_RX_OVERRUN //! - \b SPI_INT_RX_DATA_TX_EMPTY //! - \b SPI_INT_RXFF //! - \b SPI_INT_RXFF_OVERFLOW //! - \b SPI_INT_TXFF //! //! \note \b SPI_INT_RX_DATA_TX_EMPTY is cleared by a read of the receive //! receive buffer, so it usually doesn't need to be cleared using this //! function. //! //! \note Also note that \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY, //! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with //! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT. //! //! \return None. // //***************************************************************************** extern void SPI_clearInterruptStatus(uint32_t base, uint32_t intFlags); //***************************************************************************** // //! This function can be used to transmit a 24-bit word of data //! //! \param base specifies the SPI module base address. //! \param txData is the data to be transmitted over SPI //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This function can be used to transmit a 24-bit word of data. //! 24-bit word data is divided into three bytes of data. //! //! This function uses SPI_pollingFIFOTransaction function. //! SPI character length is hardcoded to 8 (8bits) of character length //! //! \return None. // //***************************************************************************** extern void SPI_transmit24Bits(uint32_t base, uint32_t data, uint16_t txDelay); //***************************************************************************** // //! This function can be used to transmit a 32-bit word of data //! //! \param base specifies the SPI module base address. //! \param txData is the data to be transmitted over SPI //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This function can be used to transmit a 32-bit word of data. //! 32-bit word data is divided into four bytes of data. //! //! This function uses SPI_pollingFIFOTransaction function. //! SPI character length is hardcoded to 8 (8bits) of character length //! //! \return None. // //***************************************************************************** extern void SPI_transmit32Bits(uint32_t base, uint32_t data, uint16_t txDelay); //***************************************************************************** // //! This function is used to receive a 16-bit word of data //! //! \param base specifies the SPI module base address. //! \param endianness specifies the endianess of received data //! \param dummyData is the data which is transmitted to initiate //! SPI transaction to receive SPI data //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This function is used to receive a 16-bit word of data. //! This function uses SPIpolling_FIFO_Transaction function. //! SPI character length is hardcoded to 8 (1 byte = 8 bits)of character length //! //! \return the received 16-bit word. // //***************************************************************************** extern uint16_t SPI_receive16Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, uint16_t txDelay); //***************************************************************************** // //! This function is used to receive a 24-bit word of data //! //! \param base specifies the SPI module base address. //! \param endianness specifies the endianess of received data //! \param dummyData is the data which is transmitted to initiate //! SPI transaction to receive SPI data //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This function is used to receive a 24-bit word of data. //! This function uses SPIpolling_FIFO_Transaction function. //! SPI character length is hardcoded to 8 (1 byte = 8 bits)of character length //! //! \return the received 24-bit word. // //***************************************************************************** extern uint32_t SPI_receive24Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, uint16_t txDelay); //***************************************************************************** // //! This function is used to receive a 32-bit word of data //! //! \param base specifies the SPI module base address. //! \param endianness specifies the endianess of received data //! \param dummyData is the data which is transmitted to initiate //! SPI transaction to receive SPI data //! \param txDelay specifies the number of serial clock cycles delay time after //! completion of perious word //! //! This function is used to receive a 32-bit word of data. //! This function uses SPIpolling_FIFO_Transaction function. //! SPI character length is hardcoded to 8 (1 byte = 8 bits)of character length //! //! \return the received 32-bit word. // //***************************************************************************** extern uint32_t SPI_receive32Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData, uint16_t txDelay); //***************************************************************************** // //! This function is used to initiate SPI transaction of specified character //! length //! //! \param base specifies the SPI module base address. //! \param charLength specifies the SPI character length of SPI transaction //! \param data specified the data to be transmitted //! //! This function is used to initiate SPI transaction of specified character. //! SPI character length is configurable using charLength variable //! //! \return . // //***************************************************************************** extern uint16_t SPI_pollingNonFIFOTransaction(uint32_t base, uint16_t charLength, uint16_t data); //***************************************************************************** // //! This function is used to initiate SPI transaction of specified character //! length and 'N' words of transaction //! //! \param base specifies the SPI module base address. //! \param charLength specifies the SPI character length of SPI transaction //! \param pTxBuffer specifies the pointer to transmit buffer //! \param pRxBuffer specifies the pointer to receive buffer //! \param numOfWords specified the number of data to be transmitted / received //! //! SPI character length is configurable using charLength variable //! //! \return none // //***************************************************************************** extern void SPI_pollingFIFOTransaction(uint32_t base, uint16_t charLength, uint16_t *pTxBuffer, uint16_t *pRxBuffer, uint16_t numOfWords, uint16_t txDelay); //***************************************************************************** // // Close the Doxygen group. //! @} // //***************************************************************************** //***************************************************************************** // // Mark the end of the C bindings section for C++ compilers. // //***************************************************************************** #ifdef __cplusplus } #endif #endif // SPI_H