/** ----------------------------------------------------------------------------
 * Headers
 -----------------------------------------------------------------------------*/

#include "app.h"
#include "framework/driver/spi/drv_spi_static.h"
#include "sd_card_raw_cbk.h"
#include "sd_card_raw_cfg.h"
#include "system_definitions.h"

/** ----------------------------------------------------------------------------
 * Defines
 -----------------------------------------------------------------------------*/

#define SD_CARD_SLOW_SCK            (125000)
#define SD_CARD_FAST_SCK            (1000000)

/** ----------------------------------------------------------------------------
 * Function definitions
 -----------------------------------------------------------------------------*/

/**
 * Refer to sd_card_raw_cbk.h
 */
uint8_t SD_Card_Write_SPI(uint8_t data)
{
   while(PLIB_SPI_TransmitBufferIsFull(SPI_ID_4));
   PLIB_SPI_BufferWrite(SPI_ID_4, data);
   return PLIB_SPI_BufferRead(SPI_ID_4);
}

/**
 * Refer to sd_card_raw_cbk.h
 */
void SD_Card_Chip_Select(uint8_t value)
{
   SD_CARD_CS = value;
}

/**
 * Refer to sd_card_raw_cbk.h
 */
void SD_Card_Error(uint32_t line)
{
   APP_LED2 = 1;
   while(1);
}

/**
 * Refer to sd_card_raw_cbk.h
 */
void SD_Card_Set_Slow_Clock(void)
{
   PLIB_SPI_Disable(SPI_ID_4);
   PLIB_SPI_BaudRateSet(SPI_ID_4, SYS_CLK_PeripheralFrequencyGet(CLK_BUS_PERIPHERAL_2), SD_CARD_SLOW_SCK);
   PLIB_SPI_Enable(SPI_ID_4);
}

/**
 * Refer to sd_card_raw_cbk.h
 */
void SD_Card_Set_Fast_Clock(void)
{
   PLIB_SPI_Disable(SPI_ID_4);
   PLIB_SPI_BaudRateSet(SPI_ID_4, SYS_CLK_PeripheralFrequencyGet(CLK_BUS_PERIPHERAL_2), SD_CARD_FAST_SCK);
   PLIB_SPI_Enable(SPI_ID_4);
}
