HW layer for the Nucleo board, it only work with old BLE_API
Dependents: Hello_BLE F446RE-BLE
Fork of X_NUCLEO_IDB0XA1 by
BlueNRGDevice.cpp@120:554a95afbd16, 2015-09-09 (annotated)
- Committer:
- Wolfgang Betz
- Date:
- Wed Sep 09 13:57:23 2015 +0200
- Revision:
- 120:554a95afbd16
- Parent:
- 119:19128d9d254f
- Parent:
- 110:1232b39de5cc
Merge branch 'master' of hg::http://wobetz@developer.mbed.org/teams/ST-Expansion-SW-Team/code/X_NUCLEO_IDB0XA1 into idb0xa1-split
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Silvio Lucio Oliva |
70:d20d30f59b1c | 1 | /* mbed Microcontroller Library |
Silvio Lucio Oliva |
70:d20d30f59b1c | 2 | * Copyright (c) 2006-2013 ARM Limited |
Silvio Lucio Oliva |
70:d20d30f59b1c | 3 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 5 | * you may not use this file except in compliance with the License. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 6 | * You may obtain a copy of the License at |
Silvio Lucio Oliva |
70:d20d30f59b1c | 7 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
Silvio Lucio Oliva |
70:d20d30f59b1c | 9 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 10 | * Unless required by applicable law or agreed to in writing, software |
Silvio Lucio Oliva |
70:d20d30f59b1c | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
Silvio Lucio Oliva |
70:d20d30f59b1c | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 13 | * See the License for the specific language governing permissions and |
Silvio Lucio Oliva |
70:d20d30f59b1c | 14 | * limitations under the License. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 15 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 16 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 17 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 18 | ****************************************************************************** |
apalmieri | 95:e1f7ce04e71b | 19 | * @file BlueNRGDevice.cpp |
Silvio Lucio Oliva |
70:d20d30f59b1c | 20 | * @author STMicroelectronics |
Silvio Lucio Oliva |
70:d20d30f59b1c | 21 | * @brief Implementation of BLEDeviceInstanceBase |
Silvio Lucio Oliva |
70:d20d30f59b1c | 22 | ****************************************************************************** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 23 | * @copy |
Silvio Lucio Oliva |
70:d20d30f59b1c | 24 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 25 | * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS |
Silvio Lucio Oliva |
70:d20d30f59b1c | 26 | * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 27 | * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY |
Silvio Lucio Oliva |
70:d20d30f59b1c | 28 | * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING |
Silvio Lucio Oliva |
70:d20d30f59b1c | 29 | * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 30 | * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 31 | * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 32 | * <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2> |
apalmieri | 95:e1f7ce04e71b | 33 | */ |
apalmieri | 95:e1f7ce04e71b | 34 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 35 | /** @defgroup BlueNRGDevice |
Silvio Lucio Oliva |
70:d20d30f59b1c | 36 | * @brief BlueNRG BLE_API Device Adaptation |
Silvio Lucio Oliva |
70:d20d30f59b1c | 37 | * @{ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 38 | */ |
apalmieri | 95:e1f7ce04e71b | 39 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 40 | #include "mbed.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 41 | #include "BlueNRGDevice.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 42 | #include "BlueNRGGap.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 43 | #include "BlueNRGGattServer.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 44 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 45 | #include "btle.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 46 | #include "Utils.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 47 | #include "osal.h" |
Silvio Lucio Oliva |
70:d20d30f59b1c | 48 | |
apalmieri | 107:5cc5ac5bfbbb | 49 | #include "debug.h" |
apalmieri | 107:5cc5ac5bfbbb | 50 | #include "stm32_bluenrg_ble.h" |
apalmieri | 107:5cc5ac5bfbbb | 51 | |
Antonio Vilei |
74:c4526f8284d5 | 52 | extern "C" { |
apalmieri | 95:e1f7ce04e71b | 53 | #include "hci.h" |
Antonio Vilei |
74:c4526f8284d5 | 54 | } |
Antonio Vilei |
74:c4526f8284d5 | 55 | |
Antonio Vilei |
74:c4526f8284d5 | 56 | #define HEADER_SIZE 5 |
Antonio Vilei |
74:c4526f8284d5 | 57 | #define MAX_BUFFER_SIZE 255 |
Antonio Vilei |
74:c4526f8284d5 | 58 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 59 | /** |
Wolfgang Betz |
116:1aa0d2da72e4 | 60 | * The singleton which represents the BlueNRG transport for the BLEDevice. |
Wolfgang Betz |
116:1aa0d2da72e4 | 61 | * |
Wolfgang Betz |
116:1aa0d2da72e4 | 62 | * See file 'x_nucleo_idb0xa1_targets.h' for details regarding the peripheral pins used! |
Wolfgang Betz |
116:1aa0d2da72e4 | 63 | */ |
apalmieri | 110:1232b39de5cc | 64 | #include "x_nucleo_idb0xa1_targets.h" |
apalmieri | 110:1232b39de5cc | 65 | |
apalmieri | 110:1232b39de5cc | 66 | BlueNRGDevice bluenrgDeviceInstance(IDB0XA1_PIN_SPI_MOSI, |
apalmieri | 110:1232b39de5cc | 67 | IDB0XA1_PIN_SPI_MISO, |
apalmieri | 110:1232b39de5cc | 68 | IDB0XA1_PIN_SPI_SCK, |
apalmieri | 110:1232b39de5cc | 69 | IDB0XA1_PIN_SPI_nCS, |
apalmieri | 110:1232b39de5cc | 70 | IDB0XA1_PIN_SPI_RESET, |
apalmieri | 110:1232b39de5cc | 71 | IDB0XA1_PIN_SPI_IRQ); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 72 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 73 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 74 | * BLE-API requires an implementation of the following function in order to |
Silvio Lucio Oliva |
70:d20d30f59b1c | 75 | * obtain its transport handle. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 76 | */ |
Andrea Palmieri |
77:332b416123b4 | 77 | BLEInstanceBase * |
Andrea Palmieri |
77:332b416123b4 | 78 | createBLEInstance(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 79 | { |
Antonio Vilei |
74:c4526f8284d5 | 80 | return (&bluenrgDeviceInstance); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 81 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 82 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 83 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 84 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 85 | @brief Constructor |
avilei | 86:81b17a629630 | 86 | * @param mosi mbed pin to use for MOSI line of SPI interface |
avilei | 86:81b17a629630 | 87 | * @param miso mbed pin to use for MISO line of SPI interface |
avilei | 86:81b17a629630 | 88 | * @param sck mbed pin to use for SCK line of SPI interface |
avilei | 86:81b17a629630 | 89 | * @param cs mbed pin to use for not chip select line of SPI interface |
avilei | 86:81b17a629630 | 90 | * @param rst mbed pin to use for BlueNRG reset |
Antonio Vilei |
74:c4526f8284d5 | 91 | * @param irq mbed pin for BlueNRG IRQ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 92 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 93 | /**************************************************************************/ |
Antonio Vilei |
74:c4526f8284d5 | 94 | BlueNRGDevice::BlueNRGDevice(PinName mosi, |
Antonio Vilei |
74:c4526f8284d5 | 95 | PinName miso, |
Antonio Vilei |
74:c4526f8284d5 | 96 | PinName sck, |
Antonio Vilei |
74:c4526f8284d5 | 97 | PinName cs, |
Antonio Vilei |
74:c4526f8284d5 | 98 | PinName rst, |
Antonio Vilei |
74:c4526f8284d5 | 99 | PinName irq) : spi_(mosi, miso, sck), nCS_(cs), rst_(rst), irq_(irq) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 100 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 101 | isInitialized = false; |
apalmieri | 95:e1f7ce04e71b | 102 | |
Antonio Vilei |
74:c4526f8284d5 | 103 | // Setup the spi for 8 bit data, low clock polarity, |
Antonio Vilei |
74:c4526f8284d5 | 104 | // 1-edge phase, with an 8MHz clock rate |
Antonio Vilei |
74:c4526f8284d5 | 105 | spi_.format(8, 0); |
Antonio Vilei |
74:c4526f8284d5 | 106 | spi_.frequency(8000000); |
apalmieri | 95:e1f7ce04e71b | 107 | |
Antonio Vilei |
74:c4526f8284d5 | 108 | // Deselect the BlueNRG chip by keeping its nCS signal high |
Antonio Vilei |
74:c4526f8284d5 | 109 | nCS_ = 1; |
Antonio Vilei |
74:c4526f8284d5 | 110 | |
Antonio Vilei |
74:c4526f8284d5 | 111 | wait_us(500); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 112 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 113 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 114 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 115 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 116 | @brief Destructor |
Silvio Lucio Oliva |
70:d20d30f59b1c | 117 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 118 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 119 | BlueNRGDevice::~BlueNRGDevice(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 120 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 121 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 122 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 123 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 124 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 125 | @brief Initialises anything required to start using BLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 126 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 127 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 128 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 129 | ble_error_t BlueNRGDevice::init(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 130 | { |
Wolfgang Betz |
116:1aa0d2da72e4 | 131 | // Set the interrupt handler for the device |
apalmieri | 110:1232b39de5cc | 132 | irq_.mode(PullNone); // betzw: set irq mode |
Wolfgang Betz |
116:1aa0d2da72e4 | 133 | irq_.rise(&HCI_Isr); |
Antonio Vilei |
74:c4526f8284d5 | 134 | |
Wolfgang Betz |
116:1aa0d2da72e4 | 135 | /* ToDo: Clear memory contents, reset the SD, etc. */ |
Wolfgang Betz |
116:1aa0d2da72e4 | 136 | btle_init(BlueNRGGap::getInstance().getIsSetAddress()); |
apalmieri | 95:e1f7ce04e71b | 137 | |
Wolfgang Betz |
116:1aa0d2da72e4 | 138 | isInitialized = true; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 139 | |
Wolfgang Betz |
116:1aa0d2da72e4 | 140 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 141 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 142 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 143 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 144 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 145 | @brief Resets the BLE HW, removing any existing services and |
Silvio Lucio Oliva |
70:d20d30f59b1c | 146 | characteristics |
Silvio Lucio Oliva |
70:d20d30f59b1c | 147 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 148 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 149 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 150 | ble_error_t BlueNRGDevice::reset(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 151 | { |
Antonio Vilei |
74:c4526f8284d5 | 152 | wait_us(500); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 153 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 154 | /* Reset BlueNRG SPI interface */ |
apalmieri | 95:e1f7ce04e71b | 155 | rst_ = 0; |
apalmieri | 95:e1f7ce04e71b | 156 | wait_us(5); |
apalmieri | 95:e1f7ce04e71b | 157 | rst_ = 1; |
apalmieri | 95:e1f7ce04e71b | 158 | wait_us(5); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 159 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 160 | /* Wait for the radio to come back up */ |
Antonio Vilei |
74:c4526f8284d5 | 161 | wait_us(500); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 162 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 163 | isInitialized = false; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 164 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 165 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 166 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 167 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 168 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 169 | /*! |
Wolfgang Betz |
116:1aa0d2da72e4 | 170 | @brief Wait for any BLE Event like BLE Connection, Read Request etc. |
Wolfgang Betz |
116:1aa0d2da72e4 | 171 | @param[in] void |
Wolfgang Betz |
116:1aa0d2da72e4 | 172 | @returns char * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 173 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 174 | void BlueNRGDevice::waitForEvent(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 175 | { |
apalmieri | 110:1232b39de5cc | 176 | bool must_return = false; |
apalmieri | 110:1232b39de5cc | 177 | |
apalmieri | 110:1232b39de5cc | 178 | do { |
apalmieri | 110:1232b39de5cc | 179 | BlueNRGGap::getInstance().Process(); |
apalmieri | 110:1232b39de5cc | 180 | |
apalmieri | 110:1232b39de5cc | 181 | HCI_Process(); |
apalmieri | 110:1232b39de5cc | 182 | |
apalmieri | 110:1232b39de5cc | 183 | if(must_return) return; |
apalmieri | 110:1232b39de5cc | 184 | |
apalmieri | 110:1232b39de5cc | 185 | __WFE(); /* it is recommended that SEVONPEND in the |
apalmieri | 110:1232b39de5cc | 186 | System Control Register is NOT set */ |
apalmieri | 110:1232b39de5cc | 187 | must_return = true; /* after returning from WFE we must guarantee |
apalmieri | 110:1232b39de5cc | 188 | that conrol is given back to main loop before next WFE */ |
apalmieri | 110:1232b39de5cc | 189 | } while(true); |
Wolfgang Betz |
119:19128d9d254f | 190 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 191 | } |
Wolfgang Betz |
115:3b47df81a56b | 192 | |
Wolfgang Betz |
115:3b47df81a56b | 193 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 194 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 195 | @brief get GAP version |
Silvio Lucio Oliva |
70:d20d30f59b1c | 196 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 197 | @returns char * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 198 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 199 | const char *BlueNRGDevice::getVersion(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 200 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 201 | char *version = new char[6]; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 202 | memcpy((void *)version, "1.0.0", 5); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 203 | return version; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 204 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 205 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 206 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 207 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 208 | @brief get init state |
Silvio Lucio Oliva |
70:d20d30f59b1c | 209 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 210 | @returns bool |
Silvio Lucio Oliva |
70:d20d30f59b1c | 211 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 212 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 213 | bool BlueNRGDevice::getIsInitialized(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 214 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 215 | return isInitialized; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 216 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 217 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 218 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 219 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 220 | @brief get reference to GAP object |
Silvio Lucio Oliva |
70:d20d30f59b1c | 221 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 222 | @returns Gap& |
Silvio Lucio Oliva |
70:d20d30f59b1c | 223 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 224 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 225 | Gap &BlueNRGDevice::getGap() |
Silvio Lucio Oliva |
70:d20d30f59b1c | 226 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 227 | return BlueNRGGap::getInstance(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 228 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 229 | |
Andrea Palmieri |
77:332b416123b4 | 230 | const Gap &BlueNRGDevice::getGap() const |
Andrea Palmieri |
77:332b416123b4 | 231 | { |
Andrea Palmieri |
77:332b416123b4 | 232 | return BlueNRGGap::getInstance(); |
Andrea Palmieri |
77:332b416123b4 | 233 | } |
Andrea Palmieri |
77:332b416123b4 | 234 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 235 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 236 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 237 | @brief get reference to GATT server object |
Silvio Lucio Oliva |
70:d20d30f59b1c | 238 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 239 | @returns GattServer& |
Silvio Lucio Oliva |
70:d20d30f59b1c | 240 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 241 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 242 | GattServer &BlueNRGDevice::getGattServer() |
Silvio Lucio Oliva |
70:d20d30f59b1c | 243 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 244 | return BlueNRGGattServer::getInstance(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 245 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 246 | |
Andrea Palmieri |
77:332b416123b4 | 247 | const GattServer &BlueNRGDevice::getGattServer() const |
Silvio Lucio Oliva |
70:d20d30f59b1c | 248 | { |
Andrea Palmieri |
77:332b416123b4 | 249 | return BlueNRGGattServer::getInstance(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 250 | } |
apalmieri | 110:1232b39de5cc | 251 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 252 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 253 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 254 | @brief shut down the the BLE device |
Silvio Lucio Oliva |
70:d20d30f59b1c | 255 | @param[out] error if any |
Silvio Lucio Oliva |
70:d20d30f59b1c | 256 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 257 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 258 | ble_error_t BlueNRGDevice::shutdown(void) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 259 | return reset(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 260 | } |
apalmieri | 95:e1f7ce04e71b | 261 | |
Antonio Vilei |
74:c4526f8284d5 | 262 | /** |
Antonio Vilei |
74:c4526f8284d5 | 263 | * @brief Reads from BlueNRG SPI buffer and store data into local buffer. |
Antonio Vilei |
74:c4526f8284d5 | 264 | * @param buffer : Buffer where data from SPI are stored |
Antonio Vilei |
74:c4526f8284d5 | 265 | * @param buff_size: Buffer size |
Antonio Vilei |
74:c4526f8284d5 | 266 | * @retval int32_t : Number of read bytes |
Antonio Vilei |
74:c4526f8284d5 | 267 | */ |
Antonio Vilei |
74:c4526f8284d5 | 268 | int32_t BlueNRGDevice::spiRead(uint8_t *buffer, uint8_t buff_size) |
Antonio Vilei |
74:c4526f8284d5 | 269 | { |
apalmieri | 95:e1f7ce04e71b | 270 | uint16_t byte_count; |
apalmieri | 95:e1f7ce04e71b | 271 | uint8_t len = 0; |
apalmieri | 95:e1f7ce04e71b | 272 | uint8_t char_ff = 0xff; |
apalmieri | 95:e1f7ce04e71b | 273 | volatile uint8_t read_char; |
apalmieri | 95:e1f7ce04e71b | 274 | |
apalmieri | 95:e1f7ce04e71b | 275 | uint8_t i = 0; |
apalmieri | 95:e1f7ce04e71b | 276 | volatile uint8_t tmpreg; |
Antonio Vilei |
74:c4526f8284d5 | 277 | |
apalmieri | 95:e1f7ce04e71b | 278 | uint8_t header_master[HEADER_SIZE] = {0x0b, 0x00, 0x00, 0x00, 0x00}; |
apalmieri | 95:e1f7ce04e71b | 279 | uint8_t header_slave[HEADER_SIZE]; |
Antonio Vilei |
74:c4526f8284d5 | 280 | |
apalmieri | 95:e1f7ce04e71b | 281 | /* Select the chip */ |
apalmieri | 95:e1f7ce04e71b | 282 | nCS_ = 0; |
apalmieri | 95:e1f7ce04e71b | 283 | |
apalmieri | 95:e1f7ce04e71b | 284 | /* Read the header */ |
apalmieri | 95:e1f7ce04e71b | 285 | for (i = 0; i < 5; i++) |
apalmieri | 95:e1f7ce04e71b | 286 | { |
apalmieri | 95:e1f7ce04e71b | 287 | tmpreg = spi_.write(header_master[i]); |
apalmieri | 95:e1f7ce04e71b | 288 | header_slave[i] = (uint8_t)(tmpreg); |
apalmieri | 95:e1f7ce04e71b | 289 | } |
apalmieri | 95:e1f7ce04e71b | 290 | |
apalmieri | 95:e1f7ce04e71b | 291 | if (header_slave[0] == 0x02) { |
apalmieri | 95:e1f7ce04e71b | 292 | /* device is ready */ |
apalmieri | 95:e1f7ce04e71b | 293 | byte_count = (header_slave[4]<<8)|header_slave[3]; |
apalmieri | 95:e1f7ce04e71b | 294 | |
apalmieri | 95:e1f7ce04e71b | 295 | if (byte_count > 0) { |
apalmieri | 95:e1f7ce04e71b | 296 | |
apalmieri | 95:e1f7ce04e71b | 297 | /* avoid to read more data that size of the buffer */ |
apalmieri | 95:e1f7ce04e71b | 298 | if (byte_count > buff_size){ |
apalmieri | 95:e1f7ce04e71b | 299 | byte_count = buff_size; |
apalmieri | 95:e1f7ce04e71b | 300 | } |
apalmieri | 95:e1f7ce04e71b | 301 | |
apalmieri | 95:e1f7ce04e71b | 302 | for (len = 0; len < byte_count; len++){ |
apalmieri | 95:e1f7ce04e71b | 303 | read_char = spi_.write(char_ff); |
apalmieri | 95:e1f7ce04e71b | 304 | buffer[len] = read_char; |
apalmieri | 95:e1f7ce04e71b | 305 | } |
apalmieri | 95:e1f7ce04e71b | 306 | } |
apalmieri | 95:e1f7ce04e71b | 307 | } |
apalmieri | 95:e1f7ce04e71b | 308 | /* Release CS line to deselect the chip */ |
apalmieri | 95:e1f7ce04e71b | 309 | nCS_ = 1; |
apalmieri | 95:e1f7ce04e71b | 310 | |
apalmieri | 95:e1f7ce04e71b | 311 | // Add a small delay to give time to the BlueNRG to set the IRQ pin low |
apalmieri | 95:e1f7ce04e71b | 312 | // to avoid a useless SPI read at the end of the transaction |
apalmieri | 95:e1f7ce04e71b | 313 | for(volatile int i = 0; i < 2; i++)__NOP(); |
apalmieri | 95:e1f7ce04e71b | 314 | |
apalmieri | 95:e1f7ce04e71b | 315 | #ifdef PRINT_CSV_FORMAT |
apalmieri | 95:e1f7ce04e71b | 316 | if (len > 0) { |
apalmieri | 107:5cc5ac5bfbbb | 317 | print_csv_time(); |
apalmieri | 95:e1f7ce04e71b | 318 | for (int i=0; i<len; i++) { |
apalmieri | 95:e1f7ce04e71b | 319 | PRINT_CSV(" %02x", buffer[i]); |
Wolfgang Betz |
91:97c0c21046b4 | 320 | } |
apalmieri | 95:e1f7ce04e71b | 321 | PRINT_CSV("\n"); |
apalmieri | 95:e1f7ce04e71b | 322 | } |
Antonio Vilei |
74:c4526f8284d5 | 323 | #endif |
apalmieri | 95:e1f7ce04e71b | 324 | |
apalmieri | 95:e1f7ce04e71b | 325 | return len; |
Antonio Vilei |
74:c4526f8284d5 | 326 | } |
Antonio Vilei |
74:c4526f8284d5 | 327 | |
Antonio Vilei |
74:c4526f8284d5 | 328 | /** |
Antonio Vilei |
74:c4526f8284d5 | 329 | * @brief Writes data from local buffer to SPI. |
Antonio Vilei |
74:c4526f8284d5 | 330 | * @param data1 : First data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 331 | * @param data2 : Second data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 332 | * @param Nb_bytes1: Size of first data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 333 | * @param Nb_bytes2: Size of second data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 334 | * @retval Number of read bytes |
Antonio Vilei |
74:c4526f8284d5 | 335 | */ |
Antonio Vilei |
74:c4526f8284d5 | 336 | int32_t BlueNRGDevice::spiWrite(uint8_t* data1, |
Wolfgang Betz |
116:1aa0d2da72e4 | 337 | uint8_t* data2, uint8_t Nb_bytes1, uint8_t Nb_bytes2) |
Antonio Vilei |
74:c4526f8284d5 | 338 | { |
Wolfgang Betz |
116:1aa0d2da72e4 | 339 | int32_t result = 0; |
Wolfgang Betz |
116:1aa0d2da72e4 | 340 | uint32_t i; |
Wolfgang Betz |
116:1aa0d2da72e4 | 341 | volatile uint8_t tmpreg; |
Wolfgang Betz |
115:3b47df81a56b | 342 | |
apalmieri | 95:e1f7ce04e71b | 343 | unsigned char header_master[HEADER_SIZE] = {0x0a, 0x00, 0x00, 0x00, 0x00}; |
apalmieri | 95:e1f7ce04e71b | 344 | unsigned char header_slave[HEADER_SIZE] = {0xaa, 0x00, 0x00, 0x00, 0x00}; |
Wolfgang Betz |
91:97c0c21046b4 | 345 | |
apalmieri | 95:e1f7ce04e71b | 346 | disable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 347 | |
apalmieri | 95:e1f7ce04e71b | 348 | /* CS reset */ |
apalmieri | 95:e1f7ce04e71b | 349 | nCS_ = 0; |
Antonio Vilei |
74:c4526f8284d5 | 350 | |
apalmieri | 95:e1f7ce04e71b | 351 | /* Exchange header */ |
apalmieri | 95:e1f7ce04e71b | 352 | for (i = 0; i < 5; i++) |
apalmieri | 95:e1f7ce04e71b | 353 | { |
apalmieri | 95:e1f7ce04e71b | 354 | tmpreg = spi_.write(header_master[i]); |
apalmieri | 95:e1f7ce04e71b | 355 | header_slave[i] = tmpreg; |
apalmieri | 95:e1f7ce04e71b | 356 | } |
apalmieri | 95:e1f7ce04e71b | 357 | |
apalmieri | 95:e1f7ce04e71b | 358 | if (header_slave[0] == 0x02) { |
apalmieri | 95:e1f7ce04e71b | 359 | /* SPI is ready */ |
apalmieri | 95:e1f7ce04e71b | 360 | if (header_slave[1] >= (Nb_bytes1+Nb_bytes2)) { |
apalmieri | 95:e1f7ce04e71b | 361 | |
apalmieri | 95:e1f7ce04e71b | 362 | /* Buffer is big enough */ |
apalmieri | 95:e1f7ce04e71b | 363 | for (i = 0; i < Nb_bytes1; i++) { |
apalmieri | 110:1232b39de5cc | 364 | spi_.write(*(data1 + i)); |
apalmieri | 95:e1f7ce04e71b | 365 | } |
apalmieri | 95:e1f7ce04e71b | 366 | for (i = 0; i < Nb_bytes2; i++) { |
apalmieri | 110:1232b39de5cc | 367 | spi_.write(*(data2 + i)); |
apalmieri | 95:e1f7ce04e71b | 368 | } |
Antonio Vilei |
74:c4526f8284d5 | 369 | } else { |
apalmieri | 95:e1f7ce04e71b | 370 | /* Buffer is too small */ |
apalmieri | 95:e1f7ce04e71b | 371 | result = -2; |
Antonio Vilei |
74:c4526f8284d5 | 372 | } |
apalmieri | 95:e1f7ce04e71b | 373 | } else { |
apalmieri | 95:e1f7ce04e71b | 374 | /* SPI is not ready */ |
apalmieri | 95:e1f7ce04e71b | 375 | result = -1; |
apalmieri | 95:e1f7ce04e71b | 376 | } |
Antonio Vilei |
74:c4526f8284d5 | 377 | |
apalmieri | 95:e1f7ce04e71b | 378 | /* Release CS line */ |
apalmieri | 95:e1f7ce04e71b | 379 | //HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET); |
apalmieri | 95:e1f7ce04e71b | 380 | nCS_ = 1; |
apalmieri | 95:e1f7ce04e71b | 381 | |
apalmieri | 95:e1f7ce04e71b | 382 | enable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 383 | |
apalmieri | 95:e1f7ce04e71b | 384 | return result; |
Antonio Vilei |
74:c4526f8284d5 | 385 | } |
Antonio Vilei |
74:c4526f8284d5 | 386 | |
Antonio Vilei |
74:c4526f8284d5 | 387 | bool BlueNRGDevice::dataPresent() |
Antonio Vilei |
74:c4526f8284d5 | 388 | { |
Antonio Vilei |
74:c4526f8284d5 | 389 | return (irq_ == 1); |
Antonio Vilei |
74:c4526f8284d5 | 390 | } |
Antonio Vilei |
74:c4526f8284d5 | 391 | |
Antonio Vilei |
74:c4526f8284d5 | 392 | void BlueNRGDevice::disable_irq() |
Antonio Vilei |
74:c4526f8284d5 | 393 | { |
Antonio Vilei |
74:c4526f8284d5 | 394 | irq_.disable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 395 | } |
Antonio Vilei |
74:c4526f8284d5 | 396 | |
Antonio Vilei |
74:c4526f8284d5 | 397 | void BlueNRGDevice::enable_irq() |
Antonio Vilei |
74:c4526f8284d5 | 398 | { |
Antonio Vilei |
74:c4526f8284d5 | 399 | irq_.enable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 400 | } |