/***************************************************************************//**
 *   @file   ADComm.c
 *   @brief  Gestion du périphérique de communication SPI pour AD719x
 *   @author Kévin (Kevin.marchand@intelligence-electronique.com)
********************************************************************************
 * Copyright 2014(c) PLCD, Inc.
 *
 * Fonctions d'initialisation et de lecture/écriture du périphérique
 * de communication SPI pour l'AD7195
 *
********************************************************************************
 *   SVN Revision: 1
*******************************************************************************/

/******************************************************************************/
/***************************** Include Files **********************************/
/******************************************************************************/
#include "ADComm.h"
#include "HardwareProfile.h"
#include "spi.h"

/******************************************************************************/
/************************ Variables Declarations ******************************/
/******************************************************************************/
/*! Contient les informations de configuartion du périphérique SPI */
unsigned int SPICON1Value = 0;
/*! Contient les informations de configuartion du périphérique SPI */
unsigned int SPICON2Value = 0;
/*! Contient les informations d'état du périphérique SPI (Activer/Désactiver...) */
unsigned int SPISTATValue = 0;

/***************************************************************************//**
 * @brief Initialise le périphérique de communication SPI.
 * @param none.
 * @return none.
*******************************************************************************/
void ADSPI_Init(void) {
    /* Turn off SPI modules */
    CloseSPI1();

    SPICON1Value = ENABLE_SCK_PIN & ENABLE_SDO_PIN & SPI_MODE16_OFF & SPI_SMP_OFF & SPI_CKE_OFF & SLAVE_ENABLE_OFF & MASTER_ENABLE_ON &
            CLK_POL_ACTIVE_LOW & SEC_PRESCAL_3_1 & PRI_PRESCAL_4_1;
    SPICON2Value = FRAME_ENABLE_OFF & FRAME_SYNC_OUTPUT & FRAME_POL_ACTIVE_LOW & FIFO_BUFFER_DISABLE;
    SPISTATValue = SPI_ENABLE & SPI_IDLE_CON & SPI_RX_OVFLOW_CLR;

    OpenSPI1(SPICON1Value, SPICON2Value, SPISTATValue);
}

/***************************************************************************//**
 * @brief Lit les données en provenance du bus SPI.
 *
 * @param slaveDeviceId - L'ID de l'esclave (en cas de mutualisation du bus).
 * @param data - En tant que paramètre d'entrée, pointeur mémoire d'écriture
 *  et en tant que paramètre de sortie, pointeur mémoire de lecture.
 * @param bytesNumber - Nombre d'octets à lire.
 *
 * @return Nombre d'octets lus.
*******************************************************************************/

unsigned char SPI_Read(unsigned char slaveDeviceId,
        unsigned char* data,
        unsigned char bytesNumber) {
    unsigned char byte = 0;

    if (slaveDeviceId == 1) {
        AD_CS_IO = 0;
    }
    for (byte = 0; byte < bytesNumber; byte++) {
        WriteSPI1(data[byte]);
        while (SPI1STATbits.SPITBF);
        while (!DataRdySPI1());
        data[byte] = ReadSPI1();
    }
    if (slaveDeviceId == 1) {
        AD_CS_IO = 1;
    }

    return bytesNumber;
}

/***************************************************************************//**
 * @brief Écrit les données sur le bus SPI.
 *
 * @param slaveDeviceId - L'ID de l'esclave (en cas de mutualisation du bus).
 * @param data - Représente le pointeur sur le tampon d'écriture.
 * @param bytesNumber - Nombre d'octets à écrire.
 *
 * @return Nombre d'octets écrits.
*******************************************************************************/

unsigned char SPI_Write(unsigned char slaveDeviceId,
        unsigned char* data,
        unsigned char bytesNumber) {
    unsigned char byte = 0;
    unsigned char read = 0;

    if (slaveDeviceId == 1) {
        AD_CS_IO = 0;
    }
    for (byte = 0; byte < bytesNumber; byte++) {
        WriteSPI1(data[byte]);
        while (SPI1STATbits.SPITBF);
        while (!DataRdySPI1());
        read = ReadSPI1();
    }
    if (slaveDeviceId == 1) {
        AD_CS_IO = 1;
    }

    return bytesNumber;
}
