c2000ware-core-sdk/driverlib/f28002x/examples/spi/spi_DMA.h

237 lines
8.8 KiB
C
Raw Normal View History

2023-06-24 09:05:38 +03:00
//#############################################################################
//
// FILE: spi_DMA.h
//
// TITLE: C28x-SPI header file when using DMA with SPI
//
//#############################################################################
//
//
// $Copyright:
// Copyright (C) 2023 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.
// $
//#############################################################################
//
// Included Files
//
#include<stdarg.h>
#include "driverlib.h"
#include "device.h"
#include "board.h"
#ifndef SPI_DMA_H
#define SPI_DMA_H
//
// Defines
//
#define EEPROM_ADDR 0x0000
#define FIFO_LVL 16 // FIFO interrupt level
#define BURST 16 // 16 words / burst
#define TRANSFER 1 // 4 burts / transfer
#define NULL ((void *)0x0)
//
// Defines for Chip Select toggle.
//
#define CS_LOW GPIO_writePin(SPI_CS_GPIO, 0)
#define CS_HIGH GPIO_writePin(SPI_CS_GPIO, 1)
typedef enum
{
SPI_DMA_TRANSACTION_IDLE = 0x0000,
SPI_DMA_TRANSACTION_STARTED = 0x0BAD,
SPI_DMA_TRANSACTION_COMPLETE = 0x55AA,
}SPI_TransactionStatus;
typedef enum
{
SPI_DMA_WRITE_ENABLE = 0x0000,
SPI_DMA_READ_STATUS_REGISTER = 0x0001,
SPI_DMA_WRITE_TRANSACTION = 0x0002,
SPI_DMA_READ_TRANSACTION = 0x0003,
}SPI_TransactionType;
#define BUFFER_SIZE 64
#define DUMMY_DATA 0xFF
#define NO_DELAY 0
extern uint16_t DMATXbuff[BUFFER_SIZE];
extern uint16_t DMARXbuff[BUFFER_SIZE];
extern struct DMA_CH SPITXDMA;
extern struct DMA_CH SPIRXDMA;
struct DMA_CH
{
uint32_t dmach;
uint16_t *pbuffer;
uint16_t currentpointer;
uint16_t maxTransactionSize;
};
typedef void (*functionPointer)(void);
struct SPI_DMA_handle
{
uint32_t spibase; //Specifies SPI base address
uint16_t charlength; //Specifies SPI character length
struct DMA_CH *pSPITXDMA; //Pointer to SPITXDMA
struct DMA_CH *pSPIRXDMA; //Pointer to SPIRXDMA
functionPointer pFunction[5U]; //Array of function pointer which executes
//different command sequence
uint16_t FunctionCount; //Counter which specifies which function
//command sequence
SPI_TransactionType TransactionType; //Stores the type of EEPROM transaction
SPI_TransactionStatus TransactionStatus;//Stores the status of SPI transaction
uint16_t expectedOutput; //Output expected from EEPROM
uint16_t offsetRXbuff; //Offset pointer for RXbuffer
uint32_t RXdata; //Stores received data
SPI_endianess endianess; //Stores endianess of transaction
};
struct EEPROM_Transaction
{
uint16_t EEPROMAddress;
uint16_t numofBytes;
uint16_t *pbuff;
};
extern struct SPI_DMA_handle SPI_DMA_Handle;
extern struct EEPROM_Transaction EEPROM_Transaction;
//*****************************************************************************
//! This macro can be used to fill up the transmit buffer to transmit a byte.
//!
//! \param data specifies the data to be transmitted
//! \param pSPI_DMA_Handle specifies SPI / DMA transaction parameters
//!
//! \return None.
//
//*****************************************************************************
#define SPI_DMA_TransmitByte(data, pSPI_DMA_Handle) SPI_DMA_ByteTransaction(data, pSPI_DMA_Handle)
//*****************************************************************************
//! This macro can be used to fill up the transmit buffer to transmit 16-bits
//!
//! \param data specifies the data to be transmitted
//! \param pSPI_DMA_Handle specifies SPI / DMA transaction parameters
//!
//! \return None.
//
//*****************************************************************************
#define SPI_DMA_Transmit16bitWord(data, pSPI_DMA_Handle) SPI_DMA_16bitWordTransaction(data, pSPI_DMA_Handle)
//*****************************************************************************
//! This macro can be used to fill up the transmit buffer to transmit N-bytes
//!
//! \param pTXbuffer specifies the start address of transmit buffer
//! \param numOfbytes specifies the number of bytes to be transmitted
//! \param pSPI_DMA_Handle specifies SPI / DMA transaction parameters
//!
//! \return None.
//
//*****************************************************************************
#define SPI_DMA_Transmit_NBytes(pTXbuffer, numOfbytes, pSPI_DMA_Handle) SPI_DMA_NBytesTransaction(pTXbuffer, numOfbytes, pSPI_DMA_Handle)
#define SPI_DMA_ReceiveByte(dummyData, pSPI_DMA_Handle) SPI_DMA_ByteTransaction(dummyData, pSPI_DMA_Handle)
#define SPI_DMA_Receive16bitWord(dummydata, pSPI_DMA_Handle) SPI_DMA_16bitWordTransaction(dummydata, pSPI_DMA_Handle)
//*****************************************************************************
//! This macro can be used to receive N-bytes
//!
//! \param numOfbytes specifies the number of bytes to be transmitted
//! \param pSPI_DMA_Handle specifies SPI / DMA transaction parameters
//!
//! \return None.
//
//*****************************************************************************
#define SPI_DMA_Receive_NBytes(numOfbytes, pSPI_DMA_Handle) SPI_DMA_NBytesTransaction(NULL, numOfbytes, pSPI_DMA_Handle)
extern void SPI_DMA_ByteTransaction(uint16_t data, struct SPI_DMA_handle *pSPI_DMA_Handle);
extern void SPI_DMA_16bitWordTransaction(uint16_t data, struct SPI_DMA_handle *pSPI_DMA_Handle);
//*****************************************************************************
//! This function can be used to configure SPI_DMA_Handle structure
//!
//! \param spibase specifies the SPI module base address.
//! \param endianess specifies whether endianess of received data
//! \param charlength specifies character length of SPI transaction
//! \param dmaTXbase specifies the DMA base address to act DMA TX channel
//! \param dmaRXbase specifies the DMA base address to act DMA RX channel
//!
//! SPI_DMA_Handle configuration made by this function are:
//! 1) SPI module, DMA TX / RX channel
//! 2) Reset current pointer for TX / RX transaction
//! 3) Configure TXbuff and RXbuff
//!
//! \return None.
//
//*****************************************************************************
void setupSPI_DMA_Handler(uint32_t spibase, uint16_t charlength, uint32_t dmaTXbase, uint32_t dmaRXbase);
//*****************************************************************************
//! This function configures DMA / SPI based on pSPI_DMA_Handle and starts
//! SPI transaction using DMA
//!
//! \param pSPI_DMA_Handle specifies the SPI module base address.
//! \param charLength specifies the SPI character length
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! \return None.
//
//*****************************************************************************
extern void SPI_DMA_StartTransaction(struct SPI_DMA_handle *pSPI_DMA_Handle, uint16_t charlength, uint16_t txdly);
extern void SPI_DMA_NBytesTransaction(uint16_t *pTXbuffer, uint16_t numOfbytes, struct SPI_DMA_handle *pSPI_DMA_Handle);
extern uint32_t selectDMA_PIE_Interrupt(uint32_t dmabase);
extern void RunCommandSequence(functionPointer *pFunction);
__interrupt void dmaTXISR(void);
__interrupt void dmaRXISR(void);
#endif