SDMP_IOT / Mbed OS AdiSense1000_SmartBabySeat

Fork of Babyseat_NewFirmware_copy_sean by Ross O'Halloran

Committer:
kevin1990
Date:
Fri Aug 25 11:17:37 2017 +0000
Revision:
2:625a45555a85
Sensor Channel 0 Type K example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevin1990 2:625a45555a85 1 /*!
kevin1990 2:625a45555a85 2 ******************************************************************************
kevin1990 2:625a45555a85 3 * @file: adisense1000.cpp
kevin1990 2:625a45555a85 4 * @brief:
kevin1990 2:625a45555a85 5 *-----------------------------------------------------------------------------
kevin1990 2:625a45555a85 6 *
kevin1990 2:625a45555a85 7 Copyright (c) 2017 Emutex Ltd. / Analog Devices, Inc.
kevin1990 2:625a45555a85 8
kevin1990 2:625a45555a85 9 All rights reserved.
kevin1990 2:625a45555a85 10
kevin1990 2:625a45555a85 11 Redistribution and use in source and binary forms, with or without modification,
kevin1990 2:625a45555a85 12 are permitted provided that the following conditions are met:
kevin1990 2:625a45555a85 13 - Redistributions of source code must retain the above copyright notice,
kevin1990 2:625a45555a85 14 this list of conditions and the following disclaimer.
kevin1990 2:625a45555a85 15 - Redistributions in binary form must reproduce the above copyright notice,
kevin1990 2:625a45555a85 16 this list of conditions and the following disclaimer in the documentation
kevin1990 2:625a45555a85 17 and/or other materials provided with the distribution.
kevin1990 2:625a45555a85 18 - Modified versions of the software must be conspicuously marked as such.
kevin1990 2:625a45555a85 19 - This software is licensed solely and exclusively for use with processors
kevin1990 2:625a45555a85 20 manufactured by or for Analog Devices, Inc.
kevin1990 2:625a45555a85 21 - This software may not be combined or merged with other code in any manner
kevin1990 2:625a45555a85 22 that would cause the software to become subject to terms and conditions
kevin1990 2:625a45555a85 23 which differ from those listed here.
kevin1990 2:625a45555a85 24 - Neither the name of Analog Devices, Inc. nor the names of its
kevin1990 2:625a45555a85 25 contributors may be used to endorse or promote products derived
kevin1990 2:625a45555a85 26 from this software without specific prior written permission.
kevin1990 2:625a45555a85 27 - The use of this software may or may not infringe the patent rights of one
kevin1990 2:625a45555a85 28 or more patent holders. This license does not release you from the
kevin1990 2:625a45555a85 29 requirement that you obtain separate licenses from these patent holders
kevin1990 2:625a45555a85 30 to use this software.
kevin1990 2:625a45555a85 31
kevin1990 2:625a45555a85 32 THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY
kevin1990 2:625a45555a85 33 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
kevin1990 2:625a45555a85 34 TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
kevin1990 2:625a45555a85 35 NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
kevin1990 2:625a45555a85 36 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES
kevin1990 2:625a45555a85 37 (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL
kevin1990 2:625a45555a85 38 PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
kevin1990 2:625a45555a85 39 OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
kevin1990 2:625a45555a85 40 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
kevin1990 2:625a45555a85 41 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
kevin1990 2:625a45555a85 42 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
kevin1990 2:625a45555a85 43 *
kevin1990 2:625a45555a85 44 *****************************************************************************/
kevin1990 2:625a45555a85 45 /******************************************************************************/
kevin1990 2:625a45555a85 46 /* Include Files */
kevin1990 2:625a45555a85 47 /******************************************************************************/
kevin1990 2:625a45555a85 48
kevin1990 2:625a45555a85 49 #include "mbed.h"
kevin1990 2:625a45555a85 50 #include "inc/spi_nucleo.h"
kevin1990 2:625a45555a85 51 #include "inc/gpio_nucleo.h"
kevin1990 2:625a45555a85 52 #include "inc/adisense1000.h"
kevin1990 2:625a45555a85 53
kevin1990 2:625a45555a85 54 #define BIT(n) (1 << (n))
kevin1990 2:625a45555a85 55 #define BIT_MASK(len) (BIT(len)-1)
kevin1990 2:625a45555a85 56
kevin1990 2:625a45555a85 57 #define MAX_RCV_BYTES (100)
kevin1990 2:625a45555a85 58 #define MAX_REG_SIZE (4)
kevin1990 2:625a45555a85 59
kevin1990 2:625a45555a85 60 #define GET_SAMPLE_TIMEOUT (1)
kevin1990 2:625a45555a85 61
kevin1990 2:625a45555a85 62 extern Serial pc;
kevin1990 2:625a45555a85 63 Timer readTimeout;
kevin1990 2:625a45555a85 64
kevin1990 2:625a45555a85 65 uint8_t rcvBuff[MAX_RCV_BYTES] = {0};
kevin1990 2:625a45555a85 66 uint8_t txdBuff[MAX_REG_SIZE] = {0};
kevin1990 2:625a45555a85 67
kevin1990 2:625a45555a85 68 /*
kevin1990 2:625a45555a85 69 For v0.1 we pass this into ADISense1000_HostGpioOpen but it is not being used.
kevin1990 2:625a45555a85 70 This is because the os dependant wrapper for the nucleo is using classes which
kevin1990 2:625a45555a85 71 are hardcoded globally. We should probally wrap the os layer in a c wrapper
kevin1990 2:625a45555a85 72 so these c++ functions are hidden from the user
kevin1990 2:625a45555a85 73 */
kevin1990 2:625a45555a85 74 gpioSettings gpioConfig[HOST_GPIO_COUNT] =
kevin1990 2:625a45555a85 75 {
kevin1990 2:625a45555a85 76 {D2, OUTPUT, HIGH},
kevin1990 2:625a45555a85 77 {D3, INPUT, LOW},
kevin1990 2:625a45555a85 78 {D4, INPUT, LOW},
kevin1990 2:625a45555a85 79 {D5, INPUT, LOW}
kevin1990 2:625a45555a85 80 };
kevin1990 2:625a45555a85 81
kevin1990 2:625a45555a85 82 /* Same as mentioned for gpioConfig applies here */
kevin1990 2:625a45555a85 83 spiSettings spiConfigure;
kevin1990 2:625a45555a85 84
kevin1990 2:625a45555a85 85 /*!
kevin1990 2:625a45555a85 86 * @brief Init SPI and GPIO for ADISense1000.
kevin1990 2:625a45555a85 87 *
kevin1990 2:625a45555a85 88 * @param[in] void
kevin1990 2:625a45555a85 89 *
kevin1990 2:625a45555a85 90 * @return Status
kevin1990 2:625a45555a85 91 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 92 * - #ADI_SENSE_FAILURE If GPIO open failed.
kevin1990 2:625a45555a85 93 * - #ADI_SENSE_FAILURE If SPI open failed.
kevin1990 2:625a45555a85 94 *
kevin1990 2:625a45555a85 95 * @details Configure GPIO for ADISense1000 module and open
kevin1990 2:625a45555a85 96 * SPI communications to ADISense1000 module.
kevin1990 2:625a45555a85 97 */
kevin1990 2:625a45555a85 98 ADI_SENSE_RESULT ADISense1000_Open(void)
kevin1990 2:625a45555a85 99 {
kevin1990 2:625a45555a85 100 if (ADISense1000_HostGpioOpen(gpioConfig) != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 101 {
kevin1990 2:625a45555a85 102 return ADI_SENSE_FAILURE;
kevin1990 2:625a45555a85 103 }
kevin1990 2:625a45555a85 104
kevin1990 2:625a45555a85 105 if (ADISense1000_HostSpiOpen(spiConfigure) != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 106 {
kevin1990 2:625a45555a85 107 return ADI_SENSE_FAILURE;
kevin1990 2:625a45555a85 108 }
kevin1990 2:625a45555a85 109
kevin1990 2:625a45555a85 110 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 111 }
kevin1990 2:625a45555a85 112
kevin1990 2:625a45555a85 113
kevin1990 2:625a45555a85 114 /*!
kevin1990 2:625a45555a85 115 * @brief Get the product ID for Module
kevin1990 2:625a45555a85 116 *
kevin1990 2:625a45555a85 117 * @param[in]
kevin1990 2:625a45555a85 118 * @param[out] pProductID : Pointer to uint16_t for Product ID.
kevin1990 2:625a45555a85 119 *
kevin1990 2:625a45555a85 120 * @return Status
kevin1990 2:625a45555a85 121 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 122 * - #ADI_SENSE_FAILURE If receive product ID fails.
kevin1990 2:625a45555a85 123 *
kevin1990 2:625a45555a85 124 * @details Read the product ID for ADISense1000 module.
kevin1990 2:625a45555a85 125 *
kevin1990 2:625a45555a85 126 */
kevin1990 2:625a45555a85 127 ADI_SENSE_RESULT ADISense1000_GetID(uint16_t *pProductID)
kevin1990 2:625a45555a85 128 {
kevin1990 2:625a45555a85 129 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 130 uint8_t id_l, id_h;
kevin1990 2:625a45555a85 131
kevin1990 2:625a45555a85 132 eRet = ADISense1000_RegRead(regMap[SPI_PRODUCT_ID_L].addr,
kevin1990 2:625a45555a85 133 regMap[SPI_PRODUCT_ID_L].size,
kevin1990 2:625a45555a85 134 rcvBuff);
kevin1990 2:625a45555a85 135 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 136 {
kevin1990 2:625a45555a85 137 return eRet;
kevin1990 2:625a45555a85 138 }
kevin1990 2:625a45555a85 139
kevin1990 2:625a45555a85 140 id_l = rcvBuff[0];
kevin1990 2:625a45555a85 141
kevin1990 2:625a45555a85 142 eRet = ADISense1000_RegRead(regMap[SPI_PRODUCT_ID_H].addr,
kevin1990 2:625a45555a85 143 regMap[SPI_PRODUCT_ID_H].size,
kevin1990 2:625a45555a85 144 rcvBuff);
kevin1990 2:625a45555a85 145 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 146 {
kevin1990 2:625a45555a85 147 return eRet;
kevin1990 2:625a45555a85 148 }
kevin1990 2:625a45555a85 149
kevin1990 2:625a45555a85 150 id_h = rcvBuff[0];
kevin1990 2:625a45555a85 151 *pProductID = ((id_h << 8)&0xff00)|id_l;
kevin1990 2:625a45555a85 152
kevin1990 2:625a45555a85 153 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 154 }
kevin1990 2:625a45555a85 155
kevin1990 2:625a45555a85 156 /*!
kevin1990 2:625a45555a85 157 * @brief Basic configuration of module for V0.1
kevin1990 2:625a45555a85 158 *
kevin1990 2:625a45555a85 159 * @param[in] void
kevin1990 2:625a45555a85 160 * @param[out]
kevin1990 2:625a45555a85 161 *
kevin1990 2:625a45555a85 162 * @return Status
kevin1990 2:625a45555a85 163 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 164 * - #ADI_SENSE_FAILURE If write module config fails.
kevin1990 2:625a45555a85 165 *
kevin1990 2:625a45555a85 166 * @details Basic function to set a fixed configuration.
kevin1990 2:625a45555a85 167 */
kevin1990 2:625a45555a85 168 ADI_SENSE_RESULT ADISense1000_ConfigureModule(void)
kevin1990 2:625a45555a85 169 {
kevin1990 2:625a45555a85 170 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 171 ADI_CORE_Mode_t modeReg;
kevin1990 2:625a45555a85 172
kevin1990 2:625a45555a85 173 modeReg.Conversion_Mode = CORE_MODE_SINGLECYCLE;
kevin1990 2:625a45555a85 174 modeReg.Drdy_Mode = CORE_MODE_DRDY_PER_CYCLE;
kevin1990 2:625a45555a85 175
kevin1990 2:625a45555a85 176 eRet = ADISense1000_RegWrite(regMap[CORE_MODE].addr,
kevin1990 2:625a45555a85 177 regMap[CORE_MODE].size,
kevin1990 2:625a45555a85 178 (uint8_t*)&modeReg);
kevin1990 2:625a45555a85 179
kevin1990 2:625a45555a85 180 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 181 {
kevin1990 2:625a45555a85 182 return eRet;
kevin1990 2:625a45555a85 183 }
kevin1990 2:625a45555a85 184
kevin1990 2:625a45555a85 185 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 186 }
kevin1990 2:625a45555a85 187
kevin1990 2:625a45555a85 188 /*!
kevin1990 2:625a45555a85 189 * @brief Get general status of ADISense1000 module.
kevin1990 2:625a45555a85 190 *
kevin1990 2:625a45555a85 191 * @param[in]
kevin1990 2:625a45555a85 192 * @param[out] pStatus : Pointer to CORE Status struct.
kevin1990 2:625a45555a85 193 *
kevin1990 2:625a45555a85 194 * @return Status
kevin1990 2:625a45555a85 195 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 196 * - #ADI_SENSE_FAILURE If status register read fails.
kevin1990 2:625a45555a85 197 *
kevin1990 2:625a45555a85 198 * @details Read the general status register for the ADISense1000
kevin1990 2:625a45555a85 199 * module. Indicates Error, Alert conditions, data ready
kevin1990 2:625a45555a85 200 * and command running.
kevin1990 2:625a45555a85 201 *
kevin1990 2:625a45555a85 202 */
kevin1990 2:625a45555a85 203 ADI_SENSE_RESULT ADISense1000_GetStatus(ADI_CORE_Status_t *pStatus)
kevin1990 2:625a45555a85 204 {
kevin1990 2:625a45555a85 205 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 206
kevin1990 2:625a45555a85 207 pStatus->VALUE8 = 0;
kevin1990 2:625a45555a85 208 eRet = ADISense1000_RegRead(regMap[CORE_STATUS].addr,
kevin1990 2:625a45555a85 209 regMap[CORE_STATUS].size,
kevin1990 2:625a45555a85 210 rcvBuff);
kevin1990 2:625a45555a85 211 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 212 {
kevin1990 2:625a45555a85 213 return eRet;
kevin1990 2:625a45555a85 214 }
kevin1990 2:625a45555a85 215
kevin1990 2:625a45555a85 216 pStatus->VALUE8 = rcvBuff[0];
kevin1990 2:625a45555a85 217
kevin1990 2:625a45555a85 218 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 219 }
kevin1990 2:625a45555a85 220
kevin1990 2:625a45555a85 221 /*!
kevin1990 2:625a45555a85 222 * @brief Get a list of channels with alerts.
kevin1990 2:625a45555a85 223 *
kevin1990 2:625a45555a85 224 * @param[in]
kevin1990 2:625a45555a85 225 * @param[out] pStatus : List of Channel detailed alerts.
kevin1990 2:625a45555a85 226 *
kevin1990 2:625a45555a85 227 * @return Status
kevin1990 2:625a45555a85 228 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 229 * - #ADI_SENSE_FAILURE If request for channel alerts fails.
kevin1990 2:625a45555a85 230 *
kevin1990 2:625a45555a85 231 * @details Read the channel alert register. If channel alert register
kevin1990 2:625a45555a85 232 * indicates alert on a channel, process the channel detailed
kevin1990 2:625a45555a85 233 * alert register.
kevin1990 2:625a45555a85 234 */
kevin1990 2:625a45555a85 235 ADI_SENSE_RESULT ADISense1000_GetChannelAlert(ADI_Channel_Alert_t pAlerts)
kevin1990 2:625a45555a85 236 {
kevin1990 2:625a45555a85 237 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 238 uint8_t i;
kevin1990 2:625a45555a85 239 uint8_t chAlertReg;
kevin1990 2:625a45555a85 240 uint16_t n;
kevin1990 2:625a45555a85 241
kevin1990 2:625a45555a85 242 memset(pAlerts, 0, sizeof(ADI_Channel_Alert_t));
kevin1990 2:625a45555a85 243
kevin1990 2:625a45555a85 244 eRet = ADISense1000_RegRead(regMap[CORE_CHANNEL_ALERT_STATUS].addr,
kevin1990 2:625a45555a85 245 regMap[CORE_CHANNEL_ALERT_STATUS].size,
kevin1990 2:625a45555a85 246 rcvBuff);
kevin1990 2:625a45555a85 247 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 248 {
kevin1990 2:625a45555a85 249 return eRet;
kevin1990 2:625a45555a85 250 }
kevin1990 2:625a45555a85 251
kevin1990 2:625a45555a85 252 n = ((rcvBuff[1] << 8)&0xff00) | rcvBuff[0];
kevin1990 2:625a45555a85 253 for (i=0; i<ADI_SENSE_NUM_CHANNELS; i++)
kevin1990 2:625a45555a85 254 {
kevin1990 2:625a45555a85 255 if ((n >> i)&0x1)
kevin1990 2:625a45555a85 256 {
kevin1990 2:625a45555a85 257 chAlertReg = baseAlertReg[i];
kevin1990 2:625a45555a85 258 eRet = ADISense1000_RegRead(regMap[chAlertReg].addr,
kevin1990 2:625a45555a85 259 regMap[chAlertReg].size,
kevin1990 2:625a45555a85 260 rcvBuff);
kevin1990 2:625a45555a85 261 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 262 {
kevin1990 2:625a45555a85 263 return eRet;
kevin1990 2:625a45555a85 264 }
kevin1990 2:625a45555a85 265
kevin1990 2:625a45555a85 266 pAlerts[i].VALUE8 = rcvBuff[0];
kevin1990 2:625a45555a85 267 }
kevin1990 2:625a45555a85 268
kevin1990 2:625a45555a85 269 }
kevin1990 2:625a45555a85 270
kevin1990 2:625a45555a85 271 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 272 }
kevin1990 2:625a45555a85 273
kevin1990 2:625a45555a85 274 /*!
kevin1990 2:625a45555a85 275 * @brief Send a configuration to one channel.
kevin1990 2:625a45555a85 276 *
kevin1990 2:625a45555a85 277 * @param[in] ADI_Channel_ID_t : Channel Identifier.
kevin1990 2:625a45555a85 278 * @param[in] ADI_Channel_Config_t : Pointer to channel config data.
kevin1990 2:625a45555a85 279 * @param[out]
kevin1990 2:625a45555a85 280 * @return Status
kevin1990 2:625a45555a85 281 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 282 * - #ADI_SENSE_FAILURE If set channel config fails.
kevin1990 2:625a45555a85 283 *
kevin1990 2:625a45555a85 284 * @details Sends the entire configuration to the select channel during a
kevin1990 2:625a45555a85 285 * single transfer.
kevin1990 2:625a45555a85 286 */
kevin1990 2:625a45555a85 287 ADI_SENSE_RESULT ADISense1000_ConfigureChannel(ADI_Channel_ID_t eChannel,
kevin1990 2:625a45555a85 288 ADI_Channel_Config_t *pConfig)
kevin1990 2:625a45555a85 289 {
kevin1990 2:625a45555a85 290 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 291 uint8_t chBaseReg;
kevin1990 2:625a45555a85 292
kevin1990 2:625a45555a85 293 chBaseReg = baseReg[eChannel];
kevin1990 2:625a45555a85 294 eRet = ADISense1000_RegWrite(regMap[chBaseReg].addr,
kevin1990 2:625a45555a85 295 sizeof(ADI_Channel_Config_t),
kevin1990 2:625a45555a85 296 (uint8_t*)pConfig);
kevin1990 2:625a45555a85 297
kevin1990 2:625a45555a85 298 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 299 {
kevin1990 2:625a45555a85 300 return eRet;
kevin1990 2:625a45555a85 301 }
kevin1990 2:625a45555a85 302
kevin1990 2:625a45555a85 303 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 304 }
kevin1990 2:625a45555a85 305
kevin1990 2:625a45555a85 306 /*!
kevin1990 2:625a45555a85 307 * @brief Start a measurement cycle.
kevin1990 2:625a45555a85 308 *
kevin1990 2:625a45555a85 309 * @param[in] ADI_CORE_Command_Special_Command : Conversion result format.
kevin1990 2:625a45555a85 310 * @param[out]
kevin1990 2:625a45555a85 311 *
kevin1990 2:625a45555a85 312 * @return Status
kevin1990 2:625a45555a85 313 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 314 * - #ADI_SENSE_FAILURE
kevin1990 2:625a45555a85 315 *
kevin1990 2:625a45555a85 316 * @details Sends the latch config command. Configuration for channels in
kevin1990 2:625a45555a85 317 * conversion cycle should be completed before this function.
kevin1990 2:625a45555a85 318 * Channel enabled bit should be set before this function.
kevin1990 2:625a45555a85 319 * Starts a conversion and configures the format of the sample.
kevin1990 2:625a45555a85 320 *
kevin1990 2:625a45555a85 321 */
kevin1990 2:625a45555a85 322 ADI_SENSE_RESULT ADISense1000_StartMeasurement(
kevin1990 2:625a45555a85 323 ADI_CORE_Command_Special_Command cmd)
kevin1990 2:625a45555a85 324 {
kevin1990 2:625a45555a85 325 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 326 ADI_CORE_Command_t command;
kevin1990 2:625a45555a85 327 ADI_CORE_Status_t *statusreg = (ADI_CORE_Status_t *)rcvBuff;
kevin1990 2:625a45555a85 328
kevin1990 2:625a45555a85 329 /* Send the latch command */
kevin1990 2:625a45555a85 330 command.Special_Command = CORE_COMMAND_LATCH_CONFIG;
kevin1990 2:625a45555a85 331 eRet = ADISense1000_RegWrite(regMap[CORE_COMMAND].addr,
kevin1990 2:625a45555a85 332 regMap[CORE_COMMAND].size,
kevin1990 2:625a45555a85 333 (uint8_t*)&command);
kevin1990 2:625a45555a85 334 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 335 {
kevin1990 2:625a45555a85 336 return eRet;
kevin1990 2:625a45555a85 337 }
kevin1990 2:625a45555a85 338
kevin1990 2:625a45555a85 339 /* Wait for command to finish */
kevin1990 2:625a45555a85 340 statusreg->Cmd_Running = true;
kevin1990 2:625a45555a85 341 while (statusreg->Cmd_Running)
kevin1990 2:625a45555a85 342 {
kevin1990 2:625a45555a85 343 wait_ms(10);
kevin1990 2:625a45555a85 344 eRet = ADISense1000_RegRead(regMap[CORE_STATUS].addr,
kevin1990 2:625a45555a85 345 regMap[CORE_STATUS].size,
kevin1990 2:625a45555a85 346 rcvBuff);
kevin1990 2:625a45555a85 347 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 348 {
kevin1990 2:625a45555a85 349 return eRet;
kevin1990 2:625a45555a85 350 }
kevin1990 2:625a45555a85 351 }
kevin1990 2:625a45555a85 352
kevin1990 2:625a45555a85 353 /* Send the user command */
kevin1990 2:625a45555a85 354 command.Special_Command = cmd;
kevin1990 2:625a45555a85 355 eRet = ADISense1000_RegWrite(regMap[CORE_COMMAND].addr,
kevin1990 2:625a45555a85 356 regMap[CORE_COMMAND].size,
kevin1990 2:625a45555a85 357 (uint8_t*)&command);
kevin1990 2:625a45555a85 358
kevin1990 2:625a45555a85 359 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 360 {
kevin1990 2:625a45555a85 361 return eRet;
kevin1990 2:625a45555a85 362 }
kevin1990 2:625a45555a85 363
kevin1990 2:625a45555a85 364
kevin1990 2:625a45555a85 365 /* Wait for command to finish */
kevin1990 2:625a45555a85 366 statusreg->Cmd_Running = true;
kevin1990 2:625a45555a85 367 while (statusreg->Cmd_Running)
kevin1990 2:625a45555a85 368 {
kevin1990 2:625a45555a85 369 wait_ms(10);
kevin1990 2:625a45555a85 370 eRet = ADISense1000_RegRead(regMap[CORE_STATUS].addr,
kevin1990 2:625a45555a85 371 regMap[CORE_STATUS].size,
kevin1990 2:625a45555a85 372 rcvBuff);
kevin1990 2:625a45555a85 373 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 374 {
kevin1990 2:625a45555a85 375 return eRet;
kevin1990 2:625a45555a85 376 }
kevin1990 2:625a45555a85 377 }
kevin1990 2:625a45555a85 378
kevin1990 2:625a45555a85 379 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 380 }
kevin1990 2:625a45555a85 381
kevin1990 2:625a45555a85 382 /*!
kevin1990 2:625a45555a85 383 * @brief Stop measurement on selected channel.
kevin1990 2:625a45555a85 384 *
kevin1990 2:625a45555a85 385 * @param[in] ADI_Channel_ID_t : Channel identifier.
kevin1990 2:625a45555a85 386 * @param[out]
kevin1990 2:625a45555a85 387 *
kevin1990 2:625a45555a85 388 * @return Status
kevin1990 2:625a45555a85 389 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 390 * - #ADI_SENSE_FAILURE
kevin1990 2:625a45555a85 391 *
kevin1990 2:625a45555a85 392 * @details Un-sets the channel enable bit in the selected channel
kevin1990 2:625a45555a85 393 * count register. Retains the cycle count in the channel
kevin1990 2:625a45555a85 394 * count register.
kevin1990 2:625a45555a85 395 *
kevin1990 2:625a45555a85 396 */
kevin1990 2:625a45555a85 397 ADI_SENSE_RESULT ADISense1000_StopMeasurement(ADI_Channel_ID_t eChannel)
kevin1990 2:625a45555a85 398 {
kevin1990 2:625a45555a85 399 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 400 uint8_t setValue;
kevin1990 2:625a45555a85 401 uint8_t chBaseReg;
kevin1990 2:625a45555a85 402 ADI_CORE_Command_t command;
kevin1990 2:625a45555a85 403 ADI_CORE_Status_t *statusreg = (ADI_CORE_Status_t *)rcvBuff;
kevin1990 2:625a45555a85 404
kevin1990 2:625a45555a85 405 /* Read back the count register to store the cycle count for this
kevin1990 2:625a45555a85 406 * channel.
kevin1990 2:625a45555a85 407 */
kevin1990 2:625a45555a85 408 chBaseReg = baseReg[eChannel];
kevin1990 2:625a45555a85 409 eRet = ADISense1000_RegRead(regMap[chBaseReg].addr,
kevin1990 2:625a45555a85 410 regMap[chBaseReg].size, rcvBuff);
kevin1990 2:625a45555a85 411 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 412 {
kevin1990 2:625a45555a85 413 return eRet;
kevin1990 2:625a45555a85 414 }
kevin1990 2:625a45555a85 415
kevin1990 2:625a45555a85 416 /* Zero the enable bit of the count register */
kevin1990 2:625a45555a85 417 setValue = rcvBuff[0] & 0x7f;
kevin1990 2:625a45555a85 418 eRet = ADISense1000_RegWrite(regMap[chBaseReg].addr,
kevin1990 2:625a45555a85 419 regMap[chBaseReg].size,
kevin1990 2:625a45555a85 420 &setValue);
kevin1990 2:625a45555a85 421 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 422 {
kevin1990 2:625a45555a85 423 return eRet;
kevin1990 2:625a45555a85 424 }
kevin1990 2:625a45555a85 425
kevin1990 2:625a45555a85 426 /* Send the latch command */
kevin1990 2:625a45555a85 427 command.Special_Command = CORE_COMMAND_LATCH_CONFIG;
kevin1990 2:625a45555a85 428 eRet = ADISense1000_RegWrite(regMap[CORE_COMMAND].addr,
kevin1990 2:625a45555a85 429 regMap[CORE_COMMAND].size,
kevin1990 2:625a45555a85 430 (uint8_t*)&command);
kevin1990 2:625a45555a85 431 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 432 {
kevin1990 2:625a45555a85 433 return eRet;
kevin1990 2:625a45555a85 434 }
kevin1990 2:625a45555a85 435
kevin1990 2:625a45555a85 436 /* Wait for command to finish */
kevin1990 2:625a45555a85 437 statusreg->Cmd_Running = true;
kevin1990 2:625a45555a85 438 while (statusreg->Cmd_Running)
kevin1990 2:625a45555a85 439 {
kevin1990 2:625a45555a85 440 wait_ms(10);
kevin1990 2:625a45555a85 441 eRet = ADISense1000_RegRead(regMap[CORE_STATUS].addr,
kevin1990 2:625a45555a85 442 regMap[CORE_STATUS].size,
kevin1990 2:625a45555a85 443 rcvBuff);
kevin1990 2:625a45555a85 444 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 445 {
kevin1990 2:625a45555a85 446 return eRet;
kevin1990 2:625a45555a85 447 }
kevin1990 2:625a45555a85 448 }
kevin1990 2:625a45555a85 449
kevin1990 2:625a45555a85 450 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 451 }
kevin1990 2:625a45555a85 452
kevin1990 2:625a45555a85 453 /*!
kevin1990 2:625a45555a85 454 * @brief Get input status of data ready gpio
kevin1990 2:625a45555a85 455 *
kevin1990 2:625a45555a85 456 * @param[in] void
kevin1990 2:625a45555a85 457 * @param[out]
kevin1990 2:625a45555a85 458 *
kevin1990 2:625a45555a85 459 * @return Status
kevin1990 2:625a45555a85 460 * - #bool State of the data ready pin.
kevin1990 2:625a45555a85 461 *
kevin1990 2:625a45555a85 462 *
kevin1990 2:625a45555a85 463 */
kevin1990 2:625a45555a85 464 bool ADISense1000_SampleReady(void)
kevin1990 2:625a45555a85 465 {
kevin1990 2:625a45555a85 466 bool bDrdy=false;
kevin1990 2:625a45555a85 467
kevin1990 2:625a45555a85 468 ADISense1000_HostGpioGet(HOST_READY, &bDrdy);
kevin1990 2:625a45555a85 469 return bDrdy;
kevin1990 2:625a45555a85 470 }
kevin1990 2:625a45555a85 471
kevin1990 2:625a45555a85 472 /*!
kevin1990 2:625a45555a85 473 * @brief Request sample for a selected channel.
kevin1990 2:625a45555a85 474 *
kevin1990 2:625a45555a85 475 * @param[in] ADI_Channel_ID_t : Channel identifier.
kevin1990 2:625a45555a85 476 * @param[out] uint32_t : Pointer to raw ADC sample for channel.
kevin1990 2:625a45555a85 477 * @param[out] float : Pointer to linearised ADC sample for channel.
kevin1990 2:625a45555a85 478 * @param[out] uint8_t : Pointer to channel status.
kevin1990 2:625a45555a85 479 *
kevin1990 2:625a45555a85 480 * @return Status
kevin1990 2:625a45555a85 481 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 482 * - #ADI_SENSE_FAILURE
kevin1990 2:625a45555a85 483 *
kevin1990 2:625a45555a85 484 * @details Reads Data FIFO until a sample for the requested channel is
kevin1990 2:625a45555a85 485 * received.
kevin1990 2:625a45555a85 486 *
kevin1990 2:625a45555a85 487 */
kevin1990 2:625a45555a85 488 ADI_SENSE_RESULT ADISense1000_GetData(uint32_t *pRaw, float *pSample,
kevin1990 2:625a45555a85 489 uint8_t *pStatus)
kevin1990 2:625a45555a85 490 {
kevin1990 2:625a45555a85 491 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 492 ADI_CORE_Data_FIFO_t *pChSample = (ADI_CORE_Data_FIFO_t *)rcvBuff;
kevin1990 2:625a45555a85 493 bool bTimeOut = false;
kevin1990 2:625a45555a85 494 uint32_t timeNow;
kevin1990 2:625a45555a85 495 uint32_t runTime;
kevin1990 2:625a45555a85 496
kevin1990 2:625a45555a85 497 /* Read Data FIFO buffer until sample for channel is read */
kevin1990 2:625a45555a85 498 readTimeout.reset();
kevin1990 2:625a45555a85 499 readTimeout.start();
kevin1990 2:625a45555a85 500 timeNow = readTimeout.read();
kevin1990 2:625a45555a85 501 do {
kevin1990 2:625a45555a85 502 eRet = ADISense1000_RegRead(regMap[CORE_DATA_FIFO].addr,
kevin1990 2:625a45555a85 503 regMap[CORE_DATA_FIFO].size,
kevin1990 2:625a45555a85 504 rcvBuff);
kevin1990 2:625a45555a85 505 runTime = (readTimeout.read() - timeNow);
kevin1990 2:625a45555a85 506 if (runTime > GET_SAMPLE_TIMEOUT)
kevin1990 2:625a45555a85 507 {
kevin1990 2:625a45555a85 508 bTimeOut = true;
kevin1990 2:625a45555a85 509 }
kevin1990 2:625a45555a85 510 wait_ms(10);
kevin1990 2:625a45555a85 511 }
kevin1990 2:625a45555a85 512 while ((pChSample->Ch_Valid != 1) && eRet == ADI_SENSE_SUCCESS &&
kevin1990 2:625a45555a85 513 !(bTimeOut));
kevin1990 2:625a45555a85 514
kevin1990 2:625a45555a85 515 readTimeout.stop();
kevin1990 2:625a45555a85 516
kevin1990 2:625a45555a85 517 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 518 {
kevin1990 2:625a45555a85 519 pChSample->Raw_Sample = 0;
kevin1990 2:625a45555a85 520 pChSample->Sensor_Result = 0;
kevin1990 2:625a45555a85 521 *pRaw = pChSample->Raw_Sample;
kevin1990 2:625a45555a85 522 *pSample = pChSample->Sensor_Result;
kevin1990 2:625a45555a85 523 *pStatus = (pChSample->Channel_ID)|((pChSample->Ch_Error << 4))|
kevin1990 2:625a45555a85 524 ((pChSample->Ch_Alert << 5))|((pChSample->Ch_Raw << 6))|
kevin1990 2:625a45555a85 525 ((pChSample->Ch_Valid << 7));
kevin1990 2:625a45555a85 526
kevin1990 2:625a45555a85 527 return eRet;
kevin1990 2:625a45555a85 528 }
kevin1990 2:625a45555a85 529
kevin1990 2:625a45555a85 530 if (bTimeOut == true)
kevin1990 2:625a45555a85 531 {
kevin1990 2:625a45555a85 532 pChSample->Raw_Sample = 0;
kevin1990 2:625a45555a85 533 pChSample->Sensor_Result = 0;
kevin1990 2:625a45555a85 534 *pRaw = pChSample->Raw_Sample;
kevin1990 2:625a45555a85 535 *pSample = pChSample->Sensor_Result;
kevin1990 2:625a45555a85 536 *pStatus = (pChSample->Channel_ID)|((pChSample->Ch_Error << 4))|
kevin1990 2:625a45555a85 537 ((pChSample->Ch_Alert << 5))|((pChSample->Ch_Raw << 6))|
kevin1990 2:625a45555a85 538 ((pChSample->Ch_Valid << 7));
kevin1990 2:625a45555a85 539
kevin1990 2:625a45555a85 540 return ADI_SENSE_NO_DATA;
kevin1990 2:625a45555a85 541 }
kevin1990 2:625a45555a85 542
kevin1990 2:625a45555a85 543 *pRaw = pChSample->Raw_Sample;
kevin1990 2:625a45555a85 544 *pSample = pChSample->Sensor_Result;
kevin1990 2:625a45555a85 545 *pStatus = (pChSample->Channel_ID)|((pChSample->Ch_Error << 4))|
kevin1990 2:625a45555a85 546 ((pChSample->Ch_Alert << 5))|((pChSample->Ch_Raw << 6))|
kevin1990 2:625a45555a85 547 ((pChSample->Ch_Valid << 7));
kevin1990 2:625a45555a85 548
kevin1990 2:625a45555a85 549 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 550 }
kevin1990 2:625a45555a85 551
kevin1990 2:625a45555a85 552 /*!
kevin1990 2:625a45555a85 553 * @brief Get register value from ADISense1000 Module
kevin1990 2:625a45555a85 554 *
kevin1990 2:625a45555a85 555 * @param[in] uint16_t : Register Identifier
kevin1990 2:625a45555a85 556 * @param[out] uint32_t : Pointer to the register value.
kevin1990 2:625a45555a85 557 *
kevin1990 2:625a45555a85 558 * @return Status
kevin1990 2:625a45555a85 559 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 560 * - #ADI_SENSE_FAILURE
kevin1990 2:625a45555a85 561 * - #ADI_SENSE_INVALID_OPERATION Invalid register identifier.
kevin1990 2:625a45555a85 562 *
kevin1990 2:625a45555a85 563 * @details Will return the value for any of the ADISense modules
kevin1990 2:625a45555a85 564 * 1 byte to 4 byte size. Data FIFO register is not available to
kevin1990 2:625a45555a85 565 * this function.
kevin1990 2:625a45555a85 566 */
kevin1990 2:625a45555a85 567 ADI_SENSE_RESULT ADISense1000_GetRegister(uint16_t reg, uint32_t *pRegValue)
kevin1990 2:625a45555a85 568 {
kevin1990 2:625a45555a85 569 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 570 uint8_t i;
kevin1990 2:625a45555a85 571 uint32_t n;
kevin1990 2:625a45555a85 572
kevin1990 2:625a45555a85 573 if (regMap[reg].rw == WRITE_ONLY || reg > REGISTER_MAP_COUNT
kevin1990 2:625a45555a85 574 || regMap[reg].size > 4)
kevin1990 2:625a45555a85 575 {
kevin1990 2:625a45555a85 576 return ADI_SENSE_INVALID_OPERATION;
kevin1990 2:625a45555a85 577 }
kevin1990 2:625a45555a85 578
kevin1990 2:625a45555a85 579 eRet = ADISense1000_RegRead(regMap[reg].addr, regMap[reg].size, rcvBuff);
kevin1990 2:625a45555a85 580
kevin1990 2:625a45555a85 581 if(eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 582 {
kevin1990 2:625a45555a85 583 return eRet;
kevin1990 2:625a45555a85 584 }
kevin1990 2:625a45555a85 585
kevin1990 2:625a45555a85 586 n=0;
kevin1990 2:625a45555a85 587 for (i=0; i<regMap[reg].size; i++)
kevin1990 2:625a45555a85 588 {
kevin1990 2:625a45555a85 589 n = n | (rcvBuff[i] << (i*8));
kevin1990 2:625a45555a85 590 }
kevin1990 2:625a45555a85 591
kevin1990 2:625a45555a85 592 *pRegValue = n & BIT_MASK((regMap[reg].size*8));
kevin1990 2:625a45555a85 593
kevin1990 2:625a45555a85 594 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 595 }
kevin1990 2:625a45555a85 596
kevin1990 2:625a45555a85 597
kevin1990 2:625a45555a85 598 /*!
kevin1990 2:625a45555a85 599 * @brief Set register value to ADISense1000 Module
kevin1990 2:625a45555a85 600 *
kevin1990 2:625a45555a85 601 * @param[in] uint16_t : Register Identifier.
kevin1990 2:625a45555a85 602 * @param[in] uint32_t : Value to write to register.
kevin1990 2:625a45555a85 603 *
kevin1990 2:625a45555a85 604 * @return Status
kevin1990 2:625a45555a85 605 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 2:625a45555a85 606 * - #ADI_SENSE_FAILURE
kevin1990 2:625a45555a85 607 * - #ADI_SENSE_INVALID_OPERATION Invalid register identifier.
kevin1990 2:625a45555a85 608 *
kevin1990 2:625a45555a85 609 * @details Will write a value to any of the writable ADISense modules
kevin1990 2:625a45555a85 610 * regiters from 1 byte to 4 byte size.
kevin1990 2:625a45555a85 611 *
kevin1990 2:625a45555a85 612 */
kevin1990 2:625a45555a85 613 ADI_SENSE_RESULT ADISense1000_SetRegister(uint16_t reg, uint32_t regValue)
kevin1990 2:625a45555a85 614 {
kevin1990 2:625a45555a85 615 ADI_SENSE_RESULT eRet;
kevin1990 2:625a45555a85 616
kevin1990 2:625a45555a85 617 if (regMap[reg].rw == READ_ONLY || reg > REGISTER_MAP_COUNT
kevin1990 2:625a45555a85 618 || regMap[reg].size > 4)
kevin1990 2:625a45555a85 619 {
kevin1990 2:625a45555a85 620 return ADI_SENSE_INVALID_OPERATION;
kevin1990 2:625a45555a85 621 }
kevin1990 2:625a45555a85 622
kevin1990 2:625a45555a85 623 eRet = ADISense1000_RegWrite(regMap[reg].addr, regMap[reg].size,
kevin1990 2:625a45555a85 624 (uint8_t*)(&regValue));
kevin1990 2:625a45555a85 625
kevin1990 2:625a45555a85 626 if(eRet != ADI_SENSE_SUCCESS)
kevin1990 2:625a45555a85 627 {
kevin1990 2:625a45555a85 628 return eRet;
kevin1990 2:625a45555a85 629 }
kevin1990 2:625a45555a85 630
kevin1990 2:625a45555a85 631 return ADI_SENSE_SUCCESS;
kevin1990 2:625a45555a85 632 }
kevin1990 2:625a45555a85 633