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@105:332f93cd06b7, 2015-08-11 (annotated)
- Committer:
- Wolfgang Betz
- Date:
- Tue Aug 11 11:36:13 2015 +0200
- Revision:
- 105:332f93cd06b7
- Parent:
- 103:12684d94c3a6
- Parent:
- 95:e1f7ce04e71b
- Child:
- 106:2176f8cfe5b3
Merge branch 'master' of hg::http://wobetz@developer.mbed.org/teams/ST-Expansion-SW-Team/code/X_NUCLEO_IDB0XA1 into idb0xa1-split
Conflicts:
BlueNRGGap.cpp
BlueNRGGattServer.cpp
BlueNRGGattServer.h
platform/src/btle.cpp
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 | |
Antonio Vilei |
74:c4526f8284d5 | 49 | extern "C" { |
apalmieri | 95:e1f7ce04e71b | 50 | #include "hci.h" |
Antonio Vilei |
74:c4526f8284d5 | 51 | } |
Antonio Vilei |
74:c4526f8284d5 | 52 | |
Antonio Vilei |
74:c4526f8284d5 | 53 | #define HEADER_SIZE 5 |
Antonio Vilei |
74:c4526f8284d5 | 54 | #define MAX_BUFFER_SIZE 255 |
Antonio Vilei |
74:c4526f8284d5 | 55 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 56 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 57 | * The singleton which represents the BlueNRG transport for the BLEDevice. |
avilei | 86:81b17a629630 | 58 | * |
Wolfgang Betz |
100:76c16a800273 | 59 | * See file 'x_nucleo_idb0xa1_targets.h' for details regarding the peripheral pins used! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 60 | */ |
Wolfgang Betz |
100:76c16a800273 | 61 | #include "x_nucleo_idb0xa1_targets.h" |
Wolfgang Betz |
100:76c16a800273 | 62 | |
Wolfgang Betz |
100:76c16a800273 | 63 | BlueNRGDevice bluenrgDeviceInstance(IDB0XA1_PIN_SPI_MOSI, |
Wolfgang Betz |
100:76c16a800273 | 64 | IDB0XA1_PIN_SPI_MISO, |
Wolfgang Betz |
100:76c16a800273 | 65 | IDB0XA1_PIN_SPI_SCK, |
Wolfgang Betz |
100:76c16a800273 | 66 | IDB0XA1_PIN_SPI_nCS, |
Wolfgang Betz |
100:76c16a800273 | 67 | IDB0XA1_PIN_SPI_RESET, |
Wolfgang Betz |
100:76c16a800273 | 68 | IDB0XA1_PIN_SPI_IRQ); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 69 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 70 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 71 | * BLE-API requires an implementation of the following function in order to |
Silvio Lucio Oliva |
70:d20d30f59b1c | 72 | * obtain its transport handle. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 73 | */ |
Andrea Palmieri |
77:332b416123b4 | 74 | BLEInstanceBase * |
Andrea Palmieri |
77:332b416123b4 | 75 | createBLEInstance(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 76 | { |
Antonio Vilei |
74:c4526f8284d5 | 77 | return (&bluenrgDeviceInstance); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 78 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 79 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 80 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 81 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 82 | @brief Constructor |
avilei | 86:81b17a629630 | 83 | * @param mosi mbed pin to use for MOSI line of SPI interface |
avilei | 86:81b17a629630 | 84 | * @param miso mbed pin to use for MISO line of SPI interface |
avilei | 86:81b17a629630 | 85 | * @param sck mbed pin to use for SCK line of SPI interface |
avilei | 86:81b17a629630 | 86 | * @param cs mbed pin to use for not chip select line of SPI interface |
avilei | 86:81b17a629630 | 87 | * @param rst mbed pin to use for BlueNRG reset |
Antonio Vilei |
74:c4526f8284d5 | 88 | * @param irq mbed pin for BlueNRG IRQ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 89 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 90 | /**************************************************************************/ |
Antonio Vilei |
74:c4526f8284d5 | 91 | BlueNRGDevice::BlueNRGDevice(PinName mosi, |
Antonio Vilei |
74:c4526f8284d5 | 92 | PinName miso, |
Antonio Vilei |
74:c4526f8284d5 | 93 | PinName sck, |
Antonio Vilei |
74:c4526f8284d5 | 94 | PinName cs, |
Antonio Vilei |
74:c4526f8284d5 | 95 | PinName rst, |
Antonio Vilei |
74:c4526f8284d5 | 96 | PinName irq) : spi_(mosi, miso, sck), nCS_(cs), rst_(rst), irq_(irq) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 97 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 98 | isInitialized = false; |
apalmieri | 95:e1f7ce04e71b | 99 | |
Antonio Vilei |
74:c4526f8284d5 | 100 | // Setup the spi for 8 bit data, low clock polarity, |
Antonio Vilei |
74:c4526f8284d5 | 101 | // 1-edge phase, with an 8MHz clock rate |
Antonio Vilei |
74:c4526f8284d5 | 102 | spi_.format(8, 0); |
Antonio Vilei |
74:c4526f8284d5 | 103 | spi_.frequency(8000000); |
apalmieri | 95:e1f7ce04e71b | 104 | |
Antonio Vilei |
74:c4526f8284d5 | 105 | // Deselect the BlueNRG chip by keeping its nCS signal high |
Antonio Vilei |
74:c4526f8284d5 | 106 | nCS_ = 1; |
Antonio Vilei |
74:c4526f8284d5 | 107 | |
Antonio Vilei |
74:c4526f8284d5 | 108 | wait_us(500); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 109 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 110 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 111 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 112 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 113 | @brief Destructor |
Silvio Lucio Oliva |
70:d20d30f59b1c | 114 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 115 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 116 | BlueNRGDevice::~BlueNRGDevice(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 117 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 118 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 119 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 120 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 121 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 122 | @brief Initialises anything required to start using BLE |
Silvio Lucio Oliva |
70:d20d30f59b1c | 123 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 124 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 125 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 126 | ble_error_t BlueNRGDevice::init(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 127 | { |
Antonio Vilei |
74:c4526f8284d5 | 128 | // Set the interrupt handler for the device |
Wolfgang Betz |
99:c6e075b517c2 | 129 | irq_.mode(PullNone); // betzw: set irq mode |
Antonio Vilei |
74:c4526f8284d5 | 130 | irq_.rise(&HCI_Isr); |
Antonio Vilei |
74:c4526f8284d5 | 131 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 132 | /* ToDo: Clear memory contents, reset the SD, etc. */ |
Antonio Vilei |
74:c4526f8284d5 | 133 | btle_init(BlueNRGGap::getInstance().getIsSetAddress()); |
apalmieri | 95:e1f7ce04e71b | 134 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 135 | isInitialized = true; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 136 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 137 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 138 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 139 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 140 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 141 | /** |
Silvio Lucio Oliva |
70:d20d30f59b1c | 142 | @brief Resets the BLE HW, removing any existing services and |
Silvio Lucio Oliva |
70:d20d30f59b1c | 143 | characteristics |
Silvio Lucio Oliva |
70:d20d30f59b1c | 144 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 145 | @returns ble_error_t |
Silvio Lucio Oliva |
70:d20d30f59b1c | 146 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 147 | ble_error_t BlueNRGDevice::reset(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 148 | { |
Antonio Vilei |
74:c4526f8284d5 | 149 | wait_us(500); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 150 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 151 | /* Reset BlueNRG SPI interface */ |
apalmieri | 95:e1f7ce04e71b | 152 | rst_ = 0; |
apalmieri | 95:e1f7ce04e71b | 153 | wait_us(5); |
apalmieri | 95:e1f7ce04e71b | 154 | rst_ = 1; |
apalmieri | 95:e1f7ce04e71b | 155 | wait_us(5); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 156 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 157 | /* Wait for the radio to come back up */ |
Antonio Vilei |
74:c4526f8284d5 | 158 | wait_us(500); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 159 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 160 | isInitialized = false; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 161 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 162 | return BLE_ERROR_NONE; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 163 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 164 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 165 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 166 | /*! |
apalmieri | 95:e1f7ce04e71b | 167 | @brief Wait for any BLE Event like BLE Connection, Read Request etc. |
Silvio Lucio Oliva |
70:d20d30f59b1c | 168 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 169 | @returns char * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 170 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 171 | void BlueNRGDevice::waitForEvent(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 172 | { |
apalmieri | 95:e1f7ce04e71b | 173 | HCI_Process();//Send App Events?? |
apalmieri | 95:e1f7ce04e71b | 174 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 175 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 176 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 177 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 178 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 179 | @brief get GAP version |
Silvio Lucio Oliva |
70:d20d30f59b1c | 180 | @param[in] void |
Silvio Lucio Oliva |
70:d20d30f59b1c | 181 | @returns char * |
Silvio Lucio Oliva |
70:d20d30f59b1c | 182 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 183 | const char *BlueNRGDevice::getVersion(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 184 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 185 | char *version = new char[6]; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 186 | memcpy((void *)version, "1.0.0", 5); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 187 | return version; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 188 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 189 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 190 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 191 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 192 | @brief get init state |
Silvio Lucio Oliva |
70:d20d30f59b1c | 193 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 194 | @returns bool |
Silvio Lucio Oliva |
70:d20d30f59b1c | 195 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 196 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 197 | bool BlueNRGDevice::getIsInitialized(void) |
Silvio Lucio Oliva |
70:d20d30f59b1c | 198 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 199 | return isInitialized; |
Silvio Lucio Oliva |
70:d20d30f59b1c | 200 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 201 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 202 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 203 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 204 | @brief get reference to GAP object |
Silvio Lucio Oliva |
70:d20d30f59b1c | 205 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 206 | @returns Gap& |
Silvio Lucio Oliva |
70:d20d30f59b1c | 207 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 208 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 209 | Gap &BlueNRGDevice::getGap() |
Silvio Lucio Oliva |
70:d20d30f59b1c | 210 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 211 | return BlueNRGGap::getInstance(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 212 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 213 | |
Andrea Palmieri |
77:332b416123b4 | 214 | const Gap &BlueNRGDevice::getGap() const |
Andrea Palmieri |
77:332b416123b4 | 215 | { |
Andrea Palmieri |
77:332b416123b4 | 216 | return BlueNRGGap::getInstance(); |
Andrea Palmieri |
77:332b416123b4 | 217 | } |
Andrea Palmieri |
77:332b416123b4 | 218 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 219 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 220 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 221 | @brief get reference to GATT server object |
Silvio Lucio Oliva |
70:d20d30f59b1c | 222 | @param[in] void |
apalmieri | 95:e1f7ce04e71b | 223 | @returns GattServer& |
Silvio Lucio Oliva |
70:d20d30f59b1c | 224 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 225 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 226 | GattServer &BlueNRGDevice::getGattServer() |
Silvio Lucio Oliva |
70:d20d30f59b1c | 227 | { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 228 | return BlueNRGGattServer::getInstance(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 229 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 230 | |
Andrea Palmieri |
77:332b416123b4 | 231 | const GattServer &BlueNRGDevice::getGattServer() const |
Silvio Lucio Oliva |
70:d20d30f59b1c | 232 | { |
Andrea Palmieri |
77:332b416123b4 | 233 | return BlueNRGGattServer::getInstance(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 234 | } |
Silvio Lucio Oliva |
70:d20d30f59b1c | 235 | |
apalmieri | 95:e1f7ce04e71b | 236 | //FIXME: TBI (by now just placeholders to let build |
apalmieri | 95:e1f7ce04e71b | 237 | GattClient& BlueNRGDevice::getGattClient() {} |
apalmieri | 95:e1f7ce04e71b | 238 | SecurityManager& BlueNRGDevice::getSecurityManager(){} |
apalmieri | 95:e1f7ce04e71b | 239 | const SecurityManager& BlueNRGDevice::getSecurityManager() const {} |
apalmieri | 95:e1f7ce04e71b | 240 | |
Silvio Lucio Oliva |
70:d20d30f59b1c | 241 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 242 | /*! |
Silvio Lucio Oliva |
70:d20d30f59b1c | 243 | @brief shut down the the BLE device |
Silvio Lucio Oliva |
70:d20d30f59b1c | 244 | @param[out] error if any |
Silvio Lucio Oliva |
70:d20d30f59b1c | 245 | */ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 246 | /**************************************************************************/ |
Silvio Lucio Oliva |
70:d20d30f59b1c | 247 | ble_error_t BlueNRGDevice::shutdown(void) { |
Silvio Lucio Oliva |
70:d20d30f59b1c | 248 | return reset(); |
Silvio Lucio Oliva |
70:d20d30f59b1c | 249 | } |
apalmieri | 95:e1f7ce04e71b | 250 | |
Antonio Vilei |
74:c4526f8284d5 | 251 | /** |
Antonio Vilei |
74:c4526f8284d5 | 252 | * @brief Reads from BlueNRG SPI buffer and store data into local buffer. |
Antonio Vilei |
74:c4526f8284d5 | 253 | * @param buffer : Buffer where data from SPI are stored |
Antonio Vilei |
74:c4526f8284d5 | 254 | * @param buff_size: Buffer size |
Antonio Vilei |
74:c4526f8284d5 | 255 | * @retval int32_t : Number of read bytes |
Antonio Vilei |
74:c4526f8284d5 | 256 | */ |
Antonio Vilei |
74:c4526f8284d5 | 257 | int32_t BlueNRGDevice::spiRead(uint8_t *buffer, uint8_t buff_size) |
Antonio Vilei |
74:c4526f8284d5 | 258 | { |
apalmieri | 95:e1f7ce04e71b | 259 | uint16_t byte_count; |
apalmieri | 95:e1f7ce04e71b | 260 | uint8_t len = 0; |
apalmieri | 95:e1f7ce04e71b | 261 | uint8_t char_ff = 0xff; |
apalmieri | 95:e1f7ce04e71b | 262 | volatile uint8_t read_char; |
apalmieri | 95:e1f7ce04e71b | 263 | |
apalmieri | 95:e1f7ce04e71b | 264 | uint8_t i = 0; |
apalmieri | 95:e1f7ce04e71b | 265 | volatile uint8_t tmpreg; |
Antonio Vilei |
74:c4526f8284d5 | 266 | |
apalmieri | 95:e1f7ce04e71b | 267 | uint8_t header_master[HEADER_SIZE] = {0x0b, 0x00, 0x00, 0x00, 0x00}; |
apalmieri | 95:e1f7ce04e71b | 268 | uint8_t header_slave[HEADER_SIZE]; |
Antonio Vilei |
74:c4526f8284d5 | 269 | |
apalmieri | 95:e1f7ce04e71b | 270 | /* Select the chip */ |
apalmieri | 95:e1f7ce04e71b | 271 | nCS_ = 0; |
apalmieri | 95:e1f7ce04e71b | 272 | |
apalmieri | 95:e1f7ce04e71b | 273 | /* Read the header */ |
apalmieri | 95:e1f7ce04e71b | 274 | for (i = 0; i < 5; i++) |
apalmieri | 95:e1f7ce04e71b | 275 | { |
apalmieri | 95:e1f7ce04e71b | 276 | tmpreg = spi_.write(header_master[i]); |
apalmieri | 95:e1f7ce04e71b | 277 | header_slave[i] = (uint8_t)(tmpreg); |
apalmieri | 95:e1f7ce04e71b | 278 | } |
apalmieri | 95:e1f7ce04e71b | 279 | |
apalmieri | 95:e1f7ce04e71b | 280 | if (header_slave[0] == 0x02) { |
apalmieri | 95:e1f7ce04e71b | 281 | /* device is ready */ |
apalmieri | 95:e1f7ce04e71b | 282 | byte_count = (header_slave[4]<<8)|header_slave[3]; |
apalmieri | 95:e1f7ce04e71b | 283 | |
apalmieri | 95:e1f7ce04e71b | 284 | if (byte_count > 0) { |
apalmieri | 95:e1f7ce04e71b | 285 | |
apalmieri | 95:e1f7ce04e71b | 286 | /* avoid to read more data that size of the buffer */ |
apalmieri | 95:e1f7ce04e71b | 287 | if (byte_count > buff_size){ |
apalmieri | 95:e1f7ce04e71b | 288 | byte_count = buff_size; |
apalmieri | 95:e1f7ce04e71b | 289 | } |
apalmieri | 95:e1f7ce04e71b | 290 | |
apalmieri | 95:e1f7ce04e71b | 291 | for (len = 0; len < byte_count; len++){ |
apalmieri | 95:e1f7ce04e71b | 292 | read_char = spi_.write(char_ff); |
apalmieri | 95:e1f7ce04e71b | 293 | buffer[len] = read_char; |
apalmieri | 95:e1f7ce04e71b | 294 | } |
apalmieri | 95:e1f7ce04e71b | 295 | } |
apalmieri | 95:e1f7ce04e71b | 296 | } |
apalmieri | 95:e1f7ce04e71b | 297 | /* Release CS line to deselect the chip */ |
apalmieri | 95:e1f7ce04e71b | 298 | nCS_ = 1; |
apalmieri | 95:e1f7ce04e71b | 299 | |
apalmieri | 95:e1f7ce04e71b | 300 | // Add a small delay to give time to the BlueNRG to set the IRQ pin low |
apalmieri | 95:e1f7ce04e71b | 301 | // to avoid a useless SPI read at the end of the transaction |
apalmieri | 95:e1f7ce04e71b | 302 | for(volatile int i = 0; i < 2; i++)__NOP(); |
apalmieri | 95:e1f7ce04e71b | 303 | |
apalmieri | 95:e1f7ce04e71b | 304 | #ifdef PRINT_CSV_FORMAT |
apalmieri | 95:e1f7ce04e71b | 305 | if (len > 0) { |
apalmieri | 95:e1f7ce04e71b | 306 | // print_csv_time(); |
apalmieri | 95:e1f7ce04e71b | 307 | for (int i=0; i<len; i++) { |
apalmieri | 95:e1f7ce04e71b | 308 | PRINT_CSV(" %02x", buffer[i]); |
Wolfgang Betz |
91:97c0c21046b4 | 309 | } |
apalmieri | 95:e1f7ce04e71b | 310 | PRINT_CSV("\n"); |
apalmieri | 95:e1f7ce04e71b | 311 | } |
Antonio Vilei |
74:c4526f8284d5 | 312 | #endif |
apalmieri | 95:e1f7ce04e71b | 313 | |
apalmieri | 95:e1f7ce04e71b | 314 | return len; |
Antonio Vilei |
74:c4526f8284d5 | 315 | } |
Antonio Vilei |
74:c4526f8284d5 | 316 | |
Antonio Vilei |
74:c4526f8284d5 | 317 | /** |
Antonio Vilei |
74:c4526f8284d5 | 318 | * @brief Writes data from local buffer to SPI. |
Antonio Vilei |
74:c4526f8284d5 | 319 | * @param data1 : First data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 320 | * @param data2 : Second data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 321 | * @param Nb_bytes1: Size of first data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 322 | * @param Nb_bytes2: Size of second data buffer to be written |
Antonio Vilei |
74:c4526f8284d5 | 323 | * @retval Number of read bytes |
Antonio Vilei |
74:c4526f8284d5 | 324 | */ |
Antonio Vilei |
74:c4526f8284d5 | 325 | int32_t BlueNRGDevice::spiWrite(uint8_t* data1, |
apalmieri | 95:e1f7ce04e71b | 326 | uint8_t* data2, uint8_t Nb_bytes1, uint8_t Nb_bytes2) |
Antonio Vilei |
74:c4526f8284d5 | 327 | { |
apalmieri | 95:e1f7ce04e71b | 328 | int32_t result = 0; |
apalmieri | 95:e1f7ce04e71b | 329 | |
apalmieri | 95:e1f7ce04e71b | 330 | uint32_t i; |
apalmieri | 95:e1f7ce04e71b | 331 | volatile uint8_t read_char; |
apalmieri | 95:e1f7ce04e71b | 332 | volatile uint8_t tmpreg; |
Antonio Vilei |
74:c4526f8284d5 | 333 | |
apalmieri | 95:e1f7ce04e71b | 334 | unsigned char header_master[HEADER_SIZE] = {0x0a, 0x00, 0x00, 0x00, 0x00}; |
apalmieri | 95:e1f7ce04e71b | 335 | unsigned char header_slave[HEADER_SIZE] = {0xaa, 0x00, 0x00, 0x00, 0x00}; |
apalmieri | 95:e1f7ce04e71b | 336 | |
apalmieri | 95:e1f7ce04e71b | 337 | //unsigned char read_char_buf[MAX_BUFFER_SIZE]; |
Wolfgang Betz |
91:97c0c21046b4 | 338 | |
apalmieri | 95:e1f7ce04e71b | 339 | disable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 340 | |
apalmieri | 95:e1f7ce04e71b | 341 | /* CS reset */ |
apalmieri | 95:e1f7ce04e71b | 342 | nCS_ = 0; |
Antonio Vilei |
74:c4526f8284d5 | 343 | |
apalmieri | 95:e1f7ce04e71b | 344 | /* Exchange header */ |
apalmieri | 95:e1f7ce04e71b | 345 | for (i = 0; i < 5; i++) |
apalmieri | 95:e1f7ce04e71b | 346 | { |
apalmieri | 95:e1f7ce04e71b | 347 | tmpreg = spi_.write(header_master[i]); |
apalmieri | 95:e1f7ce04e71b | 348 | header_slave[i] = tmpreg; |
apalmieri | 95:e1f7ce04e71b | 349 | } |
apalmieri | 95:e1f7ce04e71b | 350 | |
apalmieri | 95:e1f7ce04e71b | 351 | if (header_slave[0] == 0x02) { |
apalmieri | 95:e1f7ce04e71b | 352 | /* SPI is ready */ |
apalmieri | 95:e1f7ce04e71b | 353 | if (header_slave[1] >= (Nb_bytes1+Nb_bytes2)) { |
apalmieri | 95:e1f7ce04e71b | 354 | |
apalmieri | 95:e1f7ce04e71b | 355 | /* Buffer is big enough */ |
apalmieri | 95:e1f7ce04e71b | 356 | for (i = 0; i < Nb_bytes1; i++) { |
apalmieri | 95:e1f7ce04e71b | 357 | read_char = spi_.write(*(data1 + i)); |
apalmieri | 95:e1f7ce04e71b | 358 | } |
apalmieri | 95:e1f7ce04e71b | 359 | for (i = 0; i < Nb_bytes2; i++) { |
apalmieri | 95:e1f7ce04e71b | 360 | read_char = spi_.write(*(data2 + i)); |
apalmieri | 95:e1f7ce04e71b | 361 | } |
Antonio Vilei |
74:c4526f8284d5 | 362 | } else { |
apalmieri | 95:e1f7ce04e71b | 363 | /* Buffer is too small */ |
apalmieri | 95:e1f7ce04e71b | 364 | result = -2; |
Antonio Vilei |
74:c4526f8284d5 | 365 | } |
apalmieri | 95:e1f7ce04e71b | 366 | } else { |
apalmieri | 95:e1f7ce04e71b | 367 | /* SPI is not ready */ |
apalmieri | 95:e1f7ce04e71b | 368 | result = -1; |
apalmieri | 95:e1f7ce04e71b | 369 | } |
Antonio Vilei |
74:c4526f8284d5 | 370 | |
apalmieri | 95:e1f7ce04e71b | 371 | /* Release CS line */ |
apalmieri | 95:e1f7ce04e71b | 372 | //HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET); |
apalmieri | 95:e1f7ce04e71b | 373 | nCS_ = 1; |
apalmieri | 95:e1f7ce04e71b | 374 | |
apalmieri | 95:e1f7ce04e71b | 375 | enable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 376 | |
apalmieri | 95:e1f7ce04e71b | 377 | return result; |
Antonio Vilei |
74:c4526f8284d5 | 378 | } |
Antonio Vilei |
74:c4526f8284d5 | 379 | |
Antonio Vilei |
74:c4526f8284d5 | 380 | bool BlueNRGDevice::dataPresent() |
Antonio Vilei |
74:c4526f8284d5 | 381 | { |
Antonio Vilei |
74:c4526f8284d5 | 382 | return (irq_ == 1); |
Antonio Vilei |
74:c4526f8284d5 | 383 | } |
Antonio Vilei |
74:c4526f8284d5 | 384 | |
Antonio Vilei |
74:c4526f8284d5 | 385 | void BlueNRGDevice::disable_irq() |
Antonio Vilei |
74:c4526f8284d5 | 386 | { |
Antonio Vilei |
74:c4526f8284d5 | 387 | irq_.disable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 388 | } |
Antonio Vilei |
74:c4526f8284d5 | 389 | |
Antonio Vilei |
74:c4526f8284d5 | 390 | void BlueNRGDevice::enable_irq() |
Antonio Vilei |
74:c4526f8284d5 | 391 | { |
Antonio Vilei |
74:c4526f8284d5 | 392 | irq_.enable_irq(); |
Antonio Vilei |
74:c4526f8284d5 | 393 | } |