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:
avilei
Date:
Wed Jul 15 10:28:22 2015 +0000
Revision:
86:81b17a629630
Parent:
77:332b416123b4
Child:
93:728699ac5613
Use Arduino pin names instead of STM32Nucleo's ones

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 ******************************************************************************
Silvio Lucio Oliva 70:d20d30f59b1c 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>
Silvio Lucio Oliva 70:d20d30f59b1c 33 */
Silvio Lucio Oliva 70:d20d30f59b1c 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 */
Silvio Lucio Oliva 70:d20d30f59b1c 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" {
Antonio Vilei 74:c4526f8284d5 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 * FIXME: find a better way to create the BlueNRG device instance so that
avilei 86:81b17a629630 59 * the pin names can be chosen by the users of this class
avilei 86:81b17a629630 60 *
avilei 86:81b17a629630 61 * This is using Arduino pins as follows:
avilei 86:81b17a629630 62 * D11: MOSI line of SPI interface
avilei 86:81b17a629630 63 * D12: MISO line of SPI interface
avilei 86:81b17a629630 64 * D3 : SCK line of SPI interface
avilei 86:81b17a629630 65 * A1 : nCS line of SPI interface
avilei 86:81b17a629630 66 * D7 : BlueNRG reset
avilei 86:81b17a629630 67 * A0 : BlueNRG IRQ pin
Silvio Lucio Oliva 70:d20d30f59b1c 68 */
avilei 86:81b17a629630 69 BlueNRGDevice bluenrgDeviceInstance(D11, D12, D3, A1, D7, A0);
Silvio Lucio Oliva 70:d20d30f59b1c 70
Silvio Lucio Oliva 70:d20d30f59b1c 71 /**
Silvio Lucio Oliva 70:d20d30f59b1c 72 * BLE-API requires an implementation of the following function in order to
Silvio Lucio Oliva 70:d20d30f59b1c 73 * obtain its transport handle.
Silvio Lucio Oliva 70:d20d30f59b1c 74 */
Andrea Palmieri 77:332b416123b4 75 BLEInstanceBase *
Andrea Palmieri 77:332b416123b4 76 createBLEInstance(void)
Silvio Lucio Oliva 70:d20d30f59b1c 77 {
Antonio Vilei 74:c4526f8284d5 78 return (&bluenrgDeviceInstance);
Silvio Lucio Oliva 70:d20d30f59b1c 79 }
Silvio Lucio Oliva 70:d20d30f59b1c 80
Silvio Lucio Oliva 70:d20d30f59b1c 81 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 82 /**
Silvio Lucio Oliva 70:d20d30f59b1c 83 @brief Constructor
avilei 86:81b17a629630 84 * @param mosi mbed pin to use for MOSI line of SPI interface
avilei 86:81b17a629630 85 * @param miso mbed pin to use for MISO line of SPI interface
avilei 86:81b17a629630 86 * @param sck mbed pin to use for SCK line of SPI interface
avilei 86:81b17a629630 87 * @param cs mbed pin to use for not chip select line of SPI interface
avilei 86:81b17a629630 88 * @param rst mbed pin to use for BlueNRG reset
Antonio Vilei 74:c4526f8284d5 89 * @param irq mbed pin for BlueNRG IRQ
Silvio Lucio Oliva 70:d20d30f59b1c 90 */
Silvio Lucio Oliva 70:d20d30f59b1c 91 /**************************************************************************/
Antonio Vilei 74:c4526f8284d5 92 BlueNRGDevice::BlueNRGDevice(PinName mosi,
Antonio Vilei 74:c4526f8284d5 93 PinName miso,
Antonio Vilei 74:c4526f8284d5 94 PinName sck,
Antonio Vilei 74:c4526f8284d5 95 PinName cs,
Antonio Vilei 74:c4526f8284d5 96 PinName rst,
Antonio Vilei 74:c4526f8284d5 97 PinName irq) : spi_(mosi, miso, sck), nCS_(cs), rst_(rst), irq_(irq)
Silvio Lucio Oliva 70:d20d30f59b1c 98 {
Silvio Lucio Oliva 70:d20d30f59b1c 99 isInitialized = false;
Antonio Vilei 74:c4526f8284d5 100
Antonio Vilei 74:c4526f8284d5 101 // Setup the spi for 8 bit data, low clock polarity,
Antonio Vilei 74:c4526f8284d5 102 // 1-edge phase, with an 8MHz clock rate
Antonio Vilei 74:c4526f8284d5 103 spi_.format(8, 0);
Antonio Vilei 74:c4526f8284d5 104 spi_.frequency(8000000);
Antonio Vilei 74:c4526f8284d5 105
Antonio Vilei 74:c4526f8284d5 106 // Deselect the BlueNRG chip by keeping its nCS signal high
Antonio Vilei 74:c4526f8284d5 107 nCS_ = 1;
Antonio Vilei 74:c4526f8284d5 108
Antonio Vilei 74:c4526f8284d5 109 wait_us(500);
Silvio Lucio Oliva 70:d20d30f59b1c 110 }
Silvio Lucio Oliva 70:d20d30f59b1c 111
Silvio Lucio Oliva 70:d20d30f59b1c 112 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 113 /**
Silvio Lucio Oliva 70:d20d30f59b1c 114 @brief Destructor
Silvio Lucio Oliva 70:d20d30f59b1c 115 */
Silvio Lucio Oliva 70:d20d30f59b1c 116 /**************************************************************************/
Silvio Lucio Oliva 70:d20d30f59b1c 117 BlueNRGDevice::~BlueNRGDevice(void)
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 /**
Silvio Lucio Oliva 70:d20d30f59b1c 123 @brief Initialises anything required to start using BLE
Silvio Lucio Oliva 70:d20d30f59b1c 124 @param[in] void
Silvio Lucio Oliva 70:d20d30f59b1c 125 @returns ble_error_t
Silvio Lucio Oliva 70:d20d30f59b1c 126 */
Silvio Lucio Oliva 70:d20d30f59b1c 127 ble_error_t BlueNRGDevice::init(void)
Silvio Lucio Oliva 70:d20d30f59b1c 128 {
Antonio Vilei 74:c4526f8284d5 129 // Set the interrupt handler for the device
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());
Antonio Vilei 74:c4526f8284d5 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 */
Antonio Vilei 74:c4526f8284d5 152 rst_ = 0;
Antonio Vilei 74:c4526f8284d5 153 wait_us(5);
Antonio Vilei 74:c4526f8284d5 154 rst_ = 1;
Antonio Vilei 74:c4526f8284d5 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 /*!
Silvio Lucio Oliva 70:d20d30f59b1c 167 @brief Wait for any BLE Event like BLE Connection, Read Request etc.
Silvio Lucio Oliva 70:d20d30f59b1c 168 @param[in] void
Silvio Lucio Oliva 70:d20d30f59b1c 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 {
Silvio Lucio Oliva 70:d20d30f59b1c 173 HCI_Process();//Send App Events??
Silvio Lucio Oliva 70:d20d30f59b1c 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
Silvio Lucio Oliva 70:d20d30f59b1c 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
Silvio Lucio Oliva 70:d20d30f59b1c 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
Silvio Lucio Oliva 70:d20d30f59b1c 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
Andrea Palmieri 77:332b416123b4 236 //FIXME: TBI (by now just placeholders to let build
Andrea Palmieri 77:332b416123b4 237 GattClient& BlueNRGDevice::getGattClient() {}
Andrea Palmieri 77:332b416123b4 238 SecurityManager& BlueNRGDevice::getSecurityManager(){}
Andrea Palmieri 77:332b416123b4 239 const SecurityManager& BlueNRGDevice::getSecurityManager() const {}
Andrea Palmieri 77:332b416123b4 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 }
Antonio Vilei 74:c4526f8284d5 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 {
Antonio Vilei 74:c4526f8284d5 259 uint16_t byte_count;
Antonio Vilei 74:c4526f8284d5 260 uint8_t len = 0;
Antonio Vilei 74:c4526f8284d5 261 uint8_t char_ff = 0xff;
Antonio Vilei 74:c4526f8284d5 262 volatile uint8_t read_char;
Antonio Vilei 74:c4526f8284d5 263
Antonio Vilei 74:c4526f8284d5 264 uint8_t i = 0;
Antonio Vilei 74:c4526f8284d5 265 volatile uint8_t tmpreg;
Antonio Vilei 74:c4526f8284d5 266
Antonio Vilei 74:c4526f8284d5 267 uint8_t header_master[HEADER_SIZE] = {0x0b, 0x00, 0x00, 0x00, 0x00};
Antonio Vilei 74:c4526f8284d5 268 uint8_t header_slave[HEADER_SIZE];
Antonio Vilei 74:c4526f8284d5 269
Antonio Vilei 74:c4526f8284d5 270 /* Select the chip */
Antonio Vilei 74:c4526f8284d5 271 nCS_ = 0;
Antonio Vilei 74:c4526f8284d5 272
Antonio Vilei 74:c4526f8284d5 273 /* Read the header */
Antonio Vilei 74:c4526f8284d5 274 for (i = 0; i < 5; i++)
Antonio Vilei 74:c4526f8284d5 275 {
Antonio Vilei 74:c4526f8284d5 276 tmpreg = spi_.write(header_master[i]);
Antonio Vilei 74:c4526f8284d5 277 header_slave[i] = (uint8_t)(tmpreg);
Antonio Vilei 74:c4526f8284d5 278 }
Antonio Vilei 74:c4526f8284d5 279
Antonio Vilei 74:c4526f8284d5 280 if (header_slave[0] == 0x02) {
Antonio Vilei 74:c4526f8284d5 281 /* device is ready */
Antonio Vilei 74:c4526f8284d5 282 byte_count = (header_slave[4]<<8)|header_slave[3];
Antonio Vilei 74:c4526f8284d5 283
Antonio Vilei 74:c4526f8284d5 284 if (byte_count > 0) {
Antonio Vilei 74:c4526f8284d5 285
Antonio Vilei 74:c4526f8284d5 286 /* avoid to read more data that size of the buffer */
Antonio Vilei 74:c4526f8284d5 287 if (byte_count > buff_size){
Antonio Vilei 74:c4526f8284d5 288 byte_count = buff_size;
Antonio Vilei 74:c4526f8284d5 289 }
Antonio Vilei 74:c4526f8284d5 290
Antonio Vilei 74:c4526f8284d5 291 for (len = 0; len < byte_count; len++){
Antonio Vilei 74:c4526f8284d5 292 read_char = spi_.write(char_ff);
Antonio Vilei 74:c4526f8284d5 293 buffer[len] = read_char;
Antonio Vilei 74:c4526f8284d5 294 }
Antonio Vilei 74:c4526f8284d5 295 }
Antonio Vilei 74:c4526f8284d5 296 }
Antonio Vilei 74:c4526f8284d5 297 /* Release CS line to deselect the chip */
Antonio Vilei 74:c4526f8284d5 298 nCS_ = 1;
Antonio Vilei 74:c4526f8284d5 299
Antonio Vilei 74:c4526f8284d5 300 // Add a small delay to give time to the BlueNRG to set the IRQ pin low
Antonio Vilei 74:c4526f8284d5 301 // to avoid a useless SPI read at the end of the transaction
Antonio Vilei 74:c4526f8284d5 302 for(volatile int i = 0; i < 2; i++)__NOP();
Antonio Vilei 74:c4526f8284d5 303
Antonio Vilei 74:c4526f8284d5 304 #ifdef PRINT_CSV_FORMAT
Antonio Vilei 74:c4526f8284d5 305 if (len > 0) {
Antonio Vilei 74:c4526f8284d5 306 // print_csv_time();
Antonio Vilei 74:c4526f8284d5 307 for (int i=0; i<len; i++) {
Antonio Vilei 74:c4526f8284d5 308 PRINT_CSV(" %02x", buffer[i]);
Antonio Vilei 74:c4526f8284d5 309 }
Antonio Vilei 74:c4526f8284d5 310 PRINT_CSV("\n");
Antonio Vilei 74:c4526f8284d5 311 }
Antonio Vilei 74:c4526f8284d5 312 #endif
Antonio Vilei 74:c4526f8284d5 313
Antonio Vilei 74:c4526f8284d5 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,
Antonio Vilei 74:c4526f8284d5 326 uint8_t* data2, uint8_t Nb_bytes1, uint8_t Nb_bytes2)
Antonio Vilei 74:c4526f8284d5 327 {
Antonio Vilei 74:c4526f8284d5 328 int32_t result = 0;
Antonio Vilei 74:c4526f8284d5 329
Antonio Vilei 74:c4526f8284d5 330 uint32_t i;
Antonio Vilei 74:c4526f8284d5 331 volatile uint8_t read_char;
Antonio Vilei 74:c4526f8284d5 332 volatile uint8_t tmpreg;
Antonio Vilei 74:c4526f8284d5 333
Antonio Vilei 74:c4526f8284d5 334 unsigned char header_master[HEADER_SIZE] = {0x0a, 0x00, 0x00, 0x00, 0x00};
Antonio Vilei 74:c4526f8284d5 335 unsigned char header_slave[HEADER_SIZE] = {0xaa, 0x00, 0x00, 0x00, 0x00};
Antonio Vilei 74:c4526f8284d5 336
Andrea Palmieri 77:332b416123b4 337 //unsigned char read_char_buf[MAX_BUFFER_SIZE];
Antonio Vilei 74:c4526f8284d5 338
Antonio Vilei 74:c4526f8284d5 339 disable_irq();
Antonio Vilei 74:c4526f8284d5 340
Antonio Vilei 74:c4526f8284d5 341 /* CS reset */
Antonio Vilei 74:c4526f8284d5 342 nCS_ = 0;
Antonio Vilei 74:c4526f8284d5 343
Antonio Vilei 74:c4526f8284d5 344 /* Exchange header */
Antonio Vilei 74:c4526f8284d5 345 for (i = 0; i < 5; i++)
Antonio Vilei 74:c4526f8284d5 346 {
Antonio Vilei 74:c4526f8284d5 347 tmpreg = spi_.write(header_master[i]);
Antonio Vilei 74:c4526f8284d5 348 header_slave[i] = tmpreg;
Antonio Vilei 74:c4526f8284d5 349 }
Antonio Vilei 74:c4526f8284d5 350
Antonio Vilei 74:c4526f8284d5 351 if (header_slave[0] == 0x02) {
Antonio Vilei 74:c4526f8284d5 352 /* SPI is ready */
Antonio Vilei 74:c4526f8284d5 353 if (header_slave[1] >= (Nb_bytes1+Nb_bytes2)) {
Antonio Vilei 74:c4526f8284d5 354
Antonio Vilei 74:c4526f8284d5 355 /* Buffer is big enough */
Antonio Vilei 74:c4526f8284d5 356 for (i = 0; i < Nb_bytes1; i++) {
Antonio Vilei 74:c4526f8284d5 357 read_char = spi_.write(*(data1 + i));
Antonio Vilei 74:c4526f8284d5 358 }
Antonio Vilei 74:c4526f8284d5 359 for (i = 0; i < Nb_bytes2; i++) {
Antonio Vilei 74:c4526f8284d5 360 read_char = spi_.write(*(data2 + i));
Antonio Vilei 74:c4526f8284d5 361 }
Antonio Vilei 74:c4526f8284d5 362 } else {
Antonio Vilei 74:c4526f8284d5 363 /* Buffer is too small */
Antonio Vilei 74:c4526f8284d5 364 result = -2;
Antonio Vilei 74:c4526f8284d5 365 }
Antonio Vilei 74:c4526f8284d5 366 } else {
Antonio Vilei 74:c4526f8284d5 367 /* SPI is not ready */
Antonio Vilei 74:c4526f8284d5 368 result = -1;
Antonio Vilei 74:c4526f8284d5 369 }
Antonio Vilei 74:c4526f8284d5 370
Antonio Vilei 74:c4526f8284d5 371 /* Release CS line */
Antonio Vilei 74:c4526f8284d5 372 //HAL_GPIO_WritePin(BNRG_SPI_CS_PORT, BNRG_SPI_CS_PIN, GPIO_PIN_SET);
Antonio Vilei 74:c4526f8284d5 373 nCS_ = 1;
Antonio Vilei 74:c4526f8284d5 374
Antonio Vilei 74:c4526f8284d5 375 enable_irq();
Antonio Vilei 74:c4526f8284d5 376
Antonio Vilei 74:c4526f8284d5 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 }