This is an involuntary fork, created because the repository would not update mmSPI. SPI library used to communicate with an altera development board attached to four zigbee-header pins.

Dependents:   Embedded_RTOS_Project

Fork of mmSPI by Mike Moore

mmSPI.cpp

Committer:
gatedClock
Date:
2013-08-14
Revision:
5:b14dcaae260e
Parent:
4:aa1fe8707bef
Child:
6:b480fc4e87e5

File content as of revision 5:b14dcaae260e:

/*----------------------------------------------//------------------------------
    student   : m-moore
    class     : external SPI interface
    directory : mmSPI
    file      : mmSPI.cpp
------------------------------------------------//----------------------------*/
    #include "mmSPI.h"
/*----------------------------------------------//------------------------------
------------------------------------------------//----------------------------*/
//==============================================//==============================
    mmSPI::mmSPI()                              // constructor.
    {
      allocations();                            // object allocations.
    }
//----------------------------------------------//------------------------------    
    mmSPI::~mmSPI()                             // destructor.
    {
      if (pMOSI) {delete pMOSI; pMOSI = NULL;}  // delete allocation.
      if (pMISO) {delete pMISO; pMISO = NULL;}  // delete allocation.
      if (pSCLK) {delete pSCLK; pSCLK = NULL;}  // delete allocation.
    } 
//----------------------------------------------//------------------------------
    void mmSPI::allocations(void)               // object allocations.
    {
      pMOSI = new DigitalOut(mmSPI_MOSI);       // SPI MOSI pin object.
      if (!pMOSI) error("\n\r mmSPI::allocations : FATAL malloc error for pMOSI. \n\r"); 
      
      pMISO = new DigitalOut(mmSPI_MISO);      // SPI MISO pin object.
      if (!pMISO) error("\n\r mmSPI::allocations : FATAL malloc error for pMISO. \n\r"); 
    
      pSCLK = new DigitalOut(mmSPI_SCLK);       // SPI SCLK pin object.
      if (!pSCLK) error("\n\r mmSPI::allocations : FATAL malloc error for pSCLK. \n\r"); 
    } 
//----------------------------------------------//------------------------------    
    void mmSPI::setSPIfrequency(float fFreq)    // set SPI clock frequency.
    {
      fSPIfreq = fFreq;                         // promote to object scope.
      if (fSPIfreq < .05)                       // don't get near divide-by-zero.
      error("\n\r mmSPI::setSPIfrequency : FATAL SPI frequency set too low. \n\r"); 
      fSPIquarterP = (1 / fSPIfreq) / 4;        // figure quarter-cycle period.
    }
    
//----------------------------------------------//------------------------------
//  we're not going for speed, so lets go for good setup / hold.
    void mmSPI::transceive_byte(void)           // send/receive a byte.
    {
      cReceive = 0;                             // clear receive byte.                                    
      for (cLoop01 = 7; cLoop01 >= 0; cLoop01++)// loop for 8 bits in the byte.
      {
        *pSCLK = 0;                             // SPI clock negedge.
        wait(fSPIquarterP);                     // until middle of clock low.
        *pMOSI = (cSend >> cLoop01) & 1;        // assert MOSI.
        wait(fSPIquarterP);                     // MOSI setup time
        *pSCLK = 1;                             // SPI clock posedge.
        wait(fSPIquarterP);                     // MISO setup time.
        cReceive = cReceive | (*pMISO << cLoop01);
        wait(fSPIquarterP);                     // finish-out cycle.
      }
    }
//----------------------------------------------//------------------------------