david lukofsky / Mbed 2 deprecated STM32_read_analog

Dependencies:   mbed

Committer:
lukofsky
Date:
Tue Nov 13 19:27:58 2018 +0000
Revision:
1:df1ae6d3fd03
Memulator;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lukofsky 1:df1ae6d3fd03 1 ////////////////////////////////////////////////////////////////////////
lukofsky 1:df1ae6d3fd03 2 // NOTE: two changes
lukofsky 1:df1ae6d3fd03 3 // (1) include "mySPI.h" instead of "SPI.h"
lukofsky 1:df1ae6d3fd03 4 // (2) commented out lock, _acquire, and unlock from the write method
lukofsky 1:df1ae6d3fd03 5 ////////////////////////////////////////////////////////////////////////
lukofsky 1:df1ae6d3fd03 6
lukofsky 1:df1ae6d3fd03 7 /* mbed Microcontroller Library
lukofsky 1:df1ae6d3fd03 8
lukofsky 1:df1ae6d3fd03 9 * Copyright (c) 2006-2013 ARM Limited
lukofsky 1:df1ae6d3fd03 10
lukofsky 1:df1ae6d3fd03 11 *
lukofsky 1:df1ae6d3fd03 12
lukofsky 1:df1ae6d3fd03 13 * Licensed under the Apache License, Version 2.0 (the "License");
lukofsky 1:df1ae6d3fd03 14
lukofsky 1:df1ae6d3fd03 15 * you may not use this file except in compliance with the License.
lukofsky 1:df1ae6d3fd03 16
lukofsky 1:df1ae6d3fd03 17 * You may obtain a copy of the License at
lukofsky 1:df1ae6d3fd03 18
lukofsky 1:df1ae6d3fd03 19 *
lukofsky 1:df1ae6d3fd03 20
lukofsky 1:df1ae6d3fd03 21 * http://www.apache.org/licenses/LICENSE-2.0
lukofsky 1:df1ae6d3fd03 22
lukofsky 1:df1ae6d3fd03 23 *
lukofsky 1:df1ae6d3fd03 24
lukofsky 1:df1ae6d3fd03 25 * Unless required by applicable law or agreed to in writing, software
lukofsky 1:df1ae6d3fd03 26
lukofsky 1:df1ae6d3fd03 27 * distributed under the License is distributed on an "AS IS" BASIS,
lukofsky 1:df1ae6d3fd03 28
lukofsky 1:df1ae6d3fd03 29 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
lukofsky 1:df1ae6d3fd03 30
lukofsky 1:df1ae6d3fd03 31 * See the License for the specific language governing permissions and
lukofsky 1:df1ae6d3fd03 32
lukofsky 1:df1ae6d3fd03 33 * limitations under the License.
lukofsky 1:df1ae6d3fd03 34
lukofsky 1:df1ae6d3fd03 35 */
lukofsky 1:df1ae6d3fd03 36
lukofsky 1:df1ae6d3fd03 37 // include custom SPI header file instead of default SPI header file
lukofsky 1:df1ae6d3fd03 38 //#include "drivers/SPI.h"
lukofsky 1:df1ae6d3fd03 39 #include "mySPI.h"
lukofsky 1:df1ae6d3fd03 40
lukofsky 1:df1ae6d3fd03 41 #include "platform/mbed_critical.h"
lukofsky 1:df1ae6d3fd03 42
lukofsky 1:df1ae6d3fd03 43
lukofsky 1:df1ae6d3fd03 44
lukofsky 1:df1ae6d3fd03 45 #if DEVICE_SPI_ASYNCH
lukofsky 1:df1ae6d3fd03 46
lukofsky 1:df1ae6d3fd03 47 #include "platform/mbed_power_mgmt.h"
lukofsky 1:df1ae6d3fd03 48
lukofsky 1:df1ae6d3fd03 49 #endif
lukofsky 1:df1ae6d3fd03 50
lukofsky 1:df1ae6d3fd03 51
lukofsky 1:df1ae6d3fd03 52
lukofsky 1:df1ae6d3fd03 53 #if DEVICE_SPI
lukofsky 1:df1ae6d3fd03 54
lukofsky 1:df1ae6d3fd03 55
lukofsky 1:df1ae6d3fd03 56
lukofsky 1:df1ae6d3fd03 57 namespace mbed {
lukofsky 1:df1ae6d3fd03 58
lukofsky 1:df1ae6d3fd03 59
lukofsky 1:df1ae6d3fd03 60
lukofsky 1:df1ae6d3fd03 61 #if DEVICE_SPI_ASYNCH && TRANSACTION_QUEUE_SIZE_SPI
lukofsky 1:df1ae6d3fd03 62
lukofsky 1:df1ae6d3fd03 63 CircularBuffer<Transaction<SPI>, TRANSACTION_QUEUE_SIZE_SPI> SPI::_transaction_buffer;
lukofsky 1:df1ae6d3fd03 64
lukofsky 1:df1ae6d3fd03 65 #endif
lukofsky 1:df1ae6d3fd03 66
lukofsky 1:df1ae6d3fd03 67
lukofsky 1:df1ae6d3fd03 68
lukofsky 1:df1ae6d3fd03 69 SPI::SPI(PinName mosi, PinName miso, PinName sclk, PinName ssel) :
lukofsky 1:df1ae6d3fd03 70
lukofsky 1:df1ae6d3fd03 71 _spi(),
lukofsky 1:df1ae6d3fd03 72
lukofsky 1:df1ae6d3fd03 73 #if DEVICE_SPI_ASYNCH
lukofsky 1:df1ae6d3fd03 74
lukofsky 1:df1ae6d3fd03 75 _irq(this),
lukofsky 1:df1ae6d3fd03 76
lukofsky 1:df1ae6d3fd03 77 _usage(DMA_USAGE_NEVER),
lukofsky 1:df1ae6d3fd03 78
lukofsky 1:df1ae6d3fd03 79 _deep_sleep_locked(false),
lukofsky 1:df1ae6d3fd03 80
lukofsky 1:df1ae6d3fd03 81 #endif
lukofsky 1:df1ae6d3fd03 82
lukofsky 1:df1ae6d3fd03 83 _bits(8),
lukofsky 1:df1ae6d3fd03 84
lukofsky 1:df1ae6d3fd03 85 _mode(0),
lukofsky 1:df1ae6d3fd03 86
lukofsky 1:df1ae6d3fd03 87 _hz(1000000),
lukofsky 1:df1ae6d3fd03 88
lukofsky 1:df1ae6d3fd03 89 _write_fill(SPI_FILL_CHAR)
lukofsky 1:df1ae6d3fd03 90
lukofsky 1:df1ae6d3fd03 91 {
lukofsky 1:df1ae6d3fd03 92
lukofsky 1:df1ae6d3fd03 93 // No lock needed in the constructor
lukofsky 1:df1ae6d3fd03 94
lukofsky 1:df1ae6d3fd03 95
lukofsky 1:df1ae6d3fd03 96
lukofsky 1:df1ae6d3fd03 97 spi_init(&_spi, mosi, miso, sclk, ssel);
lukofsky 1:df1ae6d3fd03 98
lukofsky 1:df1ae6d3fd03 99 _acquire();
lukofsky 1:df1ae6d3fd03 100
lukofsky 1:df1ae6d3fd03 101 }
lukofsky 1:df1ae6d3fd03 102
lukofsky 1:df1ae6d3fd03 103
lukofsky 1:df1ae6d3fd03 104
lukofsky 1:df1ae6d3fd03 105 void SPI::format(int bits, int mode)
lukofsky 1:df1ae6d3fd03 106
lukofsky 1:df1ae6d3fd03 107 {
lukofsky 1:df1ae6d3fd03 108
lukofsky 1:df1ae6d3fd03 109 lock();
lukofsky 1:df1ae6d3fd03 110
lukofsky 1:df1ae6d3fd03 111 _bits = bits;
lukofsky 1:df1ae6d3fd03 112
lukofsky 1:df1ae6d3fd03 113 _mode = mode;
lukofsky 1:df1ae6d3fd03 114
lukofsky 1:df1ae6d3fd03 115 // If changing format while you are the owner then just
lukofsky 1:df1ae6d3fd03 116
lukofsky 1:df1ae6d3fd03 117 // update format, but if owner is changed then even frequency should be
lukofsky 1:df1ae6d3fd03 118
lukofsky 1:df1ae6d3fd03 119 // updated which is done by acquire.
lukofsky 1:df1ae6d3fd03 120
lukofsky 1:df1ae6d3fd03 121 if (_owner == this) {
lukofsky 1:df1ae6d3fd03 122
lukofsky 1:df1ae6d3fd03 123 spi_format(&_spi, _bits, _mode, 0);
lukofsky 1:df1ae6d3fd03 124
lukofsky 1:df1ae6d3fd03 125 } else {
lukofsky 1:df1ae6d3fd03 126
lukofsky 1:df1ae6d3fd03 127 _acquire();
lukofsky 1:df1ae6d3fd03 128
lukofsky 1:df1ae6d3fd03 129 }
lukofsky 1:df1ae6d3fd03 130
lukofsky 1:df1ae6d3fd03 131 unlock();
lukofsky 1:df1ae6d3fd03 132
lukofsky 1:df1ae6d3fd03 133 }
lukofsky 1:df1ae6d3fd03 134
lukofsky 1:df1ae6d3fd03 135
lukofsky 1:df1ae6d3fd03 136
lukofsky 1:df1ae6d3fd03 137 void SPI::frequency(int hz)
lukofsky 1:df1ae6d3fd03 138
lukofsky 1:df1ae6d3fd03 139 {
lukofsky 1:df1ae6d3fd03 140
lukofsky 1:df1ae6d3fd03 141 lock();
lukofsky 1:df1ae6d3fd03 142
lukofsky 1:df1ae6d3fd03 143 _hz = hz;
lukofsky 1:df1ae6d3fd03 144
lukofsky 1:df1ae6d3fd03 145 // If changing format while you are the owner then just
lukofsky 1:df1ae6d3fd03 146
lukofsky 1:df1ae6d3fd03 147 // update frequency, but if owner is changed then even frequency should be
lukofsky 1:df1ae6d3fd03 148
lukofsky 1:df1ae6d3fd03 149 // updated which is done by acquire.
lukofsky 1:df1ae6d3fd03 150
lukofsky 1:df1ae6d3fd03 151 if (_owner == this) {
lukofsky 1:df1ae6d3fd03 152
lukofsky 1:df1ae6d3fd03 153 spi_frequency(&_spi, _hz);
lukofsky 1:df1ae6d3fd03 154
lukofsky 1:df1ae6d3fd03 155 } else {
lukofsky 1:df1ae6d3fd03 156
lukofsky 1:df1ae6d3fd03 157 _acquire();
lukofsky 1:df1ae6d3fd03 158
lukofsky 1:df1ae6d3fd03 159 }
lukofsky 1:df1ae6d3fd03 160
lukofsky 1:df1ae6d3fd03 161 unlock();
lukofsky 1:df1ae6d3fd03 162
lukofsky 1:df1ae6d3fd03 163 }
lukofsky 1:df1ae6d3fd03 164
lukofsky 1:df1ae6d3fd03 165
lukofsky 1:df1ae6d3fd03 166
lukofsky 1:df1ae6d3fd03 167 SPI *SPI::_owner = NULL;
lukofsky 1:df1ae6d3fd03 168
lukofsky 1:df1ae6d3fd03 169 SingletonPtr<PlatformMutex> SPI::_mutex;
lukofsky 1:df1ae6d3fd03 170
lukofsky 1:df1ae6d3fd03 171
lukofsky 1:df1ae6d3fd03 172
lukofsky 1:df1ae6d3fd03 173 // ignore the fact there are multiple physical spis, and always update if it wasn't us last
lukofsky 1:df1ae6d3fd03 174
lukofsky 1:df1ae6d3fd03 175 void SPI::aquire()
lukofsky 1:df1ae6d3fd03 176
lukofsky 1:df1ae6d3fd03 177 {
lukofsky 1:df1ae6d3fd03 178
lukofsky 1:df1ae6d3fd03 179 lock();
lukofsky 1:df1ae6d3fd03 180
lukofsky 1:df1ae6d3fd03 181 if (_owner != this) {
lukofsky 1:df1ae6d3fd03 182
lukofsky 1:df1ae6d3fd03 183 spi_format(&_spi, _bits, _mode, 0);
lukofsky 1:df1ae6d3fd03 184
lukofsky 1:df1ae6d3fd03 185 spi_frequency(&_spi, _hz);
lukofsky 1:df1ae6d3fd03 186
lukofsky 1:df1ae6d3fd03 187 _owner = this;
lukofsky 1:df1ae6d3fd03 188
lukofsky 1:df1ae6d3fd03 189 }
lukofsky 1:df1ae6d3fd03 190
lukofsky 1:df1ae6d3fd03 191 unlock();
lukofsky 1:df1ae6d3fd03 192
lukofsky 1:df1ae6d3fd03 193 }
lukofsky 1:df1ae6d3fd03 194
lukofsky 1:df1ae6d3fd03 195
lukofsky 1:df1ae6d3fd03 196
lukofsky 1:df1ae6d3fd03 197 // Note: Private function with no locking
lukofsky 1:df1ae6d3fd03 198
lukofsky 1:df1ae6d3fd03 199 void SPI::_acquire()
lukofsky 1:df1ae6d3fd03 200
lukofsky 1:df1ae6d3fd03 201 {
lukofsky 1:df1ae6d3fd03 202
lukofsky 1:df1ae6d3fd03 203 if (_owner != this) {
lukofsky 1:df1ae6d3fd03 204
lukofsky 1:df1ae6d3fd03 205 spi_format(&_spi, _bits, _mode, 0);
lukofsky 1:df1ae6d3fd03 206
lukofsky 1:df1ae6d3fd03 207 spi_frequency(&_spi, _hz);
lukofsky 1:df1ae6d3fd03 208
lukofsky 1:df1ae6d3fd03 209 _owner = this;
lukofsky 1:df1ae6d3fd03 210
lukofsky 1:df1ae6d3fd03 211 }
lukofsky 1:df1ae6d3fd03 212
lukofsky 1:df1ae6d3fd03 213 }
lukofsky 1:df1ae6d3fd03 214
lukofsky 1:df1ae6d3fd03 215
lukofsky 1:df1ae6d3fd03 216
lukofsky 1:df1ae6d3fd03 217 int SPI::write(int value)
lukofsky 1:df1ae6d3fd03 218
lukofsky 1:df1ae6d3fd03 219 {
lukofsky 1:df1ae6d3fd03 220
lukofsky 1:df1ae6d3fd03 221 // lock();
lukofsky 1:df1ae6d3fd03 222
lukofsky 1:df1ae6d3fd03 223 // _acquire();
lukofsky 1:df1ae6d3fd03 224
lukofsky 1:df1ae6d3fd03 225 int ret = spi_master_write(&_spi, value);
lukofsky 1:df1ae6d3fd03 226
lukofsky 1:df1ae6d3fd03 227 // unlock();
lukofsky 1:df1ae6d3fd03 228
lukofsky 1:df1ae6d3fd03 229 return ret;
lukofsky 1:df1ae6d3fd03 230
lukofsky 1:df1ae6d3fd03 231 }
lukofsky 1:df1ae6d3fd03 232
lukofsky 1:df1ae6d3fd03 233
lukofsky 1:df1ae6d3fd03 234
lukofsky 1:df1ae6d3fd03 235 int SPI::write(const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length)
lukofsky 1:df1ae6d3fd03 236
lukofsky 1:df1ae6d3fd03 237 {
lukofsky 1:df1ae6d3fd03 238
lukofsky 1:df1ae6d3fd03 239 lock();
lukofsky 1:df1ae6d3fd03 240
lukofsky 1:df1ae6d3fd03 241 _acquire();
lukofsky 1:df1ae6d3fd03 242
lukofsky 1:df1ae6d3fd03 243 int ret = spi_master_block_write(&_spi, tx_buffer, tx_length, rx_buffer, rx_length, _write_fill);
lukofsky 1:df1ae6d3fd03 244
lukofsky 1:df1ae6d3fd03 245 unlock();
lukofsky 1:df1ae6d3fd03 246
lukofsky 1:df1ae6d3fd03 247 return ret;
lukofsky 1:df1ae6d3fd03 248
lukofsky 1:df1ae6d3fd03 249 }
lukofsky 1:df1ae6d3fd03 250
lukofsky 1:df1ae6d3fd03 251
lukofsky 1:df1ae6d3fd03 252
lukofsky 1:df1ae6d3fd03 253 void SPI::lock()
lukofsky 1:df1ae6d3fd03 254
lukofsky 1:df1ae6d3fd03 255 {
lukofsky 1:df1ae6d3fd03 256
lukofsky 1:df1ae6d3fd03 257 _mutex->lock();
lukofsky 1:df1ae6d3fd03 258
lukofsky 1:df1ae6d3fd03 259 }
lukofsky 1:df1ae6d3fd03 260
lukofsky 1:df1ae6d3fd03 261
lukofsky 1:df1ae6d3fd03 262
lukofsky 1:df1ae6d3fd03 263 void SPI::unlock()
lukofsky 1:df1ae6d3fd03 264
lukofsky 1:df1ae6d3fd03 265 {
lukofsky 1:df1ae6d3fd03 266
lukofsky 1:df1ae6d3fd03 267 _mutex->unlock();
lukofsky 1:df1ae6d3fd03 268
lukofsky 1:df1ae6d3fd03 269 }
lukofsky 1:df1ae6d3fd03 270
lukofsky 1:df1ae6d3fd03 271
lukofsky 1:df1ae6d3fd03 272
lukofsky 1:df1ae6d3fd03 273 void SPI::set_default_write_value(char data)
lukofsky 1:df1ae6d3fd03 274
lukofsky 1:df1ae6d3fd03 275 {
lukofsky 1:df1ae6d3fd03 276
lukofsky 1:df1ae6d3fd03 277 lock();
lukofsky 1:df1ae6d3fd03 278
lukofsky 1:df1ae6d3fd03 279 _write_fill = data;
lukofsky 1:df1ae6d3fd03 280
lukofsky 1:df1ae6d3fd03 281 unlock();
lukofsky 1:df1ae6d3fd03 282
lukofsky 1:df1ae6d3fd03 283 }
lukofsky 1:df1ae6d3fd03 284
lukofsky 1:df1ae6d3fd03 285
lukofsky 1:df1ae6d3fd03 286
lukofsky 1:df1ae6d3fd03 287 #if DEVICE_SPI_ASYNCH
lukofsky 1:df1ae6d3fd03 288
lukofsky 1:df1ae6d3fd03 289
lukofsky 1:df1ae6d3fd03 290
lukofsky 1:df1ae6d3fd03 291 int SPI::transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length, unsigned char bit_width, const event_callback_t &callback, int event)
lukofsky 1:df1ae6d3fd03 292
lukofsky 1:df1ae6d3fd03 293 {
lukofsky 1:df1ae6d3fd03 294
lukofsky 1:df1ae6d3fd03 295 if (spi_active(&_spi)) {
lukofsky 1:df1ae6d3fd03 296
lukofsky 1:df1ae6d3fd03 297 return queue_transfer(tx_buffer, tx_length, rx_buffer, rx_length, bit_width, callback, event);
lukofsky 1:df1ae6d3fd03 298
lukofsky 1:df1ae6d3fd03 299 }
lukofsky 1:df1ae6d3fd03 300
lukofsky 1:df1ae6d3fd03 301 start_transfer(tx_buffer, tx_length, rx_buffer, rx_length, bit_width, callback, event);
lukofsky 1:df1ae6d3fd03 302
lukofsky 1:df1ae6d3fd03 303 return 0;
lukofsky 1:df1ae6d3fd03 304
lukofsky 1:df1ae6d3fd03 305 }
lukofsky 1:df1ae6d3fd03 306
lukofsky 1:df1ae6d3fd03 307
lukofsky 1:df1ae6d3fd03 308
lukofsky 1:df1ae6d3fd03 309 void SPI::abort_transfer()
lukofsky 1:df1ae6d3fd03 310
lukofsky 1:df1ae6d3fd03 311 {
lukofsky 1:df1ae6d3fd03 312
lukofsky 1:df1ae6d3fd03 313 spi_abort_asynch(&_spi);
lukofsky 1:df1ae6d3fd03 314
lukofsky 1:df1ae6d3fd03 315 unlock_deep_sleep();
lukofsky 1:df1ae6d3fd03 316
lukofsky 1:df1ae6d3fd03 317 #if TRANSACTION_QUEUE_SIZE_SPI
lukofsky 1:df1ae6d3fd03 318
lukofsky 1:df1ae6d3fd03 319 dequeue_transaction();
lukofsky 1:df1ae6d3fd03 320
lukofsky 1:df1ae6d3fd03 321 #endif
lukofsky 1:df1ae6d3fd03 322
lukofsky 1:df1ae6d3fd03 323 }
lukofsky 1:df1ae6d3fd03 324
lukofsky 1:df1ae6d3fd03 325
lukofsky 1:df1ae6d3fd03 326
lukofsky 1:df1ae6d3fd03 327
lukofsky 1:df1ae6d3fd03 328
lukofsky 1:df1ae6d3fd03 329 void SPI::clear_transfer_buffer()
lukofsky 1:df1ae6d3fd03 330
lukofsky 1:df1ae6d3fd03 331 {
lukofsky 1:df1ae6d3fd03 332
lukofsky 1:df1ae6d3fd03 333 #if TRANSACTION_QUEUE_SIZE_SPI
lukofsky 1:df1ae6d3fd03 334
lukofsky 1:df1ae6d3fd03 335 _transaction_buffer.reset();
lukofsky 1:df1ae6d3fd03 336
lukofsky 1:df1ae6d3fd03 337 #endif
lukofsky 1:df1ae6d3fd03 338
lukofsky 1:df1ae6d3fd03 339 }
lukofsky 1:df1ae6d3fd03 340
lukofsky 1:df1ae6d3fd03 341
lukofsky 1:df1ae6d3fd03 342
lukofsky 1:df1ae6d3fd03 343 void SPI::abort_all_transfers()
lukofsky 1:df1ae6d3fd03 344
lukofsky 1:df1ae6d3fd03 345 {
lukofsky 1:df1ae6d3fd03 346
lukofsky 1:df1ae6d3fd03 347 clear_transfer_buffer();
lukofsky 1:df1ae6d3fd03 348
lukofsky 1:df1ae6d3fd03 349 abort_transfer();
lukofsky 1:df1ae6d3fd03 350
lukofsky 1:df1ae6d3fd03 351 }
lukofsky 1:df1ae6d3fd03 352
lukofsky 1:df1ae6d3fd03 353
lukofsky 1:df1ae6d3fd03 354
lukofsky 1:df1ae6d3fd03 355 int SPI::set_dma_usage(DMAUsage usage)
lukofsky 1:df1ae6d3fd03 356
lukofsky 1:df1ae6d3fd03 357 {
lukofsky 1:df1ae6d3fd03 358
lukofsky 1:df1ae6d3fd03 359 if (spi_active(&_spi)) {
lukofsky 1:df1ae6d3fd03 360
lukofsky 1:df1ae6d3fd03 361 return -1;
lukofsky 1:df1ae6d3fd03 362
lukofsky 1:df1ae6d3fd03 363 }
lukofsky 1:df1ae6d3fd03 364
lukofsky 1:df1ae6d3fd03 365 _usage = usage;
lukofsky 1:df1ae6d3fd03 366
lukofsky 1:df1ae6d3fd03 367 return 0;
lukofsky 1:df1ae6d3fd03 368
lukofsky 1:df1ae6d3fd03 369 }
lukofsky 1:df1ae6d3fd03 370
lukofsky 1:df1ae6d3fd03 371
lukofsky 1:df1ae6d3fd03 372
lukofsky 1:df1ae6d3fd03 373 int SPI::queue_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length, unsigned char bit_width, const event_callback_t &callback, int event)
lukofsky 1:df1ae6d3fd03 374
lukofsky 1:df1ae6d3fd03 375 {
lukofsky 1:df1ae6d3fd03 376
lukofsky 1:df1ae6d3fd03 377 #if TRANSACTION_QUEUE_SIZE_SPI
lukofsky 1:df1ae6d3fd03 378
lukofsky 1:df1ae6d3fd03 379 transaction_t t;
lukofsky 1:df1ae6d3fd03 380
lukofsky 1:df1ae6d3fd03 381
lukofsky 1:df1ae6d3fd03 382
lukofsky 1:df1ae6d3fd03 383 t.tx_buffer = const_cast<void *>(tx_buffer);
lukofsky 1:df1ae6d3fd03 384
lukofsky 1:df1ae6d3fd03 385 t.tx_length = tx_length;
lukofsky 1:df1ae6d3fd03 386
lukofsky 1:df1ae6d3fd03 387 t.rx_buffer = rx_buffer;
lukofsky 1:df1ae6d3fd03 388
lukofsky 1:df1ae6d3fd03 389 t.rx_length = rx_length;
lukofsky 1:df1ae6d3fd03 390
lukofsky 1:df1ae6d3fd03 391 t.event = event;
lukofsky 1:df1ae6d3fd03 392
lukofsky 1:df1ae6d3fd03 393 t.callback = callback;
lukofsky 1:df1ae6d3fd03 394
lukofsky 1:df1ae6d3fd03 395 t.width = bit_width;
lukofsky 1:df1ae6d3fd03 396
lukofsky 1:df1ae6d3fd03 397 Transaction<SPI> transaction(this, t);
lukofsky 1:df1ae6d3fd03 398
lukofsky 1:df1ae6d3fd03 399 if (_transaction_buffer.full()) {
lukofsky 1:df1ae6d3fd03 400
lukofsky 1:df1ae6d3fd03 401 return -1; // the buffer is full
lukofsky 1:df1ae6d3fd03 402
lukofsky 1:df1ae6d3fd03 403 } else {
lukofsky 1:df1ae6d3fd03 404
lukofsky 1:df1ae6d3fd03 405 core_util_critical_section_enter();
lukofsky 1:df1ae6d3fd03 406
lukofsky 1:df1ae6d3fd03 407 _transaction_buffer.push(transaction);
lukofsky 1:df1ae6d3fd03 408
lukofsky 1:df1ae6d3fd03 409 if (!spi_active(&_spi)) {
lukofsky 1:df1ae6d3fd03 410
lukofsky 1:df1ae6d3fd03 411 dequeue_transaction();
lukofsky 1:df1ae6d3fd03 412
lukofsky 1:df1ae6d3fd03 413 }
lukofsky 1:df1ae6d3fd03 414
lukofsky 1:df1ae6d3fd03 415 core_util_critical_section_exit();
lukofsky 1:df1ae6d3fd03 416
lukofsky 1:df1ae6d3fd03 417 return 0;
lukofsky 1:df1ae6d3fd03 418
lukofsky 1:df1ae6d3fd03 419 }
lukofsky 1:df1ae6d3fd03 420
lukofsky 1:df1ae6d3fd03 421 #else
lukofsky 1:df1ae6d3fd03 422
lukofsky 1:df1ae6d3fd03 423 return -1;
lukofsky 1:df1ae6d3fd03 424
lukofsky 1:df1ae6d3fd03 425 #endif
lukofsky 1:df1ae6d3fd03 426
lukofsky 1:df1ae6d3fd03 427 }
lukofsky 1:df1ae6d3fd03 428
lukofsky 1:df1ae6d3fd03 429
lukofsky 1:df1ae6d3fd03 430
lukofsky 1:df1ae6d3fd03 431 void SPI::start_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length, unsigned char bit_width, const event_callback_t &callback, int event)
lukofsky 1:df1ae6d3fd03 432
lukofsky 1:df1ae6d3fd03 433 {
lukofsky 1:df1ae6d3fd03 434
lukofsky 1:df1ae6d3fd03 435 lock_deep_sleep();
lukofsky 1:df1ae6d3fd03 436
lukofsky 1:df1ae6d3fd03 437 _acquire();
lukofsky 1:df1ae6d3fd03 438
lukofsky 1:df1ae6d3fd03 439 _callback = callback;
lukofsky 1:df1ae6d3fd03 440
lukofsky 1:df1ae6d3fd03 441 _irq.callback(&SPI::irq_handler_asynch);
lukofsky 1:df1ae6d3fd03 442
lukofsky 1:df1ae6d3fd03 443 spi_master_transfer(&_spi, tx_buffer, tx_length, rx_buffer, rx_length, bit_width, _irq.entry(), event, _usage);
lukofsky 1:df1ae6d3fd03 444
lukofsky 1:df1ae6d3fd03 445 }
lukofsky 1:df1ae6d3fd03 446
lukofsky 1:df1ae6d3fd03 447
lukofsky 1:df1ae6d3fd03 448
lukofsky 1:df1ae6d3fd03 449 void SPI::lock_deep_sleep()
lukofsky 1:df1ae6d3fd03 450
lukofsky 1:df1ae6d3fd03 451 {
lukofsky 1:df1ae6d3fd03 452
lukofsky 1:df1ae6d3fd03 453 if (_deep_sleep_locked == false) {
lukofsky 1:df1ae6d3fd03 454
lukofsky 1:df1ae6d3fd03 455 sleep_manager_lock_deep_sleep();
lukofsky 1:df1ae6d3fd03 456
lukofsky 1:df1ae6d3fd03 457 _deep_sleep_locked = true;
lukofsky 1:df1ae6d3fd03 458
lukofsky 1:df1ae6d3fd03 459 }
lukofsky 1:df1ae6d3fd03 460
lukofsky 1:df1ae6d3fd03 461 }
lukofsky 1:df1ae6d3fd03 462
lukofsky 1:df1ae6d3fd03 463
lukofsky 1:df1ae6d3fd03 464
lukofsky 1:df1ae6d3fd03 465 void SPI::unlock_deep_sleep()
lukofsky 1:df1ae6d3fd03 466
lukofsky 1:df1ae6d3fd03 467 {
lukofsky 1:df1ae6d3fd03 468
lukofsky 1:df1ae6d3fd03 469 if (_deep_sleep_locked == true) {
lukofsky 1:df1ae6d3fd03 470
lukofsky 1:df1ae6d3fd03 471 sleep_manager_unlock_deep_sleep();
lukofsky 1:df1ae6d3fd03 472
lukofsky 1:df1ae6d3fd03 473 _deep_sleep_locked = false;
lukofsky 1:df1ae6d3fd03 474
lukofsky 1:df1ae6d3fd03 475 }
lukofsky 1:df1ae6d3fd03 476
lukofsky 1:df1ae6d3fd03 477 }
lukofsky 1:df1ae6d3fd03 478
lukofsky 1:df1ae6d3fd03 479
lukofsky 1:df1ae6d3fd03 480
lukofsky 1:df1ae6d3fd03 481 #if TRANSACTION_QUEUE_SIZE_SPI
lukofsky 1:df1ae6d3fd03 482
lukofsky 1:df1ae6d3fd03 483
lukofsky 1:df1ae6d3fd03 484
lukofsky 1:df1ae6d3fd03 485 void SPI::start_transaction(transaction_t *data)
lukofsky 1:df1ae6d3fd03 486
lukofsky 1:df1ae6d3fd03 487 {
lukofsky 1:df1ae6d3fd03 488
lukofsky 1:df1ae6d3fd03 489 start_transfer(data->tx_buffer, data->tx_length, data->rx_buffer, data->rx_length, data->width, data->callback, data->event);
lukofsky 1:df1ae6d3fd03 490
lukofsky 1:df1ae6d3fd03 491 }
lukofsky 1:df1ae6d3fd03 492
lukofsky 1:df1ae6d3fd03 493
lukofsky 1:df1ae6d3fd03 494
lukofsky 1:df1ae6d3fd03 495 void SPI::dequeue_transaction()
lukofsky 1:df1ae6d3fd03 496
lukofsky 1:df1ae6d3fd03 497 {
lukofsky 1:df1ae6d3fd03 498
lukofsky 1:df1ae6d3fd03 499 Transaction<SPI> t;
lukofsky 1:df1ae6d3fd03 500
lukofsky 1:df1ae6d3fd03 501 if (_transaction_buffer.pop(t)) {
lukofsky 1:df1ae6d3fd03 502
lukofsky 1:df1ae6d3fd03 503 SPI *obj = t.get_object();
lukofsky 1:df1ae6d3fd03 504
lukofsky 1:df1ae6d3fd03 505 transaction_t *data = t.get_transaction();
lukofsky 1:df1ae6d3fd03 506
lukofsky 1:df1ae6d3fd03 507 obj->start_transaction(data);
lukofsky 1:df1ae6d3fd03 508
lukofsky 1:df1ae6d3fd03 509 }
lukofsky 1:df1ae6d3fd03 510
lukofsky 1:df1ae6d3fd03 511 }
lukofsky 1:df1ae6d3fd03 512
lukofsky 1:df1ae6d3fd03 513
lukofsky 1:df1ae6d3fd03 514
lukofsky 1:df1ae6d3fd03 515 #endif
lukofsky 1:df1ae6d3fd03 516
lukofsky 1:df1ae6d3fd03 517
lukofsky 1:df1ae6d3fd03 518
lukofsky 1:df1ae6d3fd03 519 void SPI::irq_handler_asynch(void)
lukofsky 1:df1ae6d3fd03 520
lukofsky 1:df1ae6d3fd03 521 {
lukofsky 1:df1ae6d3fd03 522
lukofsky 1:df1ae6d3fd03 523 int event = spi_irq_handler_asynch(&_spi);
lukofsky 1:df1ae6d3fd03 524
lukofsky 1:df1ae6d3fd03 525 if (_callback && (event & SPI_EVENT_ALL)) {
lukofsky 1:df1ae6d3fd03 526
lukofsky 1:df1ae6d3fd03 527 unlock_deep_sleep();
lukofsky 1:df1ae6d3fd03 528
lukofsky 1:df1ae6d3fd03 529 _callback.call(event & SPI_EVENT_ALL);
lukofsky 1:df1ae6d3fd03 530
lukofsky 1:df1ae6d3fd03 531 }
lukofsky 1:df1ae6d3fd03 532
lukofsky 1:df1ae6d3fd03 533 #if TRANSACTION_QUEUE_SIZE_SPI
lukofsky 1:df1ae6d3fd03 534
lukofsky 1:df1ae6d3fd03 535 if (event & (SPI_EVENT_ALL | SPI_EVENT_INTERNAL_TRANSFER_COMPLETE)) {
lukofsky 1:df1ae6d3fd03 536
lukofsky 1:df1ae6d3fd03 537 // SPI peripheral is free (event happened), dequeue transaction
lukofsky 1:df1ae6d3fd03 538
lukofsky 1:df1ae6d3fd03 539 dequeue_transaction();
lukofsky 1:df1ae6d3fd03 540
lukofsky 1:df1ae6d3fd03 541 }
lukofsky 1:df1ae6d3fd03 542
lukofsky 1:df1ae6d3fd03 543 #endif
lukofsky 1:df1ae6d3fd03 544
lukofsky 1:df1ae6d3fd03 545 }
lukofsky 1:df1ae6d3fd03 546
lukofsky 1:df1ae6d3fd03 547
lukofsky 1:df1ae6d3fd03 548
lukofsky 1:df1ae6d3fd03 549 #endif
lukofsky 1:df1ae6d3fd03 550
lukofsky 1:df1ae6d3fd03 551
lukofsky 1:df1ae6d3fd03 552
lukofsky 1:df1ae6d3fd03 553 } // namespace mbed
lukofsky 1:df1ae6d3fd03 554
lukofsky 1:df1ae6d3fd03 555
lukofsky 1:df1ae6d3fd03 556
lukofsky 1:df1ae6d3fd03 557 #endif