Program Listing for File SPI_register_level.h

Return to documentation for file (AD7766_Arduino/SPI_register_level.h)

/*
 * Author: Jordan Edmunds (jordan.e@berkeley.edu)
 * Authorized for distribution and use under CC-BY
 *
 * This is designed to be a blazingly fast SPI transfer library,
 * which makes more assumptions than the core arduino library is
 * able to. For now, it communicates with only one device (because
 * that's all I need).
 *
 */

// POS: bit position (0 through 31)
// MASK: bitmask (32-bit)

#define NOP __asm__ __volatile__ ("nop\n\t");
#define NOP4 NOP NOP NOP NOP
#define NOP16 NOP4 NOP4 NOP4 NOP4
#define NOP64 NOP16 NOP16 NOP16 NOP16

inline void SPISetMaster() {
  SPI0 -> SPI_MR |= SPI_MR_MSTR;
}

inline void SPIEnable() {
  SPI0 -> SPI_CR |= SPI_CR_SPIEN;
}

inline void SPIDisable() {
  SPI0 -> SPI_CR |= SPI_CR_SPIDIS;
}

inline void SPISetLastTransfer() {
  SPI0 -> SPI_CR |= SPI_CR_LASTXFER;
}

inline void SPIEnableReadInterrupt() {
  SPI0 -> SPI_IER |= SPI_IER_RDRF;
}

inline void SPIEnableTransmitInterrupt() {
  SPI0 -> SPI_IER |= SPI_IER_TDRE;
}

inline void SPIDisableReadInterrupt() {
  SPI0 -> SPI_IER &= ~SPI_IER_RDRF;
}

inline void SPIDisableTransmitInterrupt() {
  SPI0 -> SPI_IER &= ~SPI_IER_TDRE;
}

inline void SPIEnableOverrunInterrupt() {
  SPI0 -> SPI_IER |= SPI_IER_OVRES;
}

inline void SPIDisableOverrunInterrupt() {
  SPI0 -> SPI_IER &= ~SPI_IER_OVRES;
}

inline void SPISetChipSelectActiveAfterTransfer() {
  SPI0 -> SPI_CSR[0] |= SPI_CSR_CSAAT;
}

inline void SPISetClockParity0() {
  SPI0 -> SPI_CSR[0] &= ~SPI_CSR_CPOL;
}

inline void SPISetClockPhase0() {
  SPI0 -> SPI_CSR[0] &= ~SPI_CSR_NCPHA;
}

inline void SPISetClockDivider(uint32_t divisionFactor) {
  SPI0 -> SPI_CSR[0] = (SPI0 -> SPI_CSR[0] & ~SPI_CSR_SCBR_Msk) | (divisionFactor << SPI_CSR_SCBR_Pos);
}

// "Initiates a "read" by writing nonsense data to the register.
inline void SPIInitiateRead() {
  SPI0 -> SPI_TDR = 0;
}

inline void SPIBegin() {
  SPISetClockDivider(8);
  SPISetClockPhase0();
  SPISetClockParity0();
  SPISetMaster();

  SPIEnable();
}