/*
 * My_spi.cpp
 *
 *  Created on: Nov 5, 2015
 *      Author: Jason
 */
#include "My_spi.hpp"

void My_spi::init_ssp1_spi( void ) {
    /* Init SSP1 as SPI */
    LPC_SC->PCONP |= ( 1 << 10 );                                           // Enable power for SSP1
    LPC_SC->PCLKSEL0 &= ~( 3 << 20 );
    LPC_SC->PCLKSEL0 |= ( 3 << 20 );                                        // Config SSP1 PCLK = CCLK/8
    /* Need 1 MHz SCLK; therefore, CPSR = 6 (PCLK = (CCLK/8) / 6) */
    LPC_SSP1->CPSR = 8;                                                     // Config SCK = PCLK / CPSR; CPSR must be an even integer (min = 2)
    LPC_PINCON->PINSEL0 &= ~( ( 3 << 14 ) | ( 3 << 16 ) | ( 3 << 18 ) );    // Clear func for P0.7, P0.8, P0.9
    LPC_PINCON->PINSEL0 |= ( ( 2 << 14 ) | ( 2 << 16 ) | ( 2 << 18 ) );     // Config SCK1, MISO1, MOSI1 for P0.7, P0.8, P0.9
    LPC_SSP1->CR0 = 0;                                                      // Clear CR0
    LPC_SSP1->CR0 |= ( 0x7 << 0 );                                          // Config 8 bit data frame
    LPC_SSP1->CR1 |= ( 1 << 1 );                                            // Enable SSP1
} // End init_ssp1_spi()

char My_spi::spi_exchange_byte ( char byte ) {
    LPC_SSP1->DR = byte;
    while ( LPC_SSP1->SR & ( 1 << 4 ) );        // Standby while SSP1 is busy
    byte = LPC_SSP1->DR;
    return byte;
} // END spi_exchange_byte()

void My_spi::init_cs( uint8_t port, uint8_t pin ) {
    /* Config GPIO output to perform as chip select, then deselect by default */
    if ( port == 0 ) {
        LPC_GPIO0->FIODIR |= ( 1 << pin );
        LPC_GPIO0->FIOSET |= ( 1 << pin );
    }
    else if ( port == 1 ) {
        LPC_GPIO1->FIODIR |= ( 1 << pin );
        LPC_GPIO1->FIOSET |= ( 1 << pin );
    }
    else if ( port == 2 ) {
        LPC_GPIO2->FIODIR |= ( 1 << pin );
        LPC_GPIO2->FIOSET |= ( 1 << pin );
    }
} // END init_cs()

void My_spi::cs_select( uint8_t port, uint8_t pin ) {
    /* Set GPIO LOW to activate active low chip select */
    if ( port == 0 ) {
       LPC_GPIO0->FIOCLR |= ( 1 << pin );
    }
    else if ( port == 1 ) {
       LPC_GPIO1->FIOCLR |= ( 1 << pin );
    }
    else if ( port == 2 ) {
       LPC_GPIO2->FIOCLR |= ( 1 << pin );
    }
} // END cs_select()

void My_spi::cs_deselect(uint8_t port, uint8_t pin) {
    /* Set GPIO HIGH to deactivate active low chip select */
    if (port == 0) {
       LPC_GPIO0->FIOSET |= ( 1 << pin );
    }
    else if (port == 1) {
       LPC_GPIO1->FIOSET |= ( 1 << pin );
    }
    else if (port == 2) {
       LPC_GPIO2->FIOSET |= ( 1 << pin );
    }
} // END cs_deselect()

