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@107:5cc5ac5bfbbb, 2015-09-01 (annotated)
- Committer:
- apalmieri
- Date:
- Tue Sep 01 15:27:33 2015 +0000
- Revision:
- 107:5cc5ac5bfbbb
- Parent:
- 106:2176f8cfe5b3
- Child:
- 109:9e152b2453bc
Check ADV payload length for URIBeacon service
;
; When URIBeacon service is enabled the NAME and the TX_POWER
; fields (if present) are removed.
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 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 60 | * The singleton which represents the BlueNRG transport for the BLEDevice. |
wobetz | 106:2176f8cfe5b3 | 61 | * FIXME: find a better way to create the BlueNRG device instance so that |
wobetz | 106:2176f8cfe5b3 | 62 | * the pin names can be chosen by the users of this class |
avilei | 86:81b17a629630 | 63 | * |
wobetz | 106:2176f8cfe5b3 | 64 | * This is using Arduino pins as follows: |
wobetz | 106:2176f8cfe5b3 | 65 | * D11: MOSI line of SPI interface |
wobetz | 106:2176f8cfe5b3 | 66 | * D12: MISO line of SPI interface |
wobetz | 106:2176f8cfe5b3 | 67 | * D3 : SCK line of SPI interface |
wobetz | 106:2176f8cfe5b3 | 68 | * A1 : nCS line of SPI interface |
wobetz | 106:2176f8cfe5b3 | 69 | * D7 : BlueNRG reset |
wobetz | 106:2176f8cfe5b3 | 70 | * A0 : BlueNRG IRQ pin |
Silvio Lucio Oliva |
70:d20d30f59b1c | 71 | */ |
wobetz | 106:2176f8cfe5b3 | 72 | BlueNRGDevice bluenrgDeviceInstance(D11, D12, D3, A1, D7, A0); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 73 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 74 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 75 | * BLE-API requires an implementation of the following function in order to |
Silvio Lucio Oliva |
70:d20d30f59b1c | 76 | * obtain its transport handle. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 77 | */ |
Andrea Palmieri |
77:332b416123b4 | 78 | BLEInstanceBase * |
Andrea Palmieri |
77:332b416123b4 | 79 | createBLEInstance(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 80 | { |
Antonio Vilei |
74:c4526f8284d5 | 81 | return (&bluenrgDeviceInstance); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 82 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 83 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 84 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 85 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 86 | @brief Constructor |
avilei | 86:81b17a629630 | 87 | * @param mosi mbed pin to use for MOSI line of SPI interface |
avilei | 86:81b17a629630 | 88 | * @param miso mbed pin to use for MISO line of SPI interface |
avilei | 86:81b17a629630 | 89 | * @param sck mbed pin to use for SCK line of SPI interface |
avilei | 86:81b17a629630 | 90 | * @param cs mbed pin to use for not chip select line of SPI interface |
avilei | 86:81b17a629630 | 91 | * @param rst mbed pin to use for BlueNRG reset |
Antonio Vilei |
74:c4526f8284d5 | 92 | * @param irq mbed pin for BlueNRG IRQ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 93 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 94 | /**************************************************************************/ |
Antonio Vilei |
74:c4526f8284d5 | 95 | BlueNRGDevice::BlueNRGDevice(PinName mosi, |
Antonio Vilei |
74:c4526f8284d5 | 96 | PinName miso, |
Antonio Vilei |
74:c4526f8284d5 | 97 | PinName sck, |
Antonio Vilei |
74:c4526f8284d5 | 98 | PinName cs, |
Antonio Vilei |
74:c4526f8284d5 | 99 | PinName rst, |
Antonio Vilei |
74:c4526f8284d5 | 100 | PinName irq) : spi_(mosi, miso, sck), nCS_(cs), rst_(rst), irq_(irq) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 101 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 102 | isInitialized = false; |
apalmieri | 95:e1f7ce04e71b | 103 | |
Antonio Vilei |
74:c4526f8284d5 | 104 | // Setup the spi for 8 bit data, low clock polarity, |
Antonio Vilei |
74:c4526f8284d5 | 105 | // 1-edge phase, with an 8MHz clock rate |
Antonio Vilei |
74:c4526f8284d5 | 106 | spi_.format(8, 0); |
Antonio Vilei |
74:c4526f8284d5 | 107 | spi_.frequency(8000000); |
apalmieri | 95:e1f7ce04e71b | 108 | |
Antonio Vilei |
74:c4526f8284d5 | 109 | // Deselect the BlueNRG chip by keeping its nCS signal high |
Antonio Vilei |
74:c4526f8284d5 | 110 | nCS_ = 1; |
Antonio Vilei |
74:c4526f8284d5 | 111 | |
Antonio Vilei |
74:c4526f8284d5 | 112 | wait_us(500); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 113 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 114 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 115 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 116 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 117 | @brief Destructor |
Silvio Lucio Oliva |
70:d20d30f59b1c | 118 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 119 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 120 | BlueNRGDevice::~BlueNRGDevice(void) |
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 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 126 | @brief Initialises anything required to start using BLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 127 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 128 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 129 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 130 | ble_error_t BlueNRGDevice::init(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 131 | { |
Antonio Vilei |
74:c4526f8284d5 | 132 | // Set the interrupt handler for the device |
Antonio Vilei |
74:c4526f8284d5 | 133 | irq_.rise(&HCI_Isr); |
Antonio Vilei |
74:c4526f8284d5 | 134 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 135 | /* ToDo: Clear memory contents, reset the SD, etc. */ |
Antonio Vilei |
74:c4526f8284d5 | 136 | btle_init(BlueNRGGap::getInstance().getIsSetAddress()); |
apalmieri | 95:e1f7ce04e71b | 137 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 138 | isInitialized = true; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 139 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 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 | /*! |
apalmieri | 95:e1f7ce04e71b | 170 | @brief Wait for any BLE Event like BLE Connection, Read Request etc. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 171 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 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 | 95:e1f7ce04e71b | 176 | HCI_Process();//Send App Events?? |
apalmieri | 95:e1f7ce04e71b | 177 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 178 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 179 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 180 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 181 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 182 | @brief get GAP version |
Silvio Lucio Oliva |
70:d20d30f59b1c | 183 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 184 | @returns char * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 185 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 186 | const char *BlueNRGDevice::getVersion(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 187 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 188 | char *version = new char[6]; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 189 | memcpy((void *)version, "1.0.0", 5); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 190 | return version; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 191 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 192 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 193 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 194 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 195 | @brief get init state |
Silvio Lucio Oliva |
70:d20d30f59b1c | 196 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 197 | @returns bool |
Silvio Lucio Oliva |
70:d20d30f59b1c | 198 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 199 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 200 | bool BlueNRGDevice::getIsInitialized(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 201 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 202 | return isInitialized; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 203 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 204 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 205 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 206 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 207 | @brief get reference to GAP object |
Silvio Lucio Oliva |
70:d20d30f59b1c | 208 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 209 | @returns Gap& |
Silvio Lucio Oliva |
70:d20d30f59b1c | 210 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 211 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 212 | Gap &BlueNRGDevice::getGap() |
Silvio Lucio Oliva |
70:d20d30f59b1c | 213 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 214 | return BlueNRGGap::getInstance(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 215 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 216 | |
Andrea Palmieri |
77:332b416123b4 | 217 | const Gap &BlueNRGDevice::getGap() const |
Andrea Palmieri |
77:332b416123b4 | 218 | { |
Andrea Palmieri |
77:332b416123b4 | 219 | return BlueNRGGap::getInstance(); |
Andrea Palmieri |
77:332b416123b4 | 220 | } |
Andrea Palmieri |
77:332b416123b4 | 221 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 222 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 223 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 224 | @brief get reference to GATT server object |
Silvio Lucio Oliva |
70:d20d30f59b1c | 225 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 226 | @returns GattServer& |
Silvio Lucio Oliva |
70:d20d30f59b1c | 227 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 228 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 229 | GattServer &BlueNRGDevice::getGattServer() |
Silvio Lucio Oliva |
70:d20d30f59b1c | 230 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 231 | return BlueNRGGattServer::getInstance(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 232 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 233 | |
Andrea Palmieri |
77:332b416123b4 | 234 | const GattServer &BlueNRGDevice::getGattServer() const |
Silvio Lucio Oliva |
70:d20d30f59b1c | 235 | { |
Andrea Palmieri |
77:332b416123b4 | 236 | return BlueNRGGattServer::getInstance(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 237 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 238 | |
apalmieri | 95:e1f7ce04e71b | 239 | //FIXME: TBI (by now just placeholders to let build |
apalmieri | 95:e1f7ce04e71b | 240 | GattClient& BlueNRGDevice::getGattClient() {} |
apalmieri | 95:e1f7ce04e71b | 241 | SecurityManager& BlueNRGDevice::getSecurityManager(){} |
apalmieri | 95:e1f7ce04e71b | 242 | const SecurityManager& BlueNRGDevice::getSecurityManager() const {} |
apalmieri | 95:e1f7ce04e71b | 243 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 244 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 245 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 246 | @brief shut down the the BLE device |
Silvio Lucio Oliva |
70:d20d30f59b1c | 247 | @param[out] error if any |
Silvio Lucio Oliva |
70:d20d30f59b1c | 248 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 249 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 250 | ble_error_t BlueNRGDevice::shutdown(void) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 251 | return reset(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 252 | } |
apalmieri | 95:e1f7ce04e71b | 253 | |
Antonio Vilei |
74:c4526f8284d5 | 254 | /** |
Antonio Vilei |
74:c4526f8284d5 | 255 | * @brief Reads from BlueNRG SPI buffer and store data into local buffer. |
Antonio Vilei |
74:c4526f8284d5 | 256 | * @param buffer : Buffer where data from SPI are stored |
Antonio Vilei |
74:c4526f8284d5 | 257 | * @param buff_size: Buffer size |
Antonio Vilei |
74:c4526f8284d5 | 258 | * @retval int32_t : Number of read bytes |
Antonio Vilei |
74:c4526f8284d5 | 259 | */ |
Antonio Vilei |
74:c4526f8284d5 | 260 | int32_t BlueNRGDevice::spiRead(uint8_t *buffer, uint8_t buff_size) |
Antonio Vilei |
74:c4526f8284d5 | 261 | { |
apalmieri | 95:e1f7ce04e71b | 262 | uint16_t byte_count; |
apalmieri | 95:e1f7ce04e71b | 263 | uint8_t len = 0; |
apalmieri | 95:e1f7ce04e71b | 264 | uint8_t char_ff = 0xff; |
apalmieri | 95:e1f7ce04e71b | 265 | volatile uint8_t read_char; |
apalmieri | 95:e1f7ce04e71b | 266 | |
apalmieri | 95:e1f7ce04e71b | 267 | uint8_t i = 0; |
apalmieri | 95:e1f7ce04e71b | 268 | volatile uint8_t tmpreg; |
Antonio Vilei |
74:c4526f8284d5 | 269 | |
apalmieri | 95:e1f7ce04e71b | 270 | uint8_t header_master[HEADER_SIZE] = {0x0b, 0x00, 0x00, 0x00, 0x00}; |
apalmieri | 95:e1f7ce04e71b | 271 | uint8_t header_slave[HEADER_SIZE]; |
Antonio Vilei |
74:c4526f8284d5 | 272 | |
apalmieri | 95:e1f7ce04e71b | 273 | /* Select the chip */ |
apalmieri | 95:e1f7ce04e71b | 274 | nCS_ = 0; |
apalmieri | 95:e1f7ce04e71b | 275 | |
apalmieri | 95:e1f7ce04e71b | 276 | /* Read the header */ |
apalmieri | 95:e1f7ce04e71b | 277 | for (i = 0; i < 5; i++) |
apalmieri | 95:e1f7ce04e71b | 278 | { |
apalmieri | 95:e1f7ce04e71b | 279 | tmpreg = spi_.write(header_master[i]); |
apalmieri | 95:e1f7ce04e71b | 280 | header_slave[i] = (uint8_t)(tmpreg); |
apalmieri | 95:e1f7ce04e71b | 281 | } |
apalmieri | 95:e1f7ce04e71b | 282 | |
apalmieri | 95:e1f7ce04e71b | 283 | if (header_slave[0] == 0x02) { |
apalmieri | 95:e1f7ce04e71b | 284 | /* device is ready */ |
apalmieri | 95:e1f7ce04e71b | 285 | byte_count = (header_slave[4]<<8)|header_slave[3]; |
apalmieri | 95:e1f7ce04e71b | 286 | |
apalmieri | 95:e1f7ce04e71b | 287 | if (byte_count > 0) { |
apalmieri | 95:e1f7ce04e71b | 288 | |
apalmieri | 95:e1f7ce04e71b | 289 | /* avoid to read more data that size of the buffer */ |
apalmieri | 95:e1f7ce04e71b | 290 | if (byte_count > buff_size){ |
apalmieri | 95:e1f7ce04e71b | 291 | byte_count = buff_size; |
apalmieri | 95:e1f7ce04e71b | 292 | } |
apalmieri | 95:e1f7ce04e71b | 293 | |
apalmieri | 95:e1f7ce04e71b | 294 | for (len = 0; len < byte_count; len++){ |
apalmieri | 95:e1f7ce04e71b | 295 | read_char = spi_.write(char_ff); |
apalmieri | 95:e1f7ce04e71b | 296 | buffer[len] = read_char; |
apalmieri | 95:e1f7ce04e71b | 297 | } |
apalmieri | 95:e1f7ce04e71b | 298 | } |
apalmieri | 95:e1f7ce04e71b | 299 | } |
apalmieri | 95:e1f7ce04e71b | 300 | /* Release CS line to deselect the chip */ |
apalmieri | 95:e1f7ce04e71b | 301 | nCS_ = 1; |
apalmieri | 95:e1f7ce04e71b | 302 | |
apalmieri | 95:e1f7ce04e71b | 303 | // Add a small delay to give time to the BlueNRG to set the IRQ pin low |
apalmieri | 95:e1f7ce04e71b | 304 | // to avoid a useless SPI read at the end of the transaction |
apalmieri | 95:e1f7ce04e71b | 305 | for(volatile int i = 0; i < 2; i++)__NOP(); |
apalmieri | 95:e1f7ce04e71b | 306 | |
apalmieri | 95:e1f7ce04e71b | 307 | #ifdef PRINT_CSV_FORMAT |
apalmieri | 95:e1f7ce04e71b | 308 | if (len > 0) { |
apalmieri | 107:5cc5ac5bfbbb | 309 | print_csv_time(); |
apalmieri | 95:e1f7ce04e71b | 310 | for (int i=0; i<len; i++) { |
apalmieri | 95:e1f7ce04e71b | 311 | PRINT_CSV(" %02x", buffer[i]); |
Wolfgang Betz |
91:97c0c21046b4 | 312 | } |
apalmieri | 95:e1f7ce04e71b | 313 | PRINT_CSV("\n"); |
apalmieri | 95:e1f7ce04e71b | 314 | } |
Antonio Vilei |
74:c4526f8284d5 | 315 | #endif |
apalmieri | 95:e1f7ce04e71b | 316 | |
apalmieri | 95:e1f7ce04e71b | 317 | return len; |
Antonio Vilei |
74:c4526f8284d5 | 318 | } |
Antonio Vilei |
74:c4526f8284d5 | 319 | |
Antonio Vilei |
74:c4526f8284d5 | 320 | /** |
Antonio Vilei |
74:c4526f8284d5 | 321 | * @brief Writes data from local buffer to SPI. |
Antonio Vilei |
74:c4526f8284d5 | 322 | * @param data1 : First data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 323 | * @param data2 : Second data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 324 | * @param Nb_bytes1: Size of first data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 325 | * @param Nb_bytes2: Size of second data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 326 | * @retval Number of read bytes |
Antonio Vilei |
74:c4526f8284d5 | 327 | */ |
Antonio Vilei |
74:c4526f8284d5 | 328 | int32_t BlueNRGDevice::spiWrite(uint8_t* data1, |
apalmieri | 95:e1f7ce04e71b | 329 | uint8_t* data2, uint8_t Nb_bytes1, uint8_t Nb_bytes2) |
Antonio Vilei |
74:c4526f8284d5 | 330 | { |
apalmieri | 95:e1f7ce04e71b | 331 | int32_t result = 0; |
apalmieri | 95:e1f7ce04e71b | 332 | |
apalmieri | 95:e1f7ce04e71b | 333 | uint32_t i; |
apalmieri | 95:e1f7ce04e71b | 334 | volatile uint8_t read_char; |
apalmieri | 95:e1f7ce04e71b | 335 | volatile uint8_t tmpreg; |
Antonio Vilei |
74:c4526f8284d5 | 336 | |
apalmieri | 95:e1f7ce04e71b | 337 | unsigned char header_master[HEADER_SIZE] = {0x0a, 0x00, 0x00, 0x00, 0x00}; |
apalmieri | 95:e1f7ce04e71b | 338 | unsigned char header_slave[HEADER_SIZE] = {0xaa, 0x00, 0x00, 0x00, 0x00}; |
apalmieri | 95:e1f7ce04e71b | 339 | |
apalmieri | 95:e1f7ce04e71b | 340 | //unsigned char read_char_buf[MAX_BUFFER_SIZE]; |
Wolfgang Betz |
91:97c0c21046b4 | 341 | |
apalmieri | 95:e1f7ce04e71b | 342 | disable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 343 | |
apalmieri | 95:e1f7ce04e71b | 344 | /* CS reset */ |
apalmieri | 95:e1f7ce04e71b | 345 | nCS_ = 0; |
Antonio Vilei |
74:c4526f8284d5 | 346 | |
apalmieri | 95:e1f7ce04e71b | 347 | /* Exchange header */ |
apalmieri | 95:e1f7ce04e71b | 348 | for (i = 0; i < 5; i++) |
apalmieri | 95:e1f7ce04e71b | 349 | { |
apalmieri | 95:e1f7ce04e71b | 350 | tmpreg = spi_.write(header_master[i]); |
apalmieri | 95:e1f7ce04e71b | 351 | header_slave[i] = tmpreg; |
apalmieri | 95:e1f7ce04e71b | 352 | } |
apalmieri | 95:e1f7ce04e71b | 353 | |
apalmieri | 95:e1f7ce04e71b | 354 | if (header_slave[0] == 0x02) { |
apalmieri | 95:e1f7ce04e71b | 355 | /* SPI is ready */ |
apalmieri | 95:e1f7ce04e71b | 356 | if (header_slave[1] >= (Nb_bytes1+Nb_bytes2)) { |
apalmieri | 95:e1f7ce04e71b | 357 | |
apalmieri | 95:e1f7ce04e71b | 358 | /* Buffer is big enough */ |
apalmieri | 95:e1f7ce04e71b | 359 | for (i = 0; i < Nb_bytes1; i++) { |
apalmieri | 95:e1f7ce04e71b | 360 | read_char = spi_.write(*(data1 + i)); |
apalmieri | 95:e1f7ce04e71b | 361 | } |
apalmieri | 95:e1f7ce04e71b | 362 | for (i = 0; i < Nb_bytes2; i++) { |
apalmieri | 95:e1f7ce04e71b | 363 | read_char = spi_.write(*(data2 + i)); |
apalmieri | 95:e1f7ce04e71b | 364 | } |
Antonio Vilei |
74:c4526f8284d5 | 365 | } else { |
apalmieri | 95:e1f7ce04e71b | 366 | /* Buffer is too small */ |
apalmieri | 95:e1f7ce04e71b | 367 | result = -2; |
Antonio Vilei |
74:c4526f8284d5 | 368 | } |
apalmieri | 95:e1f7ce04e71b | 369 | } else { |
apalmieri | 95:e1f7ce04e71b | 370 | /* SPI is not ready */ |
apalmieri | 95:e1f7ce04e71b | 371 | result = -1; |
apalmieri | 95:e1f7ce04e71b | 372 | } |
Antonio Vilei |
74:c4526f8284d5 | 373 | |
apalmieri | 95:e1f7ce04e71b | 374 | /* Release CS line */ |
apalmieri | 95:e1f7ce04e71b | 375 | //HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET); |
apalmieri | 95:e1f7ce04e71b | 376 | nCS_ = 1; |
apalmieri | 95:e1f7ce04e71b | 377 | |
apalmieri | 95:e1f7ce04e71b | 378 | enable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 379 | |
apalmieri | 95:e1f7ce04e71b | 380 | return result; |
Antonio Vilei |
74:c4526f8284d5 | 381 | } |
Antonio Vilei |
74:c4526f8284d5 | 382 | |
Antonio Vilei |
74:c4526f8284d5 | 383 | bool BlueNRGDevice::dataPresent() |
Antonio Vilei |
74:c4526f8284d5 | 384 | { |
Antonio Vilei |
74:c4526f8284d5 | 385 | return (irq_ == 1); |
Antonio Vilei |
74:c4526f8284d5 | 386 | } |
Antonio Vilei |
74:c4526f8284d5 | 387 | |
Antonio Vilei |
74:c4526f8284d5 | 388 | void BlueNRGDevice::disable_irq() |
Antonio Vilei |
74:c4526f8284d5 | 389 | { |
Antonio Vilei |
74:c4526f8284d5 | 390 | irq_.disable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 391 | } |
Antonio Vilei |
74:c4526f8284d5 | 392 | |
Antonio Vilei |
74:c4526f8284d5 | 393 | void BlueNRGDevice::enable_irq() |
Antonio Vilei |
74:c4526f8284d5 | 394 | { |
Antonio Vilei |
74:c4526f8284d5 | 395 | irq_.enable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 396 | } |