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:
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?

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