
BLE Nano Code.Tested with Integrated mDot code
Dependencies: BLE_API mbed nRF51822
Fork of eco_Labs_ble_Client by
spi_slave.cpp@16:79b149aae10a, 2016-10-11 (annotated)
- 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?
User | Revision | Line number | New 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 | /******************************************************************************/ |