ADISense1000 Version 2.1 code base

Fork of AdiSense1000_V21 by Sean Wilson

Committer:
danodonovan
Date:
Mon Jan 22 17:40:50 2018 +0000
Revision:
24:5a2272a25ff1
Updating example to adisense1000 v1.0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
danodonovan 24:5a2272a25ff1 1 /*!
danodonovan 24:5a2272a25ff1 2 ******************************************************************************
danodonovan 24:5a2272a25ff1 3 * @file: adi_sense_spi.cpp
danodonovan 24:5a2272a25ff1 4 * @brief: ADI Sense OS-dependent wrapper layer for SPI interface
danodonovan 24:5a2272a25ff1 5 *-----------------------------------------------------------------------------
danodonovan 24:5a2272a25ff1 6 */
danodonovan 24:5a2272a25ff1 7
danodonovan 24:5a2272a25ff1 8 /******************************************************************************
danodonovan 24:5a2272a25ff1 9 Copyright 2017 (c) Analog Devices, Inc.
danodonovan 24:5a2272a25ff1 10
danodonovan 24:5a2272a25ff1 11 All rights reserved.
danodonovan 24:5a2272a25ff1 12
danodonovan 24:5a2272a25ff1 13 Redistribution and use in source and binary forms, with or without
danodonovan 24:5a2272a25ff1 14 modification, are permitted provided that the following conditions are met:
danodonovan 24:5a2272a25ff1 15 - Redistributions of source code must retain the above copyright
danodonovan 24:5a2272a25ff1 16 notice, this list of conditions and the following disclaimer.
danodonovan 24:5a2272a25ff1 17 - Redistributions in binary form must reproduce the above copyright
danodonovan 24:5a2272a25ff1 18 notice, this list of conditions and the following disclaimer in
danodonovan 24:5a2272a25ff1 19 the documentation and/or other materials provided with the
danodonovan 24:5a2272a25ff1 20 distribution.
danodonovan 24:5a2272a25ff1 21 - Neither the name of Analog Devices, Inc. nor the names of its
danodonovan 24:5a2272a25ff1 22 contributors may be used to endorse or promote products derived
danodonovan 24:5a2272a25ff1 23 from this software without specific prior written permission.
danodonovan 24:5a2272a25ff1 24 - The use of this software may or may not infringe the patent rights
danodonovan 24:5a2272a25ff1 25 of one or more patent holders. This license does not release you
danodonovan 24:5a2272a25ff1 26 from the requirement that you obtain separate licenses from these
danodonovan 24:5a2272a25ff1 27 patent holders to use this software.
danodonovan 24:5a2272a25ff1 28 - Use of the software either in source or binary form, must be run
danodonovan 24:5a2272a25ff1 29 on or directly connected to an Analog Devices Inc. component.
danodonovan 24:5a2272a25ff1 30
danodonovan 24:5a2272a25ff1 31 THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
danodonovan 24:5a2272a25ff1 32 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
danodonovan 24:5a2272a25ff1 33 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
danodonovan 24:5a2272a25ff1 34 IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
danodonovan 24:5a2272a25ff1 35 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
danodonovan 24:5a2272a25ff1 36 LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
danodonovan 24:5a2272a25ff1 37 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
danodonovan 24:5a2272a25ff1 38 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
danodonovan 24:5a2272a25ff1 39 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
danodonovan 24:5a2272a25ff1 40 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
danodonovan 24:5a2272a25ff1 41 *
danodonovan 24:5a2272a25ff1 42 *****************************************************************************/
danodonovan 24:5a2272a25ff1 43
danodonovan 24:5a2272a25ff1 44 #include <mbed.h>
danodonovan 24:5a2272a25ff1 45
danodonovan 24:5a2272a25ff1 46 #include "inc/adi_sense_spi.h"
danodonovan 24:5a2272a25ff1 47 #include "inc/adi_sense_log.h"
danodonovan 24:5a2272a25ff1 48
danodonovan 24:5a2272a25ff1 49 #define ADI_SENSE_SPI_MODE 0 /* CPOL=0, CPHA=0 */
danodonovan 24:5a2272a25ff1 50 #define ADI_SENSE_SPI_FRAME_SIZE 8 /* 8-bit frame size */
danodonovan 24:5a2272a25ff1 51
danodonovan 24:5a2272a25ff1 52 class SpiContext
danodonovan 24:5a2272a25ff1 53 {
danodonovan 24:5a2272a25ff1 54 public:
danodonovan 24:5a2272a25ff1 55 SpiContext(
danodonovan 24:5a2272a25ff1 56 PinName mosiPin,
danodonovan 24:5a2272a25ff1 57 PinName misoPin,
danodonovan 24:5a2272a25ff1 58 PinName sckPin,
danodonovan 24:5a2272a25ff1 59 PinName csPin,
danodonovan 24:5a2272a25ff1 60 unsigned maxSpeed);
danodonovan 24:5a2272a25ff1 61
danodonovan 24:5a2272a25ff1 62 int transfer(
danodonovan 24:5a2272a25ff1 63 void *pTxData,
danodonovan 24:5a2272a25ff1 64 void *pRxData,
danodonovan 24:5a2272a25ff1 65 unsigned nLength,
danodonovan 24:5a2272a25ff1 66 bool bCsHold);
danodonovan 24:5a2272a25ff1 67
danodonovan 24:5a2272a25ff1 68 private:
danodonovan 24:5a2272a25ff1 69 SPI _spi;
danodonovan 24:5a2272a25ff1 70 DigitalOut _cs;
danodonovan 24:5a2272a25ff1 71
danodonovan 24:5a2272a25ff1 72 event_callback_t _callback;
danodonovan 24:5a2272a25ff1 73 volatile int _cbEvent;
danodonovan 24:5a2272a25ff1 74 volatile bool _cbFired;
danodonovan 24:5a2272a25ff1 75
danodonovan 24:5a2272a25ff1 76 void _cbHandler(
danodonovan 24:5a2272a25ff1 77 int event);
danodonovan 24:5a2272a25ff1 78
danodonovan 24:5a2272a25ff1 79 int _waitForCallback(
danodonovan 24:5a2272a25ff1 80 void);
danodonovan 24:5a2272a25ff1 81 };
danodonovan 24:5a2272a25ff1 82
danodonovan 24:5a2272a25ff1 83 SpiContext::SpiContext(PinName mosiPin,
danodonovan 24:5a2272a25ff1 84 PinName misoPin,
danodonovan 24:5a2272a25ff1 85 PinName sckPin,
danodonovan 24:5a2272a25ff1 86 PinName csPin,
danodonovan 24:5a2272a25ff1 87 unsigned maxSpeed)
danodonovan 24:5a2272a25ff1 88 : _spi(mosiPin, misoPin, sckPin),
danodonovan 24:5a2272a25ff1 89 _cs(csPin, 1)
danodonovan 24:5a2272a25ff1 90 {
danodonovan 24:5a2272a25ff1 91 _cbEvent = 0;
danodonovan 24:5a2272a25ff1 92 _cbFired = false;
danodonovan 24:5a2272a25ff1 93 _callback.attach(this, &SpiContext::_cbHandler);
danodonovan 24:5a2272a25ff1 94
danodonovan 24:5a2272a25ff1 95 _spi.format(ADI_SENSE_SPI_FRAME_SIZE, ADI_SENSE_SPI_MODE);
danodonovan 24:5a2272a25ff1 96 _spi.frequency(maxSpeed);
danodonovan 24:5a2272a25ff1 97 }
danodonovan 24:5a2272a25ff1 98
danodonovan 24:5a2272a25ff1 99 void SpiContext::_cbHandler(int event)
danodonovan 24:5a2272a25ff1 100 {
danodonovan 24:5a2272a25ff1 101 _cbEvent = event;
danodonovan 24:5a2272a25ff1 102 _cbFired = true;
danodonovan 24:5a2272a25ff1 103 }
danodonovan 24:5a2272a25ff1 104
danodonovan 24:5a2272a25ff1 105 int SpiContext::_waitForCallback(void)
danodonovan 24:5a2272a25ff1 106 {
danodonovan 24:5a2272a25ff1 107 int rc = 0;
danodonovan 24:5a2272a25ff1 108
danodonovan 24:5a2272a25ff1 109 while ((_cbFired != true) && (_cbEvent != SPI_EVENT_COMPLETE))
danodonovan 24:5a2272a25ff1 110 { ; }
danodonovan 24:5a2272a25ff1 111
danodonovan 24:5a2272a25ff1 112 _cbFired = false;
danodonovan 24:5a2272a25ff1 113 _cbEvent = 0;
danodonovan 24:5a2272a25ff1 114
danodonovan 24:5a2272a25ff1 115 return rc;
danodonovan 24:5a2272a25ff1 116 }
danodonovan 24:5a2272a25ff1 117
danodonovan 24:5a2272a25ff1 118 int SpiContext::transfer(
danodonovan 24:5a2272a25ff1 119 void *pTxData,
danodonovan 24:5a2272a25ff1 120 void *pRxData,
danodonovan 24:5a2272a25ff1 121 unsigned nLength,
danodonovan 24:5a2272a25ff1 122 bool bCsHold)
danodonovan 24:5a2272a25ff1 123 {
danodonovan 24:5a2272a25ff1 124 int rc = 0;
danodonovan 24:5a2272a25ff1 125
danodonovan 24:5a2272a25ff1 126 _cs = 0;
danodonovan 24:5a2272a25ff1 127
danodonovan 24:5a2272a25ff1 128 rc = _spi.transfer((uint8_t *)pTxData, nLength,
danodonovan 24:5a2272a25ff1 129 (uint8_t *)pRxData, nLength,
danodonovan 24:5a2272a25ff1 130 _callback, SPI_EVENT_COMPLETE);
danodonovan 24:5a2272a25ff1 131 if (rc < 0)
danodonovan 24:5a2272a25ff1 132 {
danodonovan 24:5a2272a25ff1 133 _cs = 1;
danodonovan 24:5a2272a25ff1 134 return rc;
danodonovan 24:5a2272a25ff1 135 }
danodonovan 24:5a2272a25ff1 136
danodonovan 24:5a2272a25ff1 137 rc = _waitForCallback();
danodonovan 24:5a2272a25ff1 138 if ((rc < 0) || !bCsHold)
danodonovan 24:5a2272a25ff1 139 _cs = 1;
danodonovan 24:5a2272a25ff1 140
danodonovan 24:5a2272a25ff1 141 return rc;
danodonovan 24:5a2272a25ff1 142 }
danodonovan 24:5a2272a25ff1 143
danodonovan 24:5a2272a25ff1 144 #ifdef __cplusplus
danodonovan 24:5a2272a25ff1 145 extern "C" {
danodonovan 24:5a2272a25ff1 146 #endif
danodonovan 24:5a2272a25ff1 147
danodonovan 24:5a2272a25ff1 148 /*
danodonovan 24:5a2272a25ff1 149 * Open the SPI interface and allocate resources
danodonovan 24:5a2272a25ff1 150 */
danodonovan 24:5a2272a25ff1 151 ADI_SENSE_RESULT adi_sense_SpiOpen(
danodonovan 24:5a2272a25ff1 152 ADI_SENSE_PLATFORM_SPI_CONFIG *pConfig,
danodonovan 24:5a2272a25ff1 153 ADI_SENSE_SPI_HANDLE *phDevice)
danodonovan 24:5a2272a25ff1 154 {
danodonovan 24:5a2272a25ff1 155 SpiContext *pCtx = new SpiContext((PinName)pConfig->mosiPin,
danodonovan 24:5a2272a25ff1 156 (PinName)pConfig->misoPin,
danodonovan 24:5a2272a25ff1 157 (PinName)pConfig->sckPin,
danodonovan 24:5a2272a25ff1 158 (PinName)pConfig->csPin,
danodonovan 24:5a2272a25ff1 159 pConfig->maxSpeedHz);
danodonovan 24:5a2272a25ff1 160 if (!pCtx)
danodonovan 24:5a2272a25ff1 161 {
danodonovan 24:5a2272a25ff1 162 ADI_SENSE_LOG_ERROR("Failed to allocate memory for SPI interface");
danodonovan 24:5a2272a25ff1 163 return ADI_SENSE_NO_MEM;
danodonovan 24:5a2272a25ff1 164 }
danodonovan 24:5a2272a25ff1 165
danodonovan 24:5a2272a25ff1 166 *phDevice = reinterpret_cast<ADI_SENSE_SPI_HANDLE>(pCtx);
danodonovan 24:5a2272a25ff1 167 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 168 }
danodonovan 24:5a2272a25ff1 169
danodonovan 24:5a2272a25ff1 170 /*
danodonovan 24:5a2272a25ff1 171 * Execute a bi-directional data transfer on the SPI interface
danodonovan 24:5a2272a25ff1 172 */
danodonovan 24:5a2272a25ff1 173 ADI_SENSE_RESULT
danodonovan 24:5a2272a25ff1 174 adi_sense_SpiTransfer(
danodonovan 24:5a2272a25ff1 175 ADI_SENSE_SPI_HANDLE hDevice,
danodonovan 24:5a2272a25ff1 176 void *pTxData,
danodonovan 24:5a2272a25ff1 177 void *pRxData,
danodonovan 24:5a2272a25ff1 178 unsigned nLength,
danodonovan 24:5a2272a25ff1 179 bool bCsHold)
danodonovan 24:5a2272a25ff1 180 {
danodonovan 24:5a2272a25ff1 181 SpiContext *pCtx = reinterpret_cast<SpiContext *>(hDevice);
danodonovan 24:5a2272a25ff1 182
danodonovan 24:5a2272a25ff1 183 if (pCtx->transfer(pTxData, pRxData, nLength, bCsHold) < 0)
danodonovan 24:5a2272a25ff1 184 {
danodonovan 24:5a2272a25ff1 185 ADI_SENSE_LOG_ERROR("Failed to complete SPI transfer");
danodonovan 24:5a2272a25ff1 186 return ADI_SENSE_FAILURE;
danodonovan 24:5a2272a25ff1 187 }
danodonovan 24:5a2272a25ff1 188
danodonovan 24:5a2272a25ff1 189 return ADI_SENSE_SUCCESS;
danodonovan 24:5a2272a25ff1 190 }
danodonovan 24:5a2272a25ff1 191
danodonovan 24:5a2272a25ff1 192 /*
danodonovan 24:5a2272a25ff1 193 * Close the SPI interface and free resources
danodonovan 24:5a2272a25ff1 194 */
danodonovan 24:5a2272a25ff1 195 void adi_sense_SpiClose(
danodonovan 24:5a2272a25ff1 196 ADI_SENSE_SPI_HANDLE hDevice)
danodonovan 24:5a2272a25ff1 197 {
danodonovan 24:5a2272a25ff1 198 SpiContext *pCtx = reinterpret_cast<SpiContext *>(hDevice);
danodonovan 24:5a2272a25ff1 199
danodonovan 24:5a2272a25ff1 200 delete pCtx;
danodonovan 24:5a2272a25ff1 201 }
danodonovan 24:5a2272a25ff1 202
danodonovan 24:5a2272a25ff1 203 #ifdef __cplusplus
danodonovan 24:5a2272a25ff1 204 }
danodonovan 24:5a2272a25ff1 205 #endif
danodonovan 24:5a2272a25ff1 206
danodonovan 24:5a2272a25ff1 207 /*!
danodonovan 24:5a2272a25ff1 208 * @}
danodonovan 24:5a2272a25ff1 209 */
danodonovan 24:5a2272a25ff1 210