
BLE Nano Code.Tested with Integrated mDot code
Dependencies: BLE_API mbed nRF51822
Fork of eco_Labs_ble_Client by
spi_slave.cpp@12:c7a8a7fe76fd, 2016-10-06 (annotated)
- Committer:
- jinu
- Date:
- Thu Oct 06 15:25:57 2016 +0000
- Revision:
- 12:c7a8a7fe76fd
- Parent:
- 11:b8e687d97537
- Child:
- 15:67fbed00edf2
working code;
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 | 11:b8e687d97537 | 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 | 11:b8e687d97537 | 23 | |
jinu | 11:b8e687d97537 | 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 | 11:b8e687d97537 | 29 | |
jinu | 11:b8e687d97537 | 30 | #define SPI_TX_BUF_SIZE 64 |
jinu | 11:b8e687d97537 | 31 | #define SPI_TX_EMPTY_DATA 0xFF |
jinu | 11:b8e687d97537 | 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 | 11:b8e687d97537 | 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 | 11:b8e687d97537 | 46 | |
jinu | 11:b8e687d97537 | 47 | static spi_data_ready_callback_t spi_data_ready_cb; |
jinu | 11:b8e687d97537 | 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 | 11:b8e687d97537 | 52 | |
jinu | 11:b8e687d97537 | 53 | /******************************************************************************/ |
jinu | 11:b8e687d97537 | 54 | /* Global Functions */ |
jinu | 11:b8e687d97537 | 55 | /******************************************************************************/ |
jinu | 11:b8e687d97537 | 56 | /** |
jinu | 11:b8e687d97537 | 57 | * @brief Enable Interrupt line |
jinu | 11:b8e687d97537 | 58 | * @param None |
jinu | 11:b8e687d97537 | 59 | * @retval None |
jinu | 11:b8e687d97537 | 60 | */ |
jinu | 11:b8e687d97537 | 61 | void enable_interrupt_line(bool status ) |
jinu | 11:b8e687d97537 | 62 | { |
jinu | 11:b8e687d97537 | 63 | if(status) |
jinu | 11:b8e687d97537 | 64 | { |
jinu | 11:b8e687d97537 | 65 | spi_rqst =1; |
jinu | 11:b8e687d97537 | 66 | spi_rdy =1; |
jinu | 11:b8e687d97537 | 67 | } |
jinu | 11:b8e687d97537 | 68 | else |
jinu | 11:b8e687d97537 | 69 | { |
jinu | 11:b8e687d97537 | 70 | spi_rqst =0; |
jinu | 11:b8e687d97537 | 71 | spi_rdy =0; |
jinu | 11:b8e687d97537 | 72 | } |
jinu | 11:b8e687d97537 | 73 | |
jinu | 11:b8e687d97537 | 74 | } |
jinu | 11:b8e687d97537 | 75 | /** |
jinu | 11:b8e687d97537 | 76 | * @brief Initializes the Nano BLE SPI slave buffer init |
jinu | 11:b8e687d97537 | 77 | * @param None |
jinu | 11:b8e687d97537 | 78 | * @retval None |
jinu | 11:b8e687d97537 | 79 | */ |
jinu | 11:b8e687d97537 | 80 | void spi_buf_init(void) |
jinu | 11:b8e687d97537 | 81 | { |
jinu | 11:b8e687d97537 | 82 | spi_tx_ptr = 0; |
jinu | 11:b8e687d97537 | 83 | spi_bytes_to_send = 0; |
jinu | 11:b8e687d97537 | 84 | memset(spi_tx_buf, SPI_TX_EMPTY_DATA, SPI_TX_BUF_SIZE); |
jinu | 11:b8e687d97537 | 85 | } |
jinu | 11:b8e687d97537 | 86 | |
jinu | 11:b8e687d97537 | 87 | /** |
jinu | 11:b8e687d97537 | 88 | * @brief Receive data from Master |
jinu | 11:b8e687d97537 | 89 | * @param |
jinu | 11:b8e687d97537 | 90 | * @retval |
jinu | 11:b8e687d97537 | 91 | */ |
jinu | 11:b8e687d97537 | 92 | void spi_slave_rx_data(void) |
jinu | 11:b8e687d97537 | 93 | { |
jinu | 11:b8e687d97537 | 94 | uint8_t rx_buf[20]; |
jinu | 11:b8e687d97537 | 95 | uint8_t byte_cnt = 0; |
jinu | 11:b8e687d97537 | 96 | uint8_t send_ptr = 0; |
jinu | 11:b8e687d97537 | 97 | |
jinu | 11:b8e687d97537 | 98 | device.reply(0xFF); |
jinu | 11:b8e687d97537 | 99 | while(1) |
jinu | 11:b8e687d97537 | 100 | { |
jinu | 11:b8e687d97537 | 101 | if(device.receive()) |
jinu | 11:b8e687d97537 | 102 | { |
jinu | 11:b8e687d97537 | 103 | rx_buf[byte_cnt] = device.read(); |
jinu | 11:b8e687d97537 | 104 | |
jinu | 11:b8e687d97537 | 105 | if (spi_bytes_to_send > 0) { |
jinu | 11:b8e687d97537 | 106 | //device.reply(rx_buf[byte_cnt]); |
jinu | 12:c7a8a7fe76fd | 107 | device.reply(spi_tx_buf[send_ptr++]); |
jinu | 11:b8e687d97537 | 108 | if (spi_tx_ptr++ > SPI_TX_BUF_SIZE) { |
jinu | 11:b8e687d97537 | 109 | spi_tx_ptr= 0; |
jinu | 11:b8e687d97537 | 110 | } |
jinu | 11:b8e687d97537 | 111 | spi_bytes_to_send--; |
jinu | 12:c7a8a7fe76fd | 112 | if(spi_bytes_to_send ==0) |
jinu | 12:c7a8a7fe76fd | 113 | { |
jinu | 12:c7a8a7fe76fd | 114 | send_ptr = 0; |
jinu | 12:c7a8a7fe76fd | 115 | enable_interrupt_line(false); |
jinu | 12:c7a8a7fe76fd | 116 | } |
jinu | 11:b8e687d97537 | 117 | } else { |
jinu | 12:c7a8a7fe76fd | 118 | device.reply(SPI_TX_EMPTY_DATA); |
jinu | 11:b8e687d97537 | 119 | } |
jinu | 11:b8e687d97537 | 120 | |
jinu | 11:b8e687d97537 | 121 | if ((byte_cnt >= 4) && (rx_buf[byte_cnt] == BLE_EOT_CMD)) { |
jinu | 11:b8e687d97537 | 122 | /* Check for End of Frame to make sure complete packet has been received */ |
jinu | 11:b8e687d97537 | 123 | spi_data_ready_cb(rx_buf, byte_cnt); |
jinu | 11:b8e687d97537 | 124 | byte_cnt = 0; |
jinu | 11:b8e687d97537 | 125 | } |
jinu | 11:b8e687d97537 | 126 | byte_cnt++; |
jinu | 11:b8e687d97537 | 127 | } |
jinu | 11:b8e687d97537 | 128 | } |
jinu | 11:b8e687d97537 | 129 | } |
jinu | 11:b8e687d97537 | 130 | |
jinu | 11:b8e687d97537 | 131 | /** |
jinu | 11:b8e687d97537 | 132 | * @brief Send data to Master |
jinu | 11:b8e687d97537 | 133 | * @param |
jinu | 11:b8e687d97537 | 134 | * @retval |
jinu | 11:b8e687d97537 | 135 | */ |
jinu | 11:b8e687d97537 | 136 | void spi_slave_tx_data(uint8_t *tx_buf, uint8_t len) |
jinu | 11:b8e687d97537 | 137 | { |
jinu | 12:c7a8a7fe76fd | 138 | spi_tx_ptr = 0; |
jinu | 12:c7a8a7fe76fd | 139 | spi_bytes_to_send = 0; |
jinu | 12:c7a8a7fe76fd | 140 | |
jinu | 11:b8e687d97537 | 141 | /* TODO: make the GPIO line high */ |
jinu | 12:c7a8a7fe76fd | 142 | enable_interrupt_line(true); |
jinu | 11:b8e687d97537 | 143 | |
jinu | 11:b8e687d97537 | 144 | /* Copy the buffer into local buffer */ |
jinu | 11:b8e687d97537 | 145 | memcpy(&spi_tx_buf[spi_tx_ptr], tx_buf, len); |
jinu | 11:b8e687d97537 | 146 | spi_bytes_to_send += len; |
jinu | 11:b8e687d97537 | 147 | spi_tx_ptr += len; |
jinu | 11:b8e687d97537 | 148 | if (spi_tx_ptr > SPI_TX_BUF_SIZE) { |
jinu | 11:b8e687d97537 | 149 | spi_tx_ptr = 0; |
jinu | 11:b8e687d97537 | 150 | } |
jinu | 12:c7a8a7fe76fd | 151 | |
jinu | 11:b8e687d97537 | 152 | } |
jinu | 11:b8e687d97537 | 153 | |
jinu | 11:b8e687d97537 | 154 | /** |
jinu | 11:b8e687d97537 | 155 | * @brief Function used to register spi data receive callback |
jinu | 11:b8e687d97537 | 156 | * @param none |
jinu | 11:b8e687d97537 | 157 | * @retval none |
jinu | 11:b8e687d97537 | 158 | */ |
jinu | 11:b8e687d97537 | 159 | void spi_data_rx_cb_register(spi_data_ready_callback_t data_rx_callback) |
jinu | 11:b8e687d97537 | 160 | { |
jinu | 11:b8e687d97537 | 161 | spi_data_ready_cb = data_rx_callback; |
jinu | 11:b8e687d97537 | 162 | } |
jinu | 11:b8e687d97537 | 163 | |
jinu | 11:b8e687d97537 | 164 | |
jinu | 11:b8e687d97537 | 165 | void init_interrupt_line(void ) |
jinu | 11:b8e687d97537 | 166 | { |
jinu | 11:b8e687d97537 | 167 | spi_rqst =0; |
jinu | 11:b8e687d97537 | 168 | spi_rdy =0; |
jinu | 11:b8e687d97537 | 169 | } |
jinu | 11:b8e687d97537 | 170 | |
jinu | 11:b8e687d97537 | 171 | |
jinu | 11:b8e687d97537 | 172 | /******************************************************************************/ |
jinu | 11:b8e687d97537 | 173 | /* END OF FILE */ |
jinu | 11:b8e687d97537 | 174 | /******************************************************************************/ |