BLE Nano Code.Tested with Integrated mDot code

Dependencies:   BLE_API mbed nRF51822

Fork of eco_Labs_ble_Client by Happiest

Committer:
jinu
Date:
Tue Oct 11 12:01:10 2016 +0000
Revision:
16:79b149aae10a
Parent:
15:67fbed00edf2
Child:
25:96044c55f844
spi BLE read corrected

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jinu 11:b8e687d97537 1 /**
jinu 11:b8e687d97537 2 ******************************************************************************
jinu 11:b8e687d97537 3 * @file ble_uart.cpp
jinu 11:b8e687d97537 4 * @author Happiesstminds Firmware Team
jinu 11:b8e687d97537 5 * @version v1.0
jinu 11:b8e687d97537 6 * @date 4-Oct-2016
jinu 11:b8e687d97537 7 * @brief
jinu 11:b8e687d97537 8 *
jinu 11:b8e687d97537 9 ******************************************************************************
jinu 11:b8e687d97537 10 * @attention
jinu 11:b8e687d97537 11 *
jinu 11:b8e687d97537 12 *
jinu 11:b8e687d97537 13 ******************************************************************************
jinu 11:b8e687d97537 14 */
jinu 15:67fbed00edf2 15
jinu 11:b8e687d97537 16 /******************************************************************************/
jinu 11:b8e687d97537 17 /* Include Files*/
jinu 11:b8e687d97537 18 /******************************************************************************/
jinu 11:b8e687d97537 19 #include "mbed.h"
jinu 11:b8e687d97537 20 #include "spi_slave.h"
jinu 11:b8e687d97537 21 #include "ble_types.h"
jinu 11:b8e687d97537 22 #include "ble_msg_handler.h"
jinu 15:67fbed00edf2 23
jinu 15:67fbed00edf2 24
jinu 11:b8e687d97537 25 /******************************************************************************/
jinu 11:b8e687d97537 26 /* Local Defines */
jinu 11:b8e687d97537 27 /******************************************************************************/
jinu 11:b8e687d97537 28 #define SPI_DUMMY_BYTE 0x00
jinu 15:67fbed00edf2 29
jinu 11:b8e687d97537 30 #define SPI_TX_BUF_SIZE 64
jinu 11:b8e687d97537 31 #define SPI_TX_EMPTY_DATA 0xFF
jinu 15:67fbed00edf2 32
jinu 11:b8e687d97537 33 /******************************************************************************/
jinu 11:b8e687d97537 34 /* Extern Variable/functions */
jinu 11:b8e687d97537 35 /******************************************************************************/
jinu 11:b8e687d97537 36 extern bool toggle_led_flag;
jinu 11:b8e687d97537 37 extern void spi_rx_Data_Callback(uint8_t *rx_data, uint8_t len);
jinu 15:67fbed00edf2 38
jinu 11:b8e687d97537 39 /******************************************************************************/
jinu 11:b8e687d97537 40 /* Static Variables */
jinu 11:b8e687d97537 41 /******************************************************************************/
jinu 11:b8e687d97537 42 DigitalOut led2(LED1);
jinu 11:b8e687d97537 43 SPISlave device(P0_9, P0_11,P0_8, P0_10); // mosi, miso, sclk, ssel
jinu 11:b8e687d97537 44 DigitalOut spi_rqst(P0_28);
jinu 11:b8e687d97537 45 DigitalOut spi_rdy(P0_29);
jinu 15:67fbed00edf2 46
jinu 11:b8e687d97537 47 static spi_data_ready_callback_t spi_data_ready_cb;
jinu 15:67fbed00edf2 48
jinu 11:b8e687d97537 49 uint8_t spi_tx_buf[SPI_TX_BUF_SIZE];
jinu 11:b8e687d97537 50 uint8_t spi_tx_ptr;
jinu 11:b8e687d97537 51 uint8_t spi_bytes_to_send;
jinu 16:79b149aae10a 52
jinu 16:79b149aae10a 53 #define SPI_RQST 28
jinu 16:79b149aae10a 54 #define SPI_RDY 29
jinu 11:b8e687d97537 55 /******************************************************************************/
jinu 11:b8e687d97537 56 /* Global Functions */
jinu 11:b8e687d97537 57 /******************************************************************************/
jinu 11:b8e687d97537 58 /**
jinu 11:b8e687d97537 59 * @brief Enable Interrupt line
jinu 11:b8e687d97537 60 * @param None
jinu 11:b8e687d97537 61 * @retval None
jinu 11:b8e687d97537 62 */
jinu 16:79b149aae10a 63 void enable_interrupt_line(bool state ,uint8_t pin_num )
jinu 11:b8e687d97537 64 {
jinu 16:79b149aae10a 65
jinu 16:79b149aae10a 66 if(pin_num == SPI_RQST)
jinu 11:b8e687d97537 67 {
jinu 16:79b149aae10a 68 if(state)
jinu 16:79b149aae10a 69 {
jinu 16:79b149aae10a 70 spi_rqst =1;
jinu 16:79b149aae10a 71 }
jinu 16:79b149aae10a 72 else
jinu 16:79b149aae10a 73 {
jinu 16:79b149aae10a 74 spi_rqst =0;
jinu 16:79b149aae10a 75 }
jinu 11:b8e687d97537 76 }
jinu 11:b8e687d97537 77 else
jinu 11:b8e687d97537 78 {
jinu 16:79b149aae10a 79 if(state)
jinu 16:79b149aae10a 80 {
jinu 16:79b149aae10a 81
jinu 16:79b149aae10a 82 spi_rdy =1;
jinu 16:79b149aae10a 83 }
jinu 16:79b149aae10a 84 else
jinu 16:79b149aae10a 85 {
jinu 16:79b149aae10a 86 spi_rdy =0;
jinu 16:79b149aae10a 87 }
jinu 11:b8e687d97537 88 }
jinu 11:b8e687d97537 89
jinu 11:b8e687d97537 90 }
jinu 11:b8e687d97537 91 /**
jinu 11:b8e687d97537 92 * @brief Initializes the Nano BLE SPI slave buffer init
jinu 11:b8e687d97537 93 * @param None
jinu 11:b8e687d97537 94 * @retval None
jinu 11:b8e687d97537 95 */
jinu 11:b8e687d97537 96 void spi_buf_init(void)
jinu 11:b8e687d97537 97 {
jinu 11:b8e687d97537 98 spi_tx_ptr = 0;
jinu 11:b8e687d97537 99 spi_bytes_to_send = 0;
jinu 11:b8e687d97537 100 memset(spi_tx_buf, SPI_TX_EMPTY_DATA, SPI_TX_BUF_SIZE);
jinu 11:b8e687d97537 101 }
jinu 15:67fbed00edf2 102
jinu 11:b8e687d97537 103 /**
jinu 11:b8e687d97537 104 * @brief Receive data from Master
jinu 11:b8e687d97537 105 * @param
jinu 11:b8e687d97537 106 * @retval
jinu 11:b8e687d97537 107 */
jinu 11:b8e687d97537 108 void spi_slave_rx_data(void)
jinu 11:b8e687d97537 109 {
jinu 11:b8e687d97537 110 uint8_t rx_buf[20];
jinu 11:b8e687d97537 111 uint8_t byte_cnt = 0;
jinu 11:b8e687d97537 112 uint8_t send_ptr = 0;
jinu 11:b8e687d97537 113
jinu 11:b8e687d97537 114 device.reply(0xFF);
jinu 11:b8e687d97537 115 while(1)
jinu 11:b8e687d97537 116 {
jinu 11:b8e687d97537 117 if(device.receive())
jinu 11:b8e687d97537 118 {
jinu 11:b8e687d97537 119 rx_buf[byte_cnt] = device.read();
jinu 11:b8e687d97537 120
jinu 11:b8e687d97537 121 if (spi_bytes_to_send > 0) {
jinu 11:b8e687d97537 122 //device.reply(rx_buf[byte_cnt]);
jinu 12:c7a8a7fe76fd 123 device.reply(spi_tx_buf[send_ptr++]);
jinu 15:67fbed00edf2 124 // if (spi_tx_ptr++ > SPI_TX_BUF_SIZE) {
jinu 15:67fbed00edf2 125 // spi_tx_ptr= 0;
jinu 15:67fbed00edf2 126 // }
jinu 11:b8e687d97537 127 spi_bytes_to_send--;
jinu 12:c7a8a7fe76fd 128 if(spi_bytes_to_send ==0)
jinu 12:c7a8a7fe76fd 129 {
jinu 12:c7a8a7fe76fd 130 send_ptr = 0;
jinu 16:79b149aae10a 131 /*read compleated*/
jinu 16:79b149aae10a 132 enable_interrupt_line(false,SPI_RDY);
jinu 12:c7a8a7fe76fd 133 }
jinu 11:b8e687d97537 134 } else {
jinu 12:c7a8a7fe76fd 135 device.reply(SPI_TX_EMPTY_DATA);
jinu 11:b8e687d97537 136 }
jinu 11:b8e687d97537 137
jinu 11:b8e687d97537 138 if ((byte_cnt >= 4) && (rx_buf[byte_cnt] == BLE_EOT_CMD)) {
jinu 11:b8e687d97537 139 /* Check for End of Frame to make sure complete packet has been received */
jinu 11:b8e687d97537 140 spi_data_ready_cb(rx_buf, byte_cnt);
jinu 11:b8e687d97537 141 byte_cnt = 0;
jinu 11:b8e687d97537 142 }
jinu 11:b8e687d97537 143 byte_cnt++;
jinu 11:b8e687d97537 144 }
jinu 11:b8e687d97537 145 }
jinu 11:b8e687d97537 146 }
jinu 15:67fbed00edf2 147
jinu 11:b8e687d97537 148 /**
jinu 11:b8e687d97537 149 * @brief Send data to Master
jinu 11:b8e687d97537 150 * @param
jinu 11:b8e687d97537 151 * @retval
jinu 11:b8e687d97537 152 */
jinu 11:b8e687d97537 153 void spi_slave_tx_data(uint8_t *tx_buf, uint8_t len)
jinu 11:b8e687d97537 154 {
jinu 12:c7a8a7fe76fd 155 spi_tx_ptr = 0;
jinu 12:c7a8a7fe76fd 156 spi_bytes_to_send = 0;
jinu 12:c7a8a7fe76fd 157
jinu 11:b8e687d97537 158 /* TODO: make the GPIO line high */
jinu 16:79b149aae10a 159 enable_interrupt_line(true,SPI_RDY);
jinu 11:b8e687d97537 160
jinu 11:b8e687d97537 161 /* Copy the buffer into local buffer */
jinu 11:b8e687d97537 162 memcpy(&spi_tx_buf[spi_tx_ptr], tx_buf, len);
jinu 11:b8e687d97537 163 spi_bytes_to_send += len;
jinu 11:b8e687d97537 164 spi_tx_ptr += len;
jinu 11:b8e687d97537 165 if (spi_tx_ptr > SPI_TX_BUF_SIZE) {
jinu 11:b8e687d97537 166 spi_tx_ptr = 0;
jinu 11:b8e687d97537 167 }
jinu 12:c7a8a7fe76fd 168
jinu 11:b8e687d97537 169 }
jinu 15:67fbed00edf2 170
jinu 11:b8e687d97537 171 /**
jinu 11:b8e687d97537 172 * @brief Function used to register spi data receive callback
jinu 11:b8e687d97537 173 * @param none
jinu 11:b8e687d97537 174 * @retval none
jinu 11:b8e687d97537 175 */
jinu 11:b8e687d97537 176 void spi_data_rx_cb_register(spi_data_ready_callback_t data_rx_callback)
jinu 11:b8e687d97537 177 {
jinu 11:b8e687d97537 178 spi_data_ready_cb = data_rx_callback;
jinu 11:b8e687d97537 179 }
jinu 15:67fbed00edf2 180
jinu 15:67fbed00edf2 181
jinu 11:b8e687d97537 182 void init_interrupt_line(void )
jinu 11:b8e687d97537 183 {
jinu 11:b8e687d97537 184 spi_rqst =0;
jinu 11:b8e687d97537 185 spi_rdy =0;
jinu 11:b8e687d97537 186 }
jinu 15:67fbed00edf2 187
jinu 15:67fbed00edf2 188
jinu 11:b8e687d97537 189 /******************************************************************************/
jinu 11:b8e687d97537 190 /* END OF FILE */
jinu 15:67fbed00edf2 191 /******************************************************************************/