HW layer for the Nucleo board, it only work with old BLE_API

Dependents:   Hello_BLE F446RE-BLE

Fork of X_NUCLEO_IDB0XA1 by ST

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?

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 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 }