/* ---------------------------------------------------------------------------- */
/* Atmel Microcontroller Software Support */
/* SAM Software Package License */
/* ---------------------------------------------------------------------------- */
/* Copyright (c) 2015, Atmel Corporation */
/* */
/* All rights reserved. */
/* */
/* Redistribution and use in source and binary forms, with or without */
/* modification, are permitted provided that the following condition is met: */
/* */
/* - Redistributions of source code must retain the above copyright notice, */
/* this list of conditions and the disclaimer below. */
/* */
/* Atmel's name may not be used to endorse or promote products derived from */
/* this software without specific prior written permission. */
/* */
/* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR */
/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE */
/* DISCLAIMED. IN NO EVENT SHALL ATMEL 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. */
/* ---------------------------------------------------------------------------- */
/**
* \file
*
* Interface for Serial Peripheral Interface (SPI) controller.
*
*/
#ifndef _QSPI_
#define _QSPI_
/*----------------------------------------------------------------------------
* Macros
*----------------------------------------------------------------------------*/
/**
*
* Here are several macros which should be used when configuring a SPI
* peripheral.
*
* \section qspi_configuration_macros SPI Configuration Macros
* - \ref QSPI_PCS
* - \ref QSPI_SCBR
* - \ref QSPI_DLYBS
* - \ref QSPI_DLYBCT
*/
/** Calculates the value of the CSR SCBR field given the baudrate and MCK. */
#define QSPI_SCBR(baudrate, masterClock) \
((uint32_t) (masterClock / baudrate) << 8)
/** Calculates the value of the CSR DLYBS field given the desired delay (in ns) */
#define QSPI_DLYBS(delay, masterClock) \
((uint32_t) (((masterClock / 1000000) * delay) / 1000) << 16)
/** Calculates the value of the CSR DLYBCT field given the desired delay (in ns) */
#define QSPI_DLYBCT(delay, masterClock) \
((uint32_t) (((masterClock / 1000000) * delay) / 32000) << 24)
/*--------------------------------------------------------------------------- */
#ifdef __cplusplus
extern "C" {
#endif
/*----------------------------------------------------------------------------
* Exported functions
*----------------------------------------------------------------------------*/
/** \brief qspi access modes
*/
typedef enum {
CmdAccess = 0,
ReadAccess,
WriteAccess
} Access_t;
/** \brief qspi modes SPI or QSPI
*/
typedef enum {
SpiMode = QSPI_MR_SMM_SPI,
QspiMemMode = QSPI_MR_SMM_MEMORY
} QspiMode_t;
/** \brief qspi clock modes , regarding clock phase and clock polarity
*/
typedef enum {
ClockMode_00 = 0,
ClockMode_10,
ClockMode_01,
ClockMode_11
} QspiClockMode_t;
/** \brief qspi status codes
*/
typedef enum {
QSPI_SUCCESS = 0,
QSPI_BUSY,
QSPI_BUSY_SENDING,
QSPI_READ_ERROR,
QSPI_WRITE_ERROR,
QSPI_UNKNOWN_ERROR,
QSPI_INIT_ERROR,
QSPI_INPUT_ERROR,
QSPI_TOTAL_ERROR
} QspidStatus_t;
/** \brief qspi status regiter bits
*/
typedef enum {
IsReceived = QSPI_SR_RDRF,
IsTxSent = QSPI_SR_TDRE,
IsTxEmpty = QSPI_SR_TXEMPTY,
IsOverrun = QSPI_SR_OVRES,
IsCsRise = QSPI_SR_CSR,
IsCsAsserted = QSPI_SR_CSS,
IsEofInst = QSPI_SR_INSTRE,
IsEnabled = QSPI_SR_QSPIENS
} QspiStatus_t;
/** \brief qspi command structure
*/
typedef struct {
uint8_t Instruction;
uint8_t Option;
} QspiMemCmd_t;
/** \brief qspi buffer structure
*/
typedef struct {
uint32_t TxDataSize; /* Tx buffer size */
uint32_t RxDataSize; /* Rx buffer size */
const void *pDataTx; /* Tx buffer */
void *pDataRx; /* Rx buffer */
} QspiBuffer_t;
/** \brief qspi frame structure for QSPI mode
*/
typedef struct {
union _QspiInstFrame {
uint32_t val;
struct _QspiInstFrameBM {
uint32_t bwidth: 3, /** Width of QSPI Addr , inst data */
reserved0: 1, /** Reserved*/
bInstEn: 1, /** Enable Inst */
bAddrEn: 1, /** Enable Address */
bOptEn: 1, /** Enable Option */
bDataEn: 1, /** Enable Data */
bOptLen: 2, /** Option Length*/
bAddrLen: 1, /** Addrs Length*/
reserved1: 1, /** Option Length*/
bXfrType: 2, /** Transfer type*/
bContinuesRead: 1, /** Continoues read mode*/
reserved2: 1, /** Reserved*/
bDummyCycles: 5, /**< Unicast hash match */
reserved3: 11; /** Reserved*/
} bm;
} InstFrame;
uint32_t Addr;
} QspiInstFrame_t;
/** \brief qspi driver structure
*/
typedef struct {
uint8_t qspiId; /* QSPI ID */
Qspi *pQspiHw; /* QSPI Hw instance */
QspiMode_t qspiMode; /* Qspi mode: SPI or QSPI */
QspiMemCmd_t qspiCommand; /* Qspi command structure*/
QspiBuffer_t qspiBuffer; /* Qspi buffer*/
QspiInstFrame_t *pQspiFrame; /* Qspi QSPI mode Fram register informations*/
} Qspid_t;
void QSPI_SwReset(Qspi *pQspi);
void QSPI_Disable(Qspi *pQspi);
void QSPI_Enable(Qspi *pQspi);
QspidStatus_t QSPI_EndTransfer(Qspi *pQspi);
uint32_t QSPI_GetStatus(Qspi *pQspi, const QspiStatus_t rStatus);
void QSPI_ConfigureClock(Qspi *pQspi, QspiClockMode_t ClockMode,
uint32_t dwClockCfg);
QspidStatus_t QSPI_SingleReadSPI(Qspid_t *pQspid, uint16_t *const pData);
QspidStatus_t QSPI_MultiReadSPI(Qspid_t *pQspid, uint16_t *
const pData, uint32_t NumOfBytes);
QspidStatus_t QSPI_SingleWriteSPI(Qspid_t *pQspid, uint16_t const *pData);
QspidStatus_t QSPI_MultiWriteSPI(Qspid_t *pQspid, uint16_t const *pData ,
uint32_t NumOfBytes);
QspidStatus_t QSPI_EnableIt(Qspi *pQspi, uint32_t dwSources);
QspidStatus_t QSPI_DisableIt(Qspi *pQspi, uint32_t dwSources);
uint32_t QSPI_GetItMask(Qspi *pQspi);
uint32_t QSPI_GetEnabledItStatus(Qspi *pQspi);
QspidStatus_t QSPI_ConfigureInterface(Qspid_t *pQspid, QspiMode_t Mode,
uint32_t dwConfiguration);
QspidStatus_t QSPI_SendCommand(Qspid_t *pQspi, uint8_t const KeepCfg);
QspidStatus_t QSPI_SendCommandWithData(Qspid_t *pQspi, uint8_t const KeepCfg);
QspidStatus_t QSPI_ReadCommand(Qspid_t *pQspi, uint8_t const KeepCfg);
QspidStatus_t QSPI_EnableMemAccess(Qspid_t *pQspi, uint8_t const KeepCfg,
uint8_t ScrambleFlag);
QspidStatus_t QSPI_ReadWriteMem(Qspid_t *pQspid, Access_t const ReadWrite);
#ifdef __cplusplus
}
#endif
#endif /* #ifndef _QSPI_ */