#include "msp.h"
#include <stdint.h>
#include "spi.h"



#define ASSERT_CS()			(P4->OUT &= ~BIT6)
#define DEASSERT_CS()		(P4->OUT |= BIT6)

/*SPI MASTER CONFIGURATION PARAMETER*/
									/*SET SPI MASTER | MSB FIRST | PHASE  |  HIGHT POLARITY |*/
#define SPI_MODE_0 					EUSCI_B_CTLW0_MST | EUSCI_B_CTLW0_MSB | EUSCI_B_CTLW0_CKPH | EUSCI_B_CTLW0_CKPL /*CPOL = 1 CPHA = 1 */
									/*SET SPI MASTER | MSB FIRST | PHASE  |  LOW POLARITY |*/
#define SPI_MODE_3 					EUSCI_B_CTLW0_MST | EUSCI_B_CTLW0_MSB | EUSCI_B_CTLW0_CKPH | 0X00 /* CPOL = 0 CPHA = 0 */


/*
 * spi_initialize() - Initialize and enable the SPI module
 * P4.6 - CS (active low)
 * P1.6 - MOSI UCB0SIMO
 * P1.5 - CLK UCB0CLK
 * P1.7 - MISO UCB0SOMI
 */


 void spiMasterConfig(void){

	 EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST;							/*PUT EUSCI_B_CTLW0_SWRST STATE MACHINE IN RESET*/
	 EUSCI_B0->CTLW0  = EUSCI_B_CTLW0_SWRST | SPI_MODE_0;				/*REMAIN UCB0CTW0 STATE MACHINE IN RESET | SPI_MODE_0*/
	 EUSCI_B0->CTLW0 |= EUSCI_A_CTLW0_SSEL__SMCLK;					/*SMCLK CLOCK SOURCE SELECT*/
	 EUSCI_B0->BRW = LOBYTE(SPI_400KHz);			// 300KHz
	 EUSCI_B1->BRW = HIBYTE(SPI_400KHz);
	 EUSCI_B0->CTLW1 &= ~EUSCI_A_CTLW0_SWRST;						/*RELEASE FOR THE OPERATION*/
};

 int spi_Close(Fd_t fd){
     return 0;														/*NONOS_RET_OK*/
 }

Fd_t spi_Open(void){

	 /*SELECT P1.5 P1.6 AND P1.7 IN SPI_MODE*/
	 P1->SEL0 |= BIT5 | BIT6 | BIT7;									/*SET PINS P1.5, P1.6, P1.7 AS SPI PIN FUNCIONALITY*/
	 /*CS SETUP*/
	 P4->SEL0 |= BIT6;												/*USCI*/
	 P4->OUT |= BIT6;												/*CS ON P4.6 START OUT DISABLE*/
	 P4->DIR |= BIT6;												/*CS CONFIGURED AS OUTPUT*/

	/*CONFIGURING SPI IN 3WIRE MASTER MODE*/
	// SPI_initMaster(EUSCI_B0_BASE, &spiMasterConfig());
	 /*ENABLE SPI MODULE*/
	// SPI_enableModule(EUSCI_B0_BASE);

	 return 0;														/*NONOS_RET_OK;*/
 }



int spi_Write(Fd_t fd, unsigned char *pBuff, int len)
{
    int len_to_return = len;

    ASSERT_CS();
    while (len)
    {
        while (!(EUSCI_B0->IFG&EUSCI_B_IFG_TXIFG));
        EUSCI_B0->TXBUF = *pBuff;
        while (!(EUSCI_B0->IFG&EUSCI_B_IFG_TXIFG));
        EUSCI_B0->TXBUF;
        len --;
        pBuff++;
    }

    DEASSERT_CS();

    return len_to_return;
}




int spi_Read(Fd_t fd, unsigned char *pBuff, int len)
{
    int i = 0;

    ASSERT_CS();

    for (i = 0; i < len; i ++)
    {
        while (!(EUSCI_B0->IFG&EUSCI_B_IFG_TXIFG));
        UCB0TXBUF = 0xFF;
        while (!(EUSCI_B0->IFG&EUSCI_B_IFG_TXIFG));
        pBuff[i] = UCB0RXBUF;
    }

    DEASSERT_CS();

    return len;
}

uint8_t SPI_receiveData(uint32_t modeInstance){
	uint8_t valuespirx;

	  ASSERT_CS();


	        while (!(EUSCI_B0->IFG&EUSCI_B_IFG_TXIFG));
	        EUSCI_B0->TXBUF = 0xFF;
	        while (!(EUSCI_B0->IFG&EUSCI_B_IFG_TXIFG));
	        valuespirx=  EUSCI_B0->RXBUF;


	    DEASSERT_CS();

	    return valuespirx;

}
void SPI_transmitData(uint32_t modeInstance, uint_fast8_t transmitData){
	 ASSERT_CS();

	        while (!(EUSCI_B0->IFG&EUSCI_B_IFG_TXIFG));
	        EUSCI_B0->TXBUF = transmitData;
	        while (!(EUSCI_B0->IFG&EUSCI_B_IFG_TXIFG));
	        EUSCI_B0->TXBUF;

	    DEASSERT_CS();
}


