BLE Nano Code.Tested with Integrated mDot code

Dependencies:   BLE_API mbed nRF51822

Fork of eco_Labs_ble_Client by Happiest

spi_slave.cpp

Committer:
jinu
Date:
2016-10-11
Revision:
15:67fbed00edf2
Parent:
12:c7a8a7fe76fd
Child:
16:79b149aae10a

File content as of revision 15:67fbed00edf2:

/**
  ******************************************************************************
  * @file    ble_uart.cpp
  * @author  Happiesstminds Firmware Team
  * @version v1.0
  * @date    4-Oct-2016
  * @brief   
  *
  ******************************************************************************
  * @attention
  *  
  *
  ******************************************************************************
  */
 
/******************************************************************************/
/* Include Files*/
/******************************************************************************/
#include "mbed.h"
#include "spi_slave.h"
#include "ble_types.h"
#include "ble_msg_handler.h"
 
 
/******************************************************************************/
/* Local Defines                                                              */
/******************************************************************************/
#define SPI_DUMMY_BYTE      0x00
 
#define SPI_TX_BUF_SIZE     64
#define SPI_TX_EMPTY_DATA   0xFF
 
/******************************************************************************/
/* Extern Variable/functions                                                  */
/******************************************************************************/
extern bool toggle_led_flag;
extern void spi_rx_Data_Callback(uint8_t *rx_data, uint8_t len);
 
/******************************************************************************/
/* Static Variables                                                           */
/******************************************************************************/
DigitalOut led2(LED1); 
SPISlave device(P0_9, P0_11,P0_8, P0_10); // mosi, miso, sclk, ssel
DigitalOut  spi_rqst(P0_28);
DigitalOut  spi_rdy(P0_29); 
 
static spi_data_ready_callback_t  spi_data_ready_cb; 
 
uint8_t spi_tx_buf[SPI_TX_BUF_SIZE];
uint8_t spi_tx_ptr;
uint8_t spi_bytes_to_send;
 
/******************************************************************************/
/* Global Functions                                                              */
/******************************************************************************/
/**
 * @brief  Enable Interrupt line
 * @param  None        
 * @retval None
 */
void enable_interrupt_line(bool status )
{
    if(status)
    {
        spi_rqst =1;
        spi_rdy =1;
    }
    else
    {
        spi_rqst =0;
        spi_rdy =0;
    }
        
}
/**
 * @brief  Initializes the Nano BLE SPI slave buffer init
 * @param  None        
 * @retval None
 */
void spi_buf_init(void)
{   
    spi_tx_ptr = 0;
    spi_bytes_to_send = 0;
    memset(spi_tx_buf, SPI_TX_EMPTY_DATA, SPI_TX_BUF_SIZE);
}
 
/**
 * @brief  Receive data from Master
 * @param  
 * @retval 
 */
void spi_slave_rx_data(void)
{    
    uint8_t rx_buf[20];
    uint8_t byte_cnt = 0;
    uint8_t send_ptr = 0;
    
    device.reply(0xFF);
    while(1)
    {
        if(device.receive()) 
        {            
            rx_buf[byte_cnt] = device.read();
            
            if (spi_bytes_to_send > 0) {
                //device.reply(rx_buf[byte_cnt]);
                device.reply(spi_tx_buf[send_ptr++]);                
             //   if (spi_tx_ptr++ > SPI_TX_BUF_SIZE) {
             //       spi_tx_ptr= 0;
             //   }
             //   send_ptr++;
                spi_bytes_to_send--;
                if(spi_bytes_to_send ==0)
                {
                    send_ptr = 0;
                    enable_interrupt_line(false);
                }
            } else {
                device.reply(SPI_TX_EMPTY_DATA);
            } 
            
            if ((byte_cnt >= 4) && (rx_buf[byte_cnt] == BLE_EOT_CMD)) {                
                /* Check for End of Frame to make sure complete packet has been received */
                spi_data_ready_cb(rx_buf, byte_cnt);
                byte_cnt = 0;
            }
            byte_cnt++;
        }
    } 
}
 
/**
 * @brief  Send data to Master
 * @param  
 * @retval 
 */
void spi_slave_tx_data(uint8_t *tx_buf, uint8_t len)
{
    spi_tx_ptr = 0;
    spi_bytes_to_send = 0;
   
    /* TODO: make the GPIO line high */
    enable_interrupt_line(true);    
    
    /* Copy the buffer into local buffer */
    memcpy(&spi_tx_buf[spi_tx_ptr], tx_buf, len);
    spi_bytes_to_send += len; 
    spi_tx_ptr += len; 
    if (spi_tx_ptr > SPI_TX_BUF_SIZE) {
        spi_tx_ptr = 0;    
    }
   
}
 
/**
 * @brief  Function used to register spi data receive callback 
 * @param  none
 * @retval none
 */
void spi_data_rx_cb_register(spi_data_ready_callback_t data_rx_callback)
{
    spi_data_ready_cb = data_rx_callback;
}
 
 
void init_interrupt_line(void )
{
    spi_rqst =0;
    spi_rdy =0;
}
 
 
/******************************************************************************/
/* END OF FILE                                                                */
/******************************************************************************/