Devchannel Team / X_NUCLEO_IDB0XA1

Dependents:   Hello_BLE F446RE-BLE

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
apalmieri
Date:
Mon Sep 07 10:35:29 2015 +0000
Revision:
109:9e152b2453bc
Parent:
107:5cc5ac5bfbbb
Child:
110:1232b39de5cc
Handle stop Advertising on timeout

Who changed what in which revision?

UserRevisionLine numberNew 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>&copy; 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 109:9e152b2453bc 176 BlueNRGGap::getInstance().Process();
apalmieri 109:9e152b2453bc 177
apalmieri 95:e1f7ce04e71b 178 HCI_Process();//Send App Events??
apalmieri 95:e1f7ce04e71b 179
Silvio Lucio Oliva 70:d20d30f59b1c 180 }
Silvio Lucio Oliva 70:d20d30f59b1c 181
Silvio Lucio Oliva 70:d20d30f59b1c 182
Silvio Lucio Oliva 70:d20d30f59b1c 183 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 184 @brief get GAP version
Silvio Lucio Oliva 70:d20d30f59b1c 185 @param[in] void
Silvio Lucio Oliva 70:d20d30f59b1c 186 @returns char *
Silvio Lucio Oliva 70:d20d30f59b1c 187 */
Silvio Lucio Oliva 70:d20d30f59b1c 188 const char *BlueNRGDevice::getVersion(void)
Silvio Lucio Oliva 70:d20d30f59b1c 189 {
Silvio Lucio Oliva 70:d20d30f59b1c 190 char *version = new char[6];
Silvio Lucio Oliva 70:d20d30f59b1c 191 memcpy((void *)version, "1.0.0", 5);
Silvio Lucio Oliva 70:d20d30f59b1c 192 return version;
Silvio Lucio Oliva 70:d20d30f59b1c 193 }
Silvio Lucio Oliva 70:d20d30f59b1c 194
Silvio Lucio Oliva 70:d20d30f59b1c 195 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 196 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 197 @brief get init state
Silvio Lucio Oliva 70:d20d30f59b1c 198 @param[in] void
apalmieri 95:e1f7ce04e71b 199 @returns bool
Silvio Lucio Oliva 70:d20d30f59b1c 200 */
Silvio Lucio Oliva 70:d20d30f59b1c 201 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 202 bool BlueNRGDevice::getIsInitialized(void)
Silvio Lucio Oliva 70:d20d30f59b1c 203 {
Silvio Lucio Oliva 70:d20d30f59b1c 204 return isInitialized;
Silvio Lucio Oliva 70:d20d30f59b1c 205 }
Silvio Lucio Oliva 70:d20d30f59b1c 206
Silvio Lucio Oliva 70:d20d30f59b1c 207 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 208 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 209 @brief get reference to GAP object
Silvio Lucio Oliva 70:d20d30f59b1c 210 @param[in] void
apalmieri 95:e1f7ce04e71b 211 @returns Gap&
Silvio Lucio Oliva 70:d20d30f59b1c 212 */
Silvio Lucio Oliva 70:d20d30f59b1c 213 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 214 Gap &BlueNRGDevice::getGap()
Silvio Lucio Oliva 70:d20d30f59b1c 215 {
Silvio Lucio Oliva 70:d20d30f59b1c 216 return BlueNRGGap::getInstance();
Silvio Lucio Oliva 70:d20d30f59b1c 217 }
Silvio Lucio Oliva 70:d20d30f59b1c 218
Andrea Palmieri 77:332b416123b4 219 const Gap &BlueNRGDevice::getGap() const
Andrea Palmieri 77:332b416123b4 220 {
Andrea Palmieri 77:332b416123b4 221 return BlueNRGGap::getInstance();
Andrea Palmieri 77:332b416123b4 222 }
Andrea Palmieri 77:332b416123b4 223
Silvio Lucio Oliva 70:d20d30f59b1c 224 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 225 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 226 @brief get reference to GATT server object
Silvio Lucio Oliva 70:d20d30f59b1c 227 @param[in] void
apalmieri 95:e1f7ce04e71b 228 @returns GattServer&
Silvio Lucio Oliva 70:d20d30f59b1c 229 */
Silvio Lucio Oliva 70:d20d30f59b1c 230 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 231 GattServer &BlueNRGDevice::getGattServer()
Silvio Lucio Oliva 70:d20d30f59b1c 232 {
Silvio Lucio Oliva 70:d20d30f59b1c 233 return BlueNRGGattServer::getInstance();
Silvio Lucio Oliva 70:d20d30f59b1c 234 }
Silvio Lucio Oliva 70:d20d30f59b1c 235
Andrea Palmieri 77:332b416123b4 236 const GattServer &BlueNRGDevice::getGattServer() const
Silvio Lucio Oliva 70:d20d30f59b1c 237 {
Andrea Palmieri 77:332b416123b4 238 return BlueNRGGattServer::getInstance();
Silvio Lucio Oliva 70:d20d30f59b1c 239 }
Silvio Lucio Oliva 70:d20d30f59b1c 240
apalmieri 95:e1f7ce04e71b 241 //FIXME: TBI (by now just placeholders to let build
apalmieri 95:e1f7ce04e71b 242 GattClient& BlueNRGDevice::getGattClient() {}
apalmieri 95:e1f7ce04e71b 243 SecurityManager& BlueNRGDevice::getSecurityManager(){}
apalmieri 95:e1f7ce04e71b 244 const SecurityManager& BlueNRGDevice::getSecurityManager() const {}
apalmieri 95:e1f7ce04e71b 245
Silvio Lucio Oliva 70:d20d30f59b1c 246 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 247 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 248 @brief shut down the the BLE device
Silvio Lucio Oliva 70:d20d30f59b1c 249 @param[out] error if any
Silvio Lucio Oliva 70:d20d30f59b1c 250 */
Silvio Lucio Oliva 70:d20d30f59b1c 251 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 252 ble_error_t BlueNRGDevice::shutdown(void) {
Silvio Lucio Oliva 70:d20d30f59b1c 253 return reset();
Silvio Lucio Oliva 70:d20d30f59b1c 254 }
apalmieri 95:e1f7ce04e71b 255
Antonio Vilei 74:c4526f8284d5 256 /**
Antonio Vilei 74:c4526f8284d5 257 * @brief Reads from BlueNRG SPI buffer and store data into local buffer.
Antonio Vilei 74:c4526f8284d5 258 * @param buffer : Buffer where data from SPI are stored
Antonio Vilei 74:c4526f8284d5 259 * @param buff_size: Buffer size
Antonio Vilei 74:c4526f8284d5 260 * @retval int32_t : Number of read bytes
Antonio Vilei 74:c4526f8284d5 261 */
Antonio Vilei 74:c4526f8284d5 262 int32_t BlueNRGDevice::spiRead(uint8_t *buffer, uint8_t buff_size)
Antonio Vilei 74:c4526f8284d5 263 {
apalmieri 95:e1f7ce04e71b 264 uint16_t byte_count;
apalmieri 95:e1f7ce04e71b 265 uint8_t len = 0;
apalmieri 95:e1f7ce04e71b 266 uint8_t char_ff = 0xff;
apalmieri 95:e1f7ce04e71b 267 volatile uint8_t read_char;
apalmieri 95:e1f7ce04e71b 268
apalmieri 95:e1f7ce04e71b 269 uint8_t i = 0;
apalmieri 95:e1f7ce04e71b 270 volatile uint8_t tmpreg;
Antonio Vilei 74:c4526f8284d5 271
apalmieri 95:e1f7ce04e71b 272 uint8_t header_master[HEADER_SIZE] = {0x0b, 0x00, 0x00, 0x00, 0x00};
apalmieri 95:e1f7ce04e71b 273 uint8_t header_slave[HEADER_SIZE];
Antonio Vilei 74:c4526f8284d5 274
apalmieri 95:e1f7ce04e71b 275 /* Select the chip */
apalmieri 95:e1f7ce04e71b 276 nCS_ = 0;
apalmieri 95:e1f7ce04e71b 277
apalmieri 95:e1f7ce04e71b 278 /* Read the header */
apalmieri 95:e1f7ce04e71b 279 for (i = 0; i < 5; i++)
apalmieri 95:e1f7ce04e71b 280 {
apalmieri 95:e1f7ce04e71b 281 tmpreg = spi_.write(header_master[i]);
apalmieri 95:e1f7ce04e71b 282 header_slave[i] = (uint8_t)(tmpreg);
apalmieri 95:e1f7ce04e71b 283 }
apalmieri 95:e1f7ce04e71b 284
apalmieri 95:e1f7ce04e71b 285 if (header_slave[0] == 0x02) {
apalmieri 95:e1f7ce04e71b 286 /* device is ready */
apalmieri 95:e1f7ce04e71b 287 byte_count = (header_slave[4]<<8)|header_slave[3];
apalmieri 95:e1f7ce04e71b 288
apalmieri 95:e1f7ce04e71b 289 if (byte_count > 0) {
apalmieri 95:e1f7ce04e71b 290
apalmieri 95:e1f7ce04e71b 291 /* avoid to read more data that size of the buffer */
apalmieri 95:e1f7ce04e71b 292 if (byte_count > buff_size){
apalmieri 95:e1f7ce04e71b 293 byte_count = buff_size;
apalmieri 95:e1f7ce04e71b 294 }
apalmieri 95:e1f7ce04e71b 295
apalmieri 95:e1f7ce04e71b 296 for (len = 0; len < byte_count; len++){
apalmieri 95:e1f7ce04e71b 297 read_char = spi_.write(char_ff);
apalmieri 95:e1f7ce04e71b 298 buffer[len] = read_char;
apalmieri 95:e1f7ce04e71b 299 }
apalmieri 95:e1f7ce04e71b 300 }
apalmieri 95:e1f7ce04e71b 301 }
apalmieri 95:e1f7ce04e71b 302 /* Release CS line to deselect the chip */
apalmieri 95:e1f7ce04e71b 303 nCS_ = 1;
apalmieri 95:e1f7ce04e71b 304
apalmieri 95:e1f7ce04e71b 305 // Add a small delay to give time to the BlueNRG to set the IRQ pin low
apalmieri 95:e1f7ce04e71b 306 // to avoid a useless SPI read at the end of the transaction
apalmieri 95:e1f7ce04e71b 307 for(volatile int i = 0; i < 2; i++)__NOP();
apalmieri 95:e1f7ce04e71b 308
apalmieri 95:e1f7ce04e71b 309 #ifdef PRINT_CSV_FORMAT
apalmieri 95:e1f7ce04e71b 310 if (len > 0) {
apalmieri 107:5cc5ac5bfbbb 311 print_csv_time();
apalmieri 95:e1f7ce04e71b 312 for (int i=0; i<len; i++) {
apalmieri 95:e1f7ce04e71b 313 PRINT_CSV(" %02x", buffer[i]);
Wolfgang Betz 91:97c0c21046b4 314 }
apalmieri 95:e1f7ce04e71b 315 PRINT_CSV("\n");
apalmieri 95:e1f7ce04e71b 316 }
Antonio Vilei 74:c4526f8284d5 317 #endif
apalmieri 95:e1f7ce04e71b 318
apalmieri 95:e1f7ce04e71b 319 return len;
Antonio Vilei 74:c4526f8284d5 320 }
Antonio Vilei 74:c4526f8284d5 321
Antonio Vilei 74:c4526f8284d5 322 /**
Antonio Vilei 74:c4526f8284d5 323 * @brief Writes data from local buffer to SPI.
Antonio Vilei 74:c4526f8284d5 324 * @param data1 : First data buffer to be written
Antonio Vilei 74:c4526f8284d5 325 * @param data2 : Second data buffer to be written
Antonio Vilei 74:c4526f8284d5 326 * @param Nb_bytes1: Size of first data buffer to be written
Antonio Vilei 74:c4526f8284d5 327 * @param Nb_bytes2: Size of second data buffer to be written
Antonio Vilei 74:c4526f8284d5 328 * @retval Number of read bytes
Antonio Vilei 74:c4526f8284d5 329 */
Antonio Vilei 74:c4526f8284d5 330 int32_t BlueNRGDevice::spiWrite(uint8_t* data1,
apalmieri 95:e1f7ce04e71b 331 uint8_t* data2, uint8_t Nb_bytes1, uint8_t Nb_bytes2)
Antonio Vilei 74:c4526f8284d5 332 {
apalmieri 95:e1f7ce04e71b 333 int32_t result = 0;
apalmieri 95:e1f7ce04e71b 334
apalmieri 95:e1f7ce04e71b 335 uint32_t i;
apalmieri 95:e1f7ce04e71b 336 volatile uint8_t read_char;
apalmieri 95:e1f7ce04e71b 337 volatile uint8_t tmpreg;
Antonio Vilei 74:c4526f8284d5 338
apalmieri 95:e1f7ce04e71b 339 unsigned char header_master[HEADER_SIZE] = {0x0a, 0x00, 0x00, 0x00, 0x00};
apalmieri 95:e1f7ce04e71b 340 unsigned char header_slave[HEADER_SIZE] = {0xaa, 0x00, 0x00, 0x00, 0x00};
apalmieri 95:e1f7ce04e71b 341
apalmieri 95:e1f7ce04e71b 342 //unsigned char read_char_buf[MAX_BUFFER_SIZE];
Wolfgang Betz 91:97c0c21046b4 343
apalmieri 95:e1f7ce04e71b 344 disable_irq();
Antonio Vilei 74:c4526f8284d5 345
apalmieri 95:e1f7ce04e71b 346 /* CS reset */
apalmieri 95:e1f7ce04e71b 347 nCS_ = 0;
Antonio Vilei 74:c4526f8284d5 348
apalmieri 95:e1f7ce04e71b 349 /* Exchange header */
apalmieri 95:e1f7ce04e71b 350 for (i = 0; i < 5; i++)
apalmieri 95:e1f7ce04e71b 351 {
apalmieri 95:e1f7ce04e71b 352 tmpreg = spi_.write(header_master[i]);
apalmieri 95:e1f7ce04e71b 353 header_slave[i] = tmpreg;
apalmieri 95:e1f7ce04e71b 354 }
apalmieri 95:e1f7ce04e71b 355
apalmieri 95:e1f7ce04e71b 356 if (header_slave[0] == 0x02) {
apalmieri 95:e1f7ce04e71b 357 /* SPI is ready */
apalmieri 95:e1f7ce04e71b 358 if (header_slave[1] >= (Nb_bytes1+Nb_bytes2)) {
apalmieri 95:e1f7ce04e71b 359
apalmieri 95:e1f7ce04e71b 360 /* Buffer is big enough */
apalmieri 95:e1f7ce04e71b 361 for (i = 0; i < Nb_bytes1; i++) {
apalmieri 95:e1f7ce04e71b 362 read_char = spi_.write(*(data1 + i));
apalmieri 95:e1f7ce04e71b 363 }
apalmieri 95:e1f7ce04e71b 364 for (i = 0; i < Nb_bytes2; i++) {
apalmieri 95:e1f7ce04e71b 365 read_char = spi_.write(*(data2 + i));
apalmieri 95:e1f7ce04e71b 366 }
Antonio Vilei 74:c4526f8284d5 367 } else {
apalmieri 95:e1f7ce04e71b 368 /* Buffer is too small */
apalmieri 95:e1f7ce04e71b 369 result = -2;
Antonio Vilei 74:c4526f8284d5 370 }
apalmieri 95:e1f7ce04e71b 371 } else {
apalmieri 95:e1f7ce04e71b 372 /* SPI is not ready */
apalmieri 95:e1f7ce04e71b 373 result = -1;
apalmieri 95:e1f7ce04e71b 374 }
Antonio Vilei 74:c4526f8284d5 375
apalmieri 95:e1f7ce04e71b 376 /* Release CS line */
apalmieri 95:e1f7ce04e71b 377 //HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET);
apalmieri 95:e1f7ce04e71b 378 nCS_ = 1;
apalmieri 95:e1f7ce04e71b 379
apalmieri 95:e1f7ce04e71b 380 enable_irq();
Antonio Vilei 74:c4526f8284d5 381
apalmieri 95:e1f7ce04e71b 382 return result;
Antonio Vilei 74:c4526f8284d5 383 }
Antonio Vilei 74:c4526f8284d5 384
Antonio Vilei 74:c4526f8284d5 385 bool BlueNRGDevice::dataPresent()
Antonio Vilei 74:c4526f8284d5 386 {
Antonio Vilei 74:c4526f8284d5 387 return (irq_ == 1);
Antonio Vilei 74:c4526f8284d5 388 }
Antonio Vilei 74:c4526f8284d5 389
Antonio Vilei 74:c4526f8284d5 390 void BlueNRGDevice::disable_irq()
Antonio Vilei 74:c4526f8284d5 391 {
Antonio Vilei 74:c4526f8284d5 392 irq_.disable_irq();
Antonio Vilei 74:c4526f8284d5 393 }
Antonio Vilei 74:c4526f8284d5 394
Antonio Vilei 74:c4526f8284d5 395 void BlueNRGDevice::enable_irq()
Antonio Vilei 74:c4526f8284d5 396 {
Antonio Vilei 74:c4526f8284d5 397 irq_.enable_irq();
Antonio Vilei 74:c4526f8284d5 398 }