Subversion Repositories Projects

Rev

Rev 295 | Blame | Last modification | View Log | RSS feed

#include <avr/io.h>
#include "ssc.h"

//-------------------------------------- Hardware specific definitions --------------------------------------
#define PORTR_SPI                       PINB
#define PORTW_SPI                       PORTB           //Port to which the sd-card is connected (SPI Port)
#define PORT_MISO                       PORTB6          //Port Pin that is connected to the DO of the MMC/SD-card
#define PORT_MOSI                       PORTB5          //Port Pin that is connected to  DI of the MMC/SD-card
#define PORT_SCK                        PORTB7          //Port Pin that is connected the CLK of the MMC/SD-card
#define PORT_SS                         PORTB4          //Slave Select is not used in SPI Master Mode, but must be defined
#define PORT_CS                         PORTB4          //Port Pin that is connected to /CS of the MMC/SD-Karte


#ifdef USE_SDLOGGER
#define __SD_INTERFACE_INVERTED         // the interface between the controller and the SD-card uses an inverting leveltranslator (transistorinverter)
#endif                                                          // and therefore the signals to or from the memorycard have to be inverted.

#ifdef USE_FOLLOWME                                     // uses resitors, therefore its not inverted
//#define       __SD_INTERFACE_INVERTED // the interface between the controller and the MMC/SD-card uses an inverting leveltranslator (transistorinverter)
#endif

#define DDR_SPI                         DDRB
#define DD_MISO                         DDB6            //Port Pin that is connected to the DO of the MMC/SD-card
#define DD_MOSI                         DDB5            //Port Pin that is connected to  DI of the MMC/SD-card
#define DD_SCK                          DDB7            //Port Pin that is connected the CLK of the MMC/SD-card
#define DD_SS                           DDB4            //Slave Select is not used in SPI Master Mode, but must be defined
#define DD_CS                           DDB4            //Port Pin that is connected to /CS of the MMC/SD-Karte

// for compatibility reasons gcc3.x <-> gcc4.x
#ifndef SPCR
#define SPCR   SPCR0
#endif
#ifndef SPIE
#define SPIE   SPIE0
#endif
#ifndef SPE
#define SPE    SPE0
#endif
#ifndef DORD
#define DORD   DORD0
#endif
#ifndef MSTR
#define MSTR   MSTR0
#endif
#ifndef CPOL
#define CPOL   CPOL0
#endif
#ifndef CPHA
#define CPHA   CPHA0
#endif
#ifndef SPR1
#define SPR1   SPR01
#endif
#ifndef SPR0
#define SPR0   SPR00
#endif

#ifndef SPDR
#define SPDR   SPDR0
#endif

#ifndef SPSR
#define SPSR   SPSR0
#endif
#ifndef SPIF
#define SPIF   SPIF0
#endif
#ifndef WCOL
#define WCOL   WCOL0
#endif
#ifndef SPI2X
#define SPI2X  SPI2X0
#endif


//________________________________________________________________________________________________________________________________________
// Function:    SSC_Init(void);
//
// Description: This function initialises the synchronus serial channel to the sdcard.
//
//
// Returnvalue: none
//________________________________________________________________________________________________________________________________________

void SSC_Init(void)
{
        // Set MOSI,SCK and CS as output
        DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_CS);
        // set MISO as input
        DDR_SPI &= ~(1<<DD_MISO);

        SSC_Disable();

        // 20MHz / 32 = 625 kHz
        #ifdef __SD_INTERFACE_INVERTED
        SPCR = (1<<SPE)|(1<<MSTR)|(0<<DORD)|(1<<CPOL)|(0<<CPHA)|(1<<SPR1)|(0<<SPR0);    // Enable SSC in mastermode, inverted clockpolarity (idle high)
        #else
        SPCR = (1<<SPE)|(1<<MSTR)|(0<<DORD)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(0<<SPR0);    // Enable SSC in mastermode, noninverted clockpolarity (idle low)
        #endif
        SPSR |= (1<<SPI2X);

        // set port pin as input pullup for SD-Card switch
        #ifdef USE_FOLLOWME
        PORTB |= (1 << PORTB2);
        DDRB &= ~(1 << DDB2);
        #endif

        #ifdef USE_SDLOGGER
        PORTB |= (1 << PORTB3);
        DDRB &= ~(1 << DDB3);
        #endif
}

void    SSC_Deinit(void)
{
        SSC_Disable();
        SPCR = 0;
        SPSR = 0;
}

//________________________________________________________________________________________________________________________________________
// Function:    SSC_GetChar(void);
//
// Description: This function reads one byte from the SSC
//
//
// Returnvalue: the byte received.
//________________________________________________________________________________________________________________________________________

uint8_t SSC_GetChar (void)
{
        uint8_t Byte = 0;

        #ifdef __SD_INTERFACE_INVERTED
        SPDR = 0x00;                                                                            // send dummy byte to initiate the reading
        #else
        SPDR = 0xFF;                                                                            // send dummy byte to initiate the reading
        #endif
        while(!(SPSR & (1<<SPIF)))
        {
                // wait until the data has been read.
        }
        Byte = SPDR;

        #ifdef __SD_INTERFACE_INVERTED
        Byte = ~Byte;
        #endif

        return(Byte);
}


//________________________________________________________________________________________________________________________________________
// Function:    SSC_PutChar(u8 Byte);
//
// Description: This function writes one byte to the SSC
//
//
// Returnvalue: none
//________________________________________________________________________________________________________________________________________

void SSC_PutChar (uint8_t Byte)
{

        #ifdef __SD_INTERFACE_INVERTED
        SPDR = ~Byte;                                                                           // send one byte of data to the SSC
        #else
        SPDR =  Byte;                                                                           // send one byte of data to the SSC
        #endif
        while(!(SPSR & (1<<SPIF)))
        {
                // wait until the data has been sent.
        }
}


//________________________________________________________________________________________________________________________________________
// Function:    SSC_Disable(void);
//
// Description: This function enables chipselect of the sdcard (active low)
//
//
// Returnvalue: none
//________________________________________________________________________________________________________________________________________

void SSC_Disable(void)
{
        #ifdef __SD_INTERFACE_INVERTED
        PORTW_SPI &= ~(1<<PORT_CS);                                     // disable chipselect of the sdcard (active low).
        #else
        PORTW_SPI |= (1<<PORT_CS);                                      // disable chipselect of the sdcard (active low).
        #endif
}




//________________________________________________________________________________________________________________________________________
// Function:    SSC_Enable(void);
//
// Description: This function disables chipselect of the sdcard (active low)
//
//
// Returnvalue: none
//________________________________________________________________________________________________________________________________________

void SSC_Enable(void)
{
        #ifdef __SD_INTERFACE_INVERTED
        PORTW_SPI |= (1<<PORT_CS);                                      // enable chipselect of the sdcard (active low).
        #else
        PORTW_SPI &= ~(1<<PORT_CS);                                     // enable chipselect of the sdcard (active low).
        #endif
}