Working version. ADXL355 data saved to microSD.

Committer:
DUR
Date:
Fri Sep 29 12:53:50 2017 +0000
Revision:
0:e2579e8d9b13
Working version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DUR 0:e2579e8d9b13 1 /**
DUR 0:e2579e8d9b13 2 ******************************************************************************
DUR 0:e2579e8d9b13 3 * @file adxl355.cpp
DUR 0:e2579e8d9b13 4 * @author DUR
DUR 0:e2579e8d9b13 5 * @version V1.0.0
DUR 0:e2579e8d9b13 6 * @date 01-Aug-2017
DUR 0:e2579e8d9b13 7 * @brief Library for adxl355 interface.
DUR 0:e2579e8d9b13 8 *
DUR 0:e2579e8d9b13 9 * @par Manual Reference Names:
DUR 0:e2579e8d9b13 10 * 1. "Low Noise, Low Drift, Low Power, 3-Axis MEMS Accelerometers
DUR 0:e2579e8d9b13 11 * ADXL354/ADXL355"
DUR 0:e2579e8d9b13 12 * 9/2016—Revision 0: Initial Version
DUR 0:e2579e8d9b13 13 *
DUR 0:e2579e8d9b13 14 * @par Document History:
DUR 0:e2579e8d9b13 15 *
DUR 0:e2579e8d9b13 16 * Version: 1.0.0 (01/08/2017)
DUR 0:e2579e8d9b13 17 * ----------------------------------------------------------------------------
DUR 0:e2579e8d9b13 18 * Author: DUR
DUR 0:e2579e8d9b13 19 * First release.
DUR 0:e2579e8d9b13 20 * ----------------------------------------------------------------------------
DUR 0:e2579e8d9b13 21 *
DUR 0:e2579e8d9b13 22 @verbatim
DUR 0:e2579e8d9b13 23 ================================================================================
DUR 0:e2579e8d9b13 24 ##### How to use this file #####
DUR 0:e2579e8d9b13 25 ================================================================================
DUR 0:e2579e8d9b13 26 Questa libreria è stata redatta per poter gestire ad alto livello il sensore di
DUR 0:e2579e8d9b13 27 accelerazione ad uscita digitale a 20 bit della Analog Devices ADXL355, dotato
DUR 0:e2579e8d9b13 28 di un bus SPI/I2C per la comunicazione, insieme ad un pin per la segnalazione di
DUR 0:e2579e8d9b13 29 nuovi dati pronti e ben 2 pin di interrupt che sono configurabili per scattare a
DUR 0:e2579e8d9b13 30 seguito di ben precisi eventi interni.
DUR 0:e2579e8d9b13 31 Perché si possa utilizzare questa libreria su di una qualunque piattaforma
DUR 0:e2579e8d9b13 32 hardware, la seguente funzione dovrà poi essere associata a quella di basso
DUR 0:e2579e8d9b13 33 livello:
DUR 0:e2579e8d9b13 34 (+) uint16_t adxl355_spi_transfer(uint8_t * rbuffer, uint32_t rlen)
DUR 0:e2579e8d9b13 35 < trasferimento su bus SPI >;
DUR 0:e2579e8d9b13 36 Nella presente versione della libreria, sono state fatte le seguenti scelte
DUR 0:e2579e8d9b13 37 progettuali:
DUR 0:e2579e8d9b13 38 (+) è stato scelto di utilizzare il bus SPI piuttosto che il bus I2C per la
DUR 0:e2579e8d9b13 39 comunicazione da e verso l'host;
DUR 0:e2579e8d9b13 40 (+) è stato scelto l'utilizzo della sincronizzazione interna (EXT_SYNC = 0x00).
DUR 0:e2579e8d9b13 41 L'accelerometro viene configurato dall'utente, per mezzo di una struttura dati
DUR 0:e2579e8d9b13 42 adxl355_handler, con la quale è possibile definire un setting di parametri
DUR 0:e2579e8d9b13 43 applicativi in base alle differenti esigenze. Nel suo utilizzo è importante tenere
DUR 0:e2579e8d9b13 44 a mente le seguenti osservzioni:
DUR 0:e2579e8d9b13 45 (i) dopo avere lanciato il comando di reset software (adxl355_sw_reset) il
DUR 0:e2579e8d9b13 46 sensore deve essere nuovamente inizializzato (adxl355_init);
DUR 0:e2579e8d9b13 47 (i) per effettuare il self test, il sensore deve già essere in modalità di
DUR 0:e2579e8d9b13 48 acquisizione; il camando adxl355_self_test(true) dovrà essere lanciato
DUR 0:e2579e8d9b13 49 più volte perché ad ogni invocazione del metodo viene appicata una
DUR 0:e2579e8d9b13 50 specifica accelerazione all'interno, e quella che si andrà a rilevare
DUR 0:e2579e8d9b13 51 sarà proprio la differenza tra i valori in g rilevati tra due invocazioni
DUR 0:e2579e8d9b13 52 successive, e che dovrà rispettare i valori imposti dal datasheet.
DUR 0:e2579e8d9b13 53 @endverbatim
DUR 0:e2579e8d9b13 54
DUR 0:e2579e8d9b13 55 ******************************************************************************
DUR 0:e2579e8d9b13 56 @attention
DUR 0:e2579e8d9b13 57 <h2><center>&copy; COPYRIGHT(c) 2014 TD Group</center></h2>
DUR 0:e2579e8d9b13 58
DUR 0:e2579e8d9b13 59 The information contained herein is property of TD Group S.p.A.
DUR 0:e2579e8d9b13 60
DUR 0:e2579e8d9b13 61 Licensees are granted free, non-transferable use of the information. NO
DUR 0:e2579e8d9b13 62 WARRANTY of ANY KIND is provided. This heading must NOT be removed from
DUR 0:e2579e8d9b13 63 the file.
DUR 0:e2579e8d9b13 64 ******************************************************************************
DUR 0:e2579e8d9b13 65 */
DUR 0:e2579e8d9b13 66
DUR 0:e2579e8d9b13 67 #define ADXL355_VERSION 1
DUR 0:e2579e8d9b13 68 #define ADXL355_REVISION 0
DUR 0:e2579e8d9b13 69 #define ADXL355_PATCH 0
DUR 0:e2579e8d9b13 70
DUR 0:e2579e8d9b13 71
DUR 0:e2579e8d9b13 72 /* Includes ------------------------------------------------------------------*/
DUR 0:e2579e8d9b13 73
DUR 0:e2579e8d9b13 74 /** @brief Add ONLY the header of THIS source file and not others.
DUR 0:e2579e8d9b13 75 */
DUR 0:e2579e8d9b13 76
DUR 0:e2579e8d9b13 77 #include "adxl355.h"
DUR 0:e2579e8d9b13 78
DUR 0:e2579e8d9b13 79 /** @addtogroup FILE_FUNCTIONS
DUR 0:e2579e8d9b13 80 * @{
DUR 0:e2579e8d9b13 81 */
DUR 0:e2579e8d9b13 82
DUR 0:e2579e8d9b13 83
DUR 0:e2579e8d9b13 84
DUR 0:e2579e8d9b13 85 /* Private function prototypes -----------------------------------------------*/
DUR 0:e2579e8d9b13 86 /* Ricava da una maschera di bit, la posizione del primo bit della maschera stessa */
DUR 0:e2579e8d9b13 87 static uint8_t adxl355_get_bit_position(uint8_t gbp_mask);
DUR 0:e2579e8d9b13 88 /* Setting dei parametri */
DUR 0:e2579e8d9b13 89 static uint16_t adxl355_set_parameter(uint8_t sp_reg, uint8_t sp_mask_data, uint8_t sp_data);
DUR 0:e2579e8d9b13 90 /* Lettura valore accelerazione lungo asse X, Y e Z */
DUR 0:e2579e8d9b13 91 static uint16_t adxl355_read_acc_value(adxl355_handler *adxl_acc);
DUR 0:e2579e8d9b13 92 /* Lettura valore di temperatura */
DUR 0:e2579e8d9b13 93 static uint16_t adxl355_read_temp_value(adxl355_handler *adxl_temp);
DUR 0:e2579e8d9b13 94
DUR 0:e2579e8d9b13 95
DUR 0:e2579e8d9b13 96 /* Private variables ---------------------------------------------------------*/
DUR 0:e2579e8d9b13 97 /* Definisce in ogni momento quali misure sono attive */
DUR 0:e2579e8d9b13 98 static adxl355_measure_enabled adxl_measure_on;
DUR 0:e2579e8d9b13 99
DUR 0:e2579e8d9b13 100
DUR 0:e2579e8d9b13 101 /* Exported variables --------------------------------------------------------*/
DUR 0:e2579e8d9b13 102
DUR 0:e2579e8d9b13 103
DUR 0:e2579e8d9b13 104 /* Private functions ---------------------------------------------------------*/
DUR 0:e2579e8d9b13 105
DUR 0:e2579e8d9b13 106 /** @defgroup Group1 Private_Functions
DUR 0:e2579e8d9b13 107 * @brief Function used only in this file and NOT visible to the rest of the
DUR 0:e2579e8d9b13 108 * code.
DUR 0:e2579e8d9b13 109 * @{
DUR 0:e2579e8d9b13 110 */
DUR 0:e2579e8d9b13 111
DUR 0:e2579e8d9b13 112
DUR 0:e2579e8d9b13 113 /**
DUR 0:e2579e8d9b13 114 * @brief Ricava da una maschera di bit, la posizione del primo bit della maschera
DUR 0:e2579e8d9b13 115 * stessa.
DUR 0:e2579e8d9b13 116 * @note No one.
DUR 0:e2579e8d9b13 117 * @param gbp_mask maschera di bit
DUR 0:e2579e8d9b13 118 * @retval uint8_t posizione del primo bit nella maschera
DUR 0:e2579e8d9b13 119 * @todo Nothing.
DUR 0:e2579e8d9b13 120 * @warning No one.
DUR 0:e2579e8d9b13 121 */
DUR 0:e2579e8d9b13 122 static uint8_t adxl355_get_bit_position(uint8_t gbp_mask)
DUR 0:e2579e8d9b13 123 {
DUR 0:e2579e8d9b13 124 uint8_t gbp_index;
DUR 0:e2579e8d9b13 125
DUR 0:e2579e8d9b13 126 for(gbp_index = 0; gbp_index < 8; gbp_index++)
DUR 0:e2579e8d9b13 127 {
DUR 0:e2579e8d9b13 128 if(((gbp_mask>>gbp_index) & 0x01) != 0)
DUR 0:e2579e8d9b13 129 {
DUR 0:e2579e8d9b13 130 break;
DUR 0:e2579e8d9b13 131 }else{}
DUR 0:e2579e8d9b13 132 }
DUR 0:e2579e8d9b13 133
DUR 0:e2579e8d9b13 134 return gbp_index;
DUR 0:e2579e8d9b13 135 }
DUR 0:e2579e8d9b13 136
DUR 0:e2579e8d9b13 137
DUR 0:e2579e8d9b13 138 /**
DUR 0:e2579e8d9b13 139 * @brief Funzione per la scrittura di un parametro su di un registro dell'accelerometro.
DUR 0:e2579e8d9b13 140 * @note No one.
DUR 0:e2579e8d9b13 141 * @param sp_reg indirizzo del registro da settare
DUR 0:e2579e8d9b13 142 * @param sp_mask_data posizione del/i bit da settare sotto forma di maschera
DUR 0:e2579e8d9b13 143 * @param sp_data valore del/i bit da settare
DUR 0:e2579e8d9b13 144 * @retval uint16_t errore restituito dal metodo (se 0, tutto ok)
DUR 0:e2579e8d9b13 145 * @todo Nothing.
DUR 0:e2579e8d9b13 146 * @warning No one.
DUR 0:e2579e8d9b13 147 */
DUR 0:e2579e8d9b13 148 static uint16_t adxl355_set_parameter(uint8_t sp_reg, uint8_t sp_mask_data, uint8_t sp_data)
DUR 0:e2579e8d9b13 149 {
DUR 0:e2579e8d9b13 150 uint16_t adxl_sp_error = 0u;
DUR 0:e2579e8d9b13 151 uint8_t adxl_sp_data[2];
DUR 0:e2579e8d9b13 152
DUR 0:e2579e8d9b13 153 /* Lettura del registro */
DUR 0:e2579e8d9b13 154 adxl_sp_data[0] = (uint8_t)((sp_reg << 1) | ADXL355_READ_BYTE_MASK);
DUR 0:e2579e8d9b13 155 adxl_sp_data[1] = 0x00;
DUR 0:e2579e8d9b13 156 if(adxl355_spi_transfer((uint8_t*)&adxl_sp_data, 2) == 0)
DUR 0:e2579e8d9b13 157 {
DUR 0:e2579e8d9b13 158 adxl_sp_data[0] = (uint8_t)((sp_reg << 1) & ADXL355_WRITE_BYTE_MASK);
DUR 0:e2579e8d9b13 159 adxl_sp_data[1] &= (uint8_t)~sp_mask_data;
DUR 0:e2579e8d9b13 160 adxl_sp_data[1] |= (uint8_t)(sp_data << (adxl355_get_bit_position(sp_mask_data)));
DUR 0:e2579e8d9b13 161 /* Scrittura del nuovo valore */
DUR 0:e2579e8d9b13 162 if(adxl355_spi_transfer((uint8_t*)&adxl_sp_data, 2) == 0)
DUR 0:e2579e8d9b13 163 {}
DUR 0:e2579e8d9b13 164 else
DUR 0:e2579e8d9b13 165 {
DUR 0:e2579e8d9b13 166 adxl_sp_error = (uint16_t)__LINE__;//ERRORE SCRITTURA REGISTRO
DUR 0:e2579e8d9b13 167 }
DUR 0:e2579e8d9b13 168 }
DUR 0:e2579e8d9b13 169 else
DUR 0:e2579e8d9b13 170 {
DUR 0:e2579e8d9b13 171 adxl_sp_error = (uint16_t)__LINE__;//ERRORE LETTURA REGISTRO
DUR 0:e2579e8d9b13 172 }
DUR 0:e2579e8d9b13 173
DUR 0:e2579e8d9b13 174 return adxl_sp_error;
DUR 0:e2579e8d9b13 175 }
DUR 0:e2579e8d9b13 176
DUR 0:e2579e8d9b13 177
DUR 0:e2579e8d9b13 178 /**
DUR 0:e2579e8d9b13 179 * @brief Funzione di lettura del dato grezzo di accelerazione lungo gli assi
DUR 0:e2579e8d9b13 180 * X, Y e Z dell'accelerometro.
DUR 0:e2579e8d9b13 181 * @note No one.
DUR 0:e2579e8d9b13 182 * @param adxl_acc puntatore all'handler dell'accelerometro
DUR 0:e2579e8d9b13 183 * @retval uint16_t errore restituito dal metodo (se 0, tutto ok)
DUR 0:e2579e8d9b13 184 * @todo No one.
DUR 0:e2579e8d9b13 185 * @warning No one.
DUR 0:e2579e8d9b13 186 */
DUR 0:e2579e8d9b13 187 static uint16_t adxl355_read_acc_value(adxl355_handler *adxl_acc)
DUR 0:e2579e8d9b13 188 {
DUR 0:e2579e8d9b13 189 uint16_t adxl_read_acc_error = 0u;
DUR 0:e2579e8d9b13 190 uint8_t adxl_read_acc_data[10];
DUR 0:e2579e8d9b13 191 /* Azzeramento buffer dati SPI */
DUR 0:e2579e8d9b13 192 memset(adxl_read_acc_data, 0x00, 10);
DUR 0:e2579e8d9b13 193 adxl_read_acc_data[0u] = (uint8_t)((ADXL355_XDATA3<<1) | ADXL355_READ_BYTE_MASK);
DUR 0:e2579e8d9b13 194
DUR 0:e2579e8d9b13 195 if(adxl355_spi_transfer((uint8_t*)&adxl_read_acc_data, 10) == 0)
DUR 0:e2579e8d9b13 196 {
DUR 0:e2579e8d9b13 197 adxl_acc->raw_acc_x_value = 0u;
DUR 0:e2579e8d9b13 198 adxl_acc->raw_acc_x_value = (adxl_read_acc_data[1]<<16u) | (adxl_read_acc_data[2]<<8u) | (adxl_read_acc_data[3]);
DUR 0:e2579e8d9b13 199 adxl_acc->raw_acc_x_value = (adxl_acc->raw_acc_x_value>>4u) & ADXL355_20_BIT_MASK;
DUR 0:e2579e8d9b13 200
DUR 0:e2579e8d9b13 201 adxl_acc->raw_acc_y_value = 0u;
DUR 0:e2579e8d9b13 202 adxl_acc->raw_acc_y_value = (adxl_read_acc_data[4]<<16u) | (adxl_read_acc_data[5]<<8u) | (adxl_read_acc_data[6]);
DUR 0:e2579e8d9b13 203 adxl_acc->raw_acc_y_value = (adxl_acc->raw_acc_y_value>>4u) & ADXL355_20_BIT_MASK;
DUR 0:e2579e8d9b13 204
DUR 0:e2579e8d9b13 205 adxl_acc->raw_acc_z_value = 0u;
DUR 0:e2579e8d9b13 206 adxl_acc->raw_acc_z_value = (adxl_read_acc_data[7]<<16u) | (adxl_read_acc_data[8]<<8u) | (adxl_read_acc_data[9]);
DUR 0:e2579e8d9b13 207 adxl_acc->raw_acc_z_value = (adxl_acc->raw_acc_z_value>>4u) & ADXL355_20_BIT_MASK;
DUR 0:e2579e8d9b13 208 }
DUR 0:e2579e8d9b13 209 else
DUR 0:e2579e8d9b13 210 {
DUR 0:e2579e8d9b13 211 adxl_read_acc_error = (uint16_t)__LINE__;//ERRORE LETTURA DATI ACCELERAZIONE
DUR 0:e2579e8d9b13 212 }
DUR 0:e2579e8d9b13 213
DUR 0:e2579e8d9b13 214 return adxl_read_acc_error;
DUR 0:e2579e8d9b13 215 }
DUR 0:e2579e8d9b13 216
DUR 0:e2579e8d9b13 217
DUR 0:e2579e8d9b13 218
DUR 0:e2579e8d9b13 219 /**
DUR 0:e2579e8d9b13 220 * @brief Funzione di lettura del dato grezzo di temperatura fornito dall'accelerometro.
DUR 0:e2579e8d9b13 221 * @note No one.
DUR 0:e2579e8d9b13 222 * @param adxl_temp puntatore all'handler dell'accelerometro
DUR 0:e2579e8d9b13 223 * @retval uint16_t errore restituito dal metodo (se 0, tutto ok)
DUR 0:e2579e8d9b13 224 * @todo No one.
DUR 0:e2579e8d9b13 225 * @warning No one.
DUR 0:e2579e8d9b13 226 */
DUR 0:e2579e8d9b13 227 static uint16_t adxl355_read_temp_value(adxl355_handler *adxl_temp)
DUR 0:e2579e8d9b13 228 {
DUR 0:e2579e8d9b13 229 uint16_t adxl_read_temp_error = 0u;
DUR 0:e2579e8d9b13 230 uint8_t adxl_read_temp_data[3];
DUR 0:e2579e8d9b13 231 /* Azzeramento buffer dati SPI */
DUR 0:e2579e8d9b13 232 memset(adxl_read_temp_data, 0x00, 3);
DUR 0:e2579e8d9b13 233 adxl_read_temp_data[0u] = (uint8_t)((ADXL355_TEMP2<<1) | ADXL355_READ_BYTE_MASK);
DUR 0:e2579e8d9b13 234
DUR 0:e2579e8d9b13 235 if(adxl355_spi_transfer((uint8_t*)&adxl_read_temp_data, 3) == 0)
DUR 0:e2579e8d9b13 236 {
DUR 0:e2579e8d9b13 237 adxl_temp->raw_temp_value = 0u;
DUR 0:e2579e8d9b13 238 adxl_temp->raw_temp_value = (adxl_read_temp_data[1]<<8u) | adxl_read_temp_data[2];
DUR 0:e2579e8d9b13 239 adxl_temp->raw_temp_value &= ADXL355_12_BIT_MASK;
DUR 0:e2579e8d9b13 240 }
DUR 0:e2579e8d9b13 241 else
DUR 0:e2579e8d9b13 242 {
DUR 0:e2579e8d9b13 243 adxl_read_temp_error = (uint16_t)__LINE__;//ERRORE LETTURA DATI ACCELERAZIONE
DUR 0:e2579e8d9b13 244 }
DUR 0:e2579e8d9b13 245
DUR 0:e2579e8d9b13 246 return adxl_read_temp_error;
DUR 0:e2579e8d9b13 247 }
DUR 0:e2579e8d9b13 248
DUR 0:e2579e8d9b13 249
DUR 0:e2579e8d9b13 250
DUR 0:e2579e8d9b13 251
DUR 0:e2579e8d9b13 252
DUR 0:e2579e8d9b13 253
DUR 0:e2579e8d9b13 254 /**
DUR 0:e2579e8d9b13 255 * @}
DUR 0:e2579e8d9b13 256 */
DUR 0:e2579e8d9b13 257
DUR 0:e2579e8d9b13 258
DUR 0:e2579e8d9b13 259 /* Exported functions --------------------------------------------------------*/
DUR 0:e2579e8d9b13 260
DUR 0:e2579e8d9b13 261 /** @defgroup Group2 Exported_Functions
DUR 0:e2579e8d9b13 262 * @brief Functions used in this file and also visible to the rest of the
DUR 0:e2579e8d9b13 263 * code.
DUR 0:e2579e8d9b13 264 * @{
DUR 0:e2579e8d9b13 265 */
DUR 0:e2579e8d9b13 266
DUR 0:e2579e8d9b13 267
DUR 0:e2579e8d9b13 268
DUR 0:e2579e8d9b13 269 /**
DUR 0:e2579e8d9b13 270 * @brief Funzione che restituisce i parametri identificativi del driver.
DUR 0:e2579e8d9b13 271 * @note No one.
DUR 0:e2579e8d9b13 272 * @param adxl355_driver_version puntatore all'identificatore di versione del driver
DUR 0:e2579e8d9b13 273 * @param adxl355_driver_revision puntatore all'identificatore di revisione del driver
DUR 0:e2579e8d9b13 274 * @param adxl355_driver_patch puntatore all'identificatore di patch del driver
DUR 0:e2579e8d9b13 275 * @retval No one.
DUR 0:e2579e8d9b13 276 * @todo No one.
DUR 0:e2579e8d9b13 277 * @warning No one.
DUR 0:e2579e8d9b13 278 */
DUR 0:e2579e8d9b13 279 void adxl355_driver_info(uint8_t * adxl355_driver_version, uint8_t * adxl355_driver_revision, uint8_t * adxl355_driver_patch)
DUR 0:e2579e8d9b13 280 {
DUR 0:e2579e8d9b13 281 *adxl355_driver_version = ADXL355_VERSION;
DUR 0:e2579e8d9b13 282 *adxl355_driver_revision = ADXL355_REVISION;
DUR 0:e2579e8d9b13 283 *adxl355_driver_patch = ADXL355_PATCH;
DUR 0:e2579e8d9b13 284 }
DUR 0:e2579e8d9b13 285
DUR 0:e2579e8d9b13 286
DUR 0:e2579e8d9b13 287 /**
DUR 0:e2579e8d9b13 288 * @brief Funzione che restituisce l'ID dell'accelerometro.
DUR 0:e2579e8d9b13 289 * @note No one.
DUR 0:e2579e8d9b13 290 * @param adxl355_device_id puntatore all'identificatore del device
DUR 0:e2579e8d9b13 291 * @retval uint16_t errore restituito dal metodo (se 0, tutto ok)
DUR 0:e2579e8d9b13 292 * @todo No one.
DUR 0:e2579e8d9b13 293 * @warning No one.
DUR 0:e2579e8d9b13 294 */
DUR 0:e2579e8d9b13 295 uint16_t adxl355_who_am_i(uint8_t * adxl355_device_id)
DUR 0:e2579e8d9b13 296 {
DUR 0:e2579e8d9b13 297 uint16_t adxl_whoami_error = 0u;
DUR 0:e2579e8d9b13 298 uint8_t adxl_whoami_data[2];
DUR 0:e2579e8d9b13 299
DUR 0:e2579e8d9b13 300 /* Lettura del registro */
DUR 0:e2579e8d9b13 301 adxl_whoami_data[0] = (uint8_t)((ADXL355_PARTID << 1) | ADXL355_READ_BYTE_MASK);
DUR 0:e2579e8d9b13 302 adxl_whoami_data[1] = 0x00;
DUR 0:e2579e8d9b13 303 if(adxl355_spi_transfer((uint8_t*)&adxl_whoami_data, 2) == 0)
DUR 0:e2579e8d9b13 304 {
DUR 0:e2579e8d9b13 305 *adxl355_device_id = adxl_whoami_data[1];
DUR 0:e2579e8d9b13 306 }
DUR 0:e2579e8d9b13 307 else
DUR 0:e2579e8d9b13 308 {
DUR 0:e2579e8d9b13 309 adxl_whoami_error = (uint16_t)__LINE__;//ERRORE LETTURA ID
DUR 0:e2579e8d9b13 310 }
DUR 0:e2579e8d9b13 311
DUR 0:e2579e8d9b13 312 return adxl_whoami_error;
DUR 0:e2579e8d9b13 313 }
DUR 0:e2579e8d9b13 314
DUR 0:e2579e8d9b13 315
DUR 0:e2579e8d9b13 316 /**
DUR 0:e2579e8d9b13 317 * @brief Funzione di inizializzazione dell'accelerometro.
DUR 0:e2579e8d9b13 318 * @note No one.
DUR 0:e2579e8d9b13 319 * @param adxl_init_handler puntatore all'handler dell'accelerometro
DUR 0:e2579e8d9b13 320 * @retval uint16_t errore restituito dal metodo (se 0, tutto ok)
DUR 0:e2579e8d9b13 321 * @todo No one.
DUR 0:e2579e8d9b13 322 * @warning No one.
DUR 0:e2579e8d9b13 323 */
DUR 0:e2579e8d9b13 324 uint16_t adxl355_init(adxl355_handler *adxl_init_handler)
DUR 0:e2579e8d9b13 325 {
DUR 0:e2579e8d9b13 326 uint16_t adxl_init_error = 0u;
DUR 0:e2579e8d9b13 327 uint8_t adxl_init_state = 0u;
DUR 0:e2579e8d9b13 328
DUR 0:e2579e8d9b13 329 switch(adxl_init_state)
DUR 0:e2579e8d9b13 330 {
DUR 0:e2579e8d9b13 331 case 0:/* Configurazione range di misura */
DUR 0:e2579e8d9b13 332 if(0u == adxl355_set_parameter(ADXL355_RANGE, ADXL355_RANGE_MASK, (uint8_t)adxl_init_handler->measure_range))
DUR 0:e2579e8d9b13 333 {}
DUR 0:e2579e8d9b13 334 else
DUR 0:e2579e8d9b13 335 {
DUR 0:e2579e8d9b13 336 adxl_init_error = (uint16_t)__LINE__;//ERRORE SETTING RANGE DI MISURA
DUR 0:e2579e8d9b13 337 break;
DUR 0:e2579e8d9b13 338 }
DUR 0:e2579e8d9b13 339
DUR 0:e2579e8d9b13 340
DUR 0:e2579e8d9b13 341 case 1:/* Configurazione output data rate */
DUR 0:e2579e8d9b13 342 if(0u == adxl355_set_parameter(ADXL355_FILTER, ADXL355_ODR_MASK, (uint8_t)adxl_init_handler->out_data_rate))
DUR 0:e2579e8d9b13 343 {}
DUR 0:e2579e8d9b13 344 else
DUR 0:e2579e8d9b13 345 {
DUR 0:e2579e8d9b13 346 adxl_init_error = (uint16_t)__LINE__;//ERRORE SETTING OUTPUT DATA RATE
DUR 0:e2579e8d9b13 347 break;
DUR 0:e2579e8d9b13 348 }
DUR 0:e2579e8d9b13 349
DUR 0:e2579e8d9b13 350
DUR 0:e2579e8d9b13 351 case 2:/* Configurazione polarità interrupt */
DUR 0:e2579e8d9b13 352 if((adxl_init_handler->int1_pin == NULL) &&
DUR 0:e2579e8d9b13 353 (adxl_init_handler->int2_pin == NULL)){}//Se i pin non sono configurati, è inutile configurare la polarità degli interrupt
DUR 0:e2579e8d9b13 354 else
DUR 0:e2579e8d9b13 355 {
DUR 0:e2579e8d9b13 356 if(0u == adxl355_set_parameter(ADXL355_RANGE, ADXL355_ODR_MASK, (adxl_init_handler->int_config.int_act_low==true) ? 0:1))
DUR 0:e2579e8d9b13 357 {}
DUR 0:e2579e8d9b13 358 else
DUR 0:e2579e8d9b13 359 {
DUR 0:e2579e8d9b13 360 adxl_init_error = (uint16_t)__LINE__;//ERRORE SETTING POLARITA' INTERRUPT
DUR 0:e2579e8d9b13 361 break;
DUR 0:e2579e8d9b13 362 }
DUR 0:e2579e8d9b13 363 }
DUR 0:e2579e8d9b13 364
DUR 0:e2579e8d9b13 365
DUR 0:e2579e8d9b13 366 case 3:/* Configurazione interrupt 1 */
DUR 0:e2579e8d9b13 367 if(adxl_init_handler->int1_pin == NULL){}//Se il pin non è configurato, è inutile configurare il relativo interrupt
DUR 0:e2579e8d9b13 368 else
DUR 0:e2579e8d9b13 369 {
DUR 0:e2579e8d9b13 370 if(0u == adxl355_set_parameter(ADXL355_INT_MAP, ADXL355_INT_1_MASK, (uint8_t)adxl_init_handler->int_config.int1_evt))
DUR 0:e2579e8d9b13 371 {}
DUR 0:e2579e8d9b13 372 else
DUR 0:e2579e8d9b13 373 {
DUR 0:e2579e8d9b13 374 adxl_init_error = (uint16_t)__LINE__;//ERRORE SETTING EVENTO ASSOCIATO AD INTERRUPT 1
DUR 0:e2579e8d9b13 375 break;
DUR 0:e2579e8d9b13 376 }
DUR 0:e2579e8d9b13 377 }
DUR 0:e2579e8d9b13 378
DUR 0:e2579e8d9b13 379
DUR 0:e2579e8d9b13 380 case 4:/* Configurazione interrupt 2 */
DUR 0:e2579e8d9b13 381 if(adxl_init_handler->int2_pin == NULL){}//Se il pin non è configurato, è inutile configurare il relativo interrupt
DUR 0:e2579e8d9b13 382 else
DUR 0:e2579e8d9b13 383 {
DUR 0:e2579e8d9b13 384 if(0u == adxl355_set_parameter(ADXL355_INT_MAP, ADXL355_INT_2_MASK, (uint8_t)adxl_init_handler->int_config.int2_evt))
DUR 0:e2579e8d9b13 385 {}
DUR 0:e2579e8d9b13 386 else
DUR 0:e2579e8d9b13 387 {
DUR 0:e2579e8d9b13 388 adxl_init_error = (uint16_t)__LINE__;//ERRORE SETTING EVENTO ASSOCIATO AD INTERRUPT 2
DUR 0:e2579e8d9b13 389 break;
DUR 0:e2579e8d9b13 390 }
DUR 0:e2579e8d9b13 391 }
DUR 0:e2579e8d9b13 392
DUR 0:e2579e8d9b13 393
DUR 0:e2579e8d9b13 394 case 5:/* Stop di tutte le possibili misure */
DUR 0:e2579e8d9b13 395 if(0u == adxl355_start_acquisition(adxl355_none))
DUR 0:e2579e8d9b13 396 {}
DUR 0:e2579e8d9b13 397 else
DUR 0:e2579e8d9b13 398 {
DUR 0:e2579e8d9b13 399 adxl_init_error = (uint16_t)__LINE__;//ERRORE SETTING STOP MISURE
DUR 0:e2579e8d9b13 400 break;
DUR 0:e2579e8d9b13 401 }
DUR 0:e2579e8d9b13 402
DUR 0:e2579e8d9b13 403
DUR 0:e2579e8d9b13 404 case 6:/* Self-test disabilitato */
DUR 0:e2579e8d9b13 405 if(0u == adxl355_self_test(false))
DUR 0:e2579e8d9b13 406 {}
DUR 0:e2579e8d9b13 407 else
DUR 0:e2579e8d9b13 408 {
DUR 0:e2579e8d9b13 409 adxl_init_error = (uint16_t)__LINE__;//ERRORE DISABILITAZIONE SELF-TEST
DUR 0:e2579e8d9b13 410 break;
DUR 0:e2579e8d9b13 411 }
DUR 0:e2579e8d9b13 412
DUR 0:e2579e8d9b13 413
DUR 0:e2579e8d9b13 414 default:
DUR 0:e2579e8d9b13 415 break;
DUR 0:e2579e8d9b13 416 }
DUR 0:e2579e8d9b13 417
DUR 0:e2579e8d9b13 418 return adxl_init_error;
DUR 0:e2579e8d9b13 419 }
DUR 0:e2579e8d9b13 420
DUR 0:e2579e8d9b13 421
DUR 0:e2579e8d9b13 422
DUR 0:e2579e8d9b13 423 /**
DUR 0:e2579e8d9b13 424 * @brief Funzione di start/stop delle acquisizioni.
DUR 0:e2579e8d9b13 425 * @note No one.
DUR 0:e2579e8d9b13 426 * @param adxl_start misura/e da avviare
DUR 0:e2579e8d9b13 427 * @retval uint16_t errore restituito dal metodo (se 0, tutto ok)
DUR 0:e2579e8d9b13 428 * @todo No one.
DUR 0:e2579e8d9b13 429 * @warning No one.
DUR 0:e2579e8d9b13 430 */
DUR 0:e2579e8d9b13 431 uint16_t adxl355_start_acquisition(adxl355_measure_enabled adxl_start)
DUR 0:e2579e8d9b13 432 {
DUR 0:e2579e8d9b13 433 uint16_t adxl_start_error = 0u;
DUR 0:e2579e8d9b13 434 uint8_t adxl_start_data;
DUR 0:e2579e8d9b13 435
DUR 0:e2579e8d9b13 436 switch(adxl_start)
DUR 0:e2579e8d9b13 437 {
DUR 0:e2579e8d9b13 438 case 0://Solo accelerazione
DUR 0:e2579e8d9b13 439 adxl_start_data = 0x02;
DUR 0:e2579e8d9b13 440 break;
DUR 0:e2579e8d9b13 441
DUR 0:e2579e8d9b13 442 case 1://Entrambe le misure (accelerazione e temperatura)
DUR 0:e2579e8d9b13 443 adxl_start_data = 0x00;
DUR 0:e2579e8d9b13 444 break;
DUR 0:e2579e8d9b13 445
DUR 0:e2579e8d9b13 446 case 2://Nessuna misura (mette in standby il sensore)
DUR 0:e2579e8d9b13 447 adxl_start_data = 0x03;
DUR 0:e2579e8d9b13 448 break;
DUR 0:e2579e8d9b13 449
DUR 0:e2579e8d9b13 450 default:
DUR 0:e2579e8d9b13 451 break;
DUR 0:e2579e8d9b13 452 }
DUR 0:e2579e8d9b13 453
DUR 0:e2579e8d9b13 454 if(0u == adxl355_set_parameter(ADXL355_POWER_CTL, ADXL355_MEAS_MASK, adxl_start_data))
DUR 0:e2579e8d9b13 455 {
DUR 0:e2579e8d9b13 456 adxl_measure_on = adxl_start;
DUR 0:e2579e8d9b13 457 }
DUR 0:e2579e8d9b13 458 else
DUR 0:e2579e8d9b13 459 {
DUR 0:e2579e8d9b13 460 adxl_start_error = (uint16_t)__LINE__;//ERRORE SETTING RANGE DI MISURA
DUR 0:e2579e8d9b13 461 }
DUR 0:e2579e8d9b13 462
DUR 0:e2579e8d9b13 463 return adxl_start_error;
DUR 0:e2579e8d9b13 464 }
DUR 0:e2579e8d9b13 465
DUR 0:e2579e8d9b13 466
DUR 0:e2579e8d9b13 467
DUR 0:e2579e8d9b13 468 /**
DUR 0:e2579e8d9b13 469 * @brief Funzione per la lettura del/i dato/i acquisito/i.
DUR 0:e2579e8d9b13 470 * @note No one.
DUR 0:e2579e8d9b13 471 * @param adxl_data_handler puntatore all'handler dell'accelerometro
DUR 0:e2579e8d9b13 472 * @retval uint16_t errore restituito dal metodo (se 0, tutto ok)
DUR 0:e2579e8d9b13 473 * @todo No one.
DUR 0:e2579e8d9b13 474 * @warning No one.
DUR 0:e2579e8d9b13 475 */
DUR 0:e2579e8d9b13 476 uint16_t adxl355_get_data(adxl355_handler *adxl_data_handler)
DUR 0:e2579e8d9b13 477 {
DUR 0:e2579e8d9b13 478 uint16_t adxl_data_error = 0u;
DUR 0:e2579e8d9b13 479
DUR 0:e2579e8d9b13 480 if((adxl_measure_on == adxl355_acc) || (adxl_measure_on == adxl355_both))
DUR 0:e2579e8d9b13 481 { /* Lettura accelerazione */
DUR 0:e2579e8d9b13 482 if(adxl355_read_acc_value(adxl_data_handler) == 0u)
DUR 0:e2579e8d9b13 483 {
DUR 0:e2579e8d9b13 484 if(adxl_measure_on == adxl355_both)
DUR 0:e2579e8d9b13 485 { /* Lettura temperatura */
DUR 0:e2579e8d9b13 486 if(adxl355_read_temp_value(adxl_data_handler) == 0u)
DUR 0:e2579e8d9b13 487 {}
DUR 0:e2579e8d9b13 488 else
DUR 0:e2579e8d9b13 489 {
DUR 0:e2579e8d9b13 490 adxl_data_error = (uint16_t)__LINE__;//ERRORE LETTURA MISURA TEMPERATURA
DUR 0:e2579e8d9b13 491 }
DUR 0:e2579e8d9b13 492 }
DUR 0:e2579e8d9b13 493 else{}
DUR 0:e2579e8d9b13 494
DUR 0:e2579e8d9b13 495 }
DUR 0:e2579e8d9b13 496 else
DUR 0:e2579e8d9b13 497 {
DUR 0:e2579e8d9b13 498 adxl_data_error = (uint16_t)__LINE__;//ERRORE LETTURA MISURA ACCELERAZIONE
DUR 0:e2579e8d9b13 499 }
DUR 0:e2579e8d9b13 500 }else{}
DUR 0:e2579e8d9b13 501
DUR 0:e2579e8d9b13 502 return adxl_data_error;
DUR 0:e2579e8d9b13 503 }
DUR 0:e2579e8d9b13 504
DUR 0:e2579e8d9b13 505
DUR 0:e2579e8d9b13 506
DUR 0:e2579e8d9b13 507 /**
DUR 0:e2579e8d9b13 508 * @brief Funzione che restituisce il valore grezzo di accelerazione lungo l'asse X.
DUR 0:e2579e8d9b13 509 * @note No one.
DUR 0:e2579e8d9b13 510 * @param adxl_xdata_handler puntatore all'handler dell'accelerometro
DUR 0:e2579e8d9b13 511 * @retval uint32_t valore grezzo accelerazione
DUR 0:e2579e8d9b13 512 * @todo No one.
DUR 0:e2579e8d9b13 513 * @warning No one.
DUR 0:e2579e8d9b13 514 */
DUR 0:e2579e8d9b13 515 uint32_t adxl355_raw_x_acc(adxl355_handler *adxl_xdata_handler)
DUR 0:e2579e8d9b13 516 {
DUR 0:e2579e8d9b13 517 return adxl_xdata_handler->raw_acc_x_value;
DUR 0:e2579e8d9b13 518 }
DUR 0:e2579e8d9b13 519
DUR 0:e2579e8d9b13 520
DUR 0:e2579e8d9b13 521
DUR 0:e2579e8d9b13 522 /**
DUR 0:e2579e8d9b13 523 * @brief Funzione che restituisce il valore grezzo di accelerazione lungo l'asse Y.
DUR 0:e2579e8d9b13 524 * @note No one.
DUR 0:e2579e8d9b13 525 * @param adxl_ydata_handler puntatore all'handler dell'accelerometro
DUR 0:e2579e8d9b13 526 * @retval uint32_t valore grezzo accelerazione
DUR 0:e2579e8d9b13 527 * @todo No one.
DUR 0:e2579e8d9b13 528 * @warning No one.
DUR 0:e2579e8d9b13 529 */
DUR 0:e2579e8d9b13 530 uint32_t adxl355_raw_y_acc(adxl355_handler *adxl_ydata_handler)
DUR 0:e2579e8d9b13 531 {
DUR 0:e2579e8d9b13 532 return adxl_ydata_handler->raw_acc_y_value;
DUR 0:e2579e8d9b13 533 }
DUR 0:e2579e8d9b13 534
DUR 0:e2579e8d9b13 535
DUR 0:e2579e8d9b13 536
DUR 0:e2579e8d9b13 537 /**
DUR 0:e2579e8d9b13 538 * @brief Funzione che restituisce il valore grezzo di accelerazione lungo l'asse Z.
DUR 0:e2579e8d9b13 539 * @note No one.
DUR 0:e2579e8d9b13 540 * @param adxl_zdata_handler puntatore all'handler dell'accelerometro
DUR 0:e2579e8d9b13 541 * @retval uint32_t valore grezzo accelerazione
DUR 0:e2579e8d9b13 542 * @todo No one.
DUR 0:e2579e8d9b13 543 * @warning No one.
DUR 0:e2579e8d9b13 544 */
DUR 0:e2579e8d9b13 545 uint32_t adxl355_raw_z_acc(adxl355_handler *adxl_zdata_handler)
DUR 0:e2579e8d9b13 546 {
DUR 0:e2579e8d9b13 547 return adxl_zdata_handler->raw_acc_z_value;
DUR 0:e2579e8d9b13 548 }
DUR 0:e2579e8d9b13 549
DUR 0:e2579e8d9b13 550
DUR 0:e2579e8d9b13 551
DUR 0:e2579e8d9b13 552 /**
DUR 0:e2579e8d9b13 553 * @brief Funzione che restituisce il valore grezzo di temperatura.
DUR 0:e2579e8d9b13 554 * @note No one.
DUR 0:e2579e8d9b13 555 * @param adxl_tdata_handler puntatore all'handler dell'accelerometro
DUR 0:e2579e8d9b13 556 * @retval uint16_t valore grezzo temperatura
DUR 0:e2579e8d9b13 557 * @todo No one.
DUR 0:e2579e8d9b13 558 * @warning No one.
DUR 0:e2579e8d9b13 559 */
DUR 0:e2579e8d9b13 560 uint16_t adxl355_raw_temp(adxl355_handler *adxl_tdata_handler)
DUR 0:e2579e8d9b13 561 {
DUR 0:e2579e8d9b13 562 return adxl_tdata_handler->raw_temp_value;
DUR 0:e2579e8d9b13 563 }
DUR 0:e2579e8d9b13 564
DUR 0:e2579e8d9b13 565
DUR 0:e2579e8d9b13 566
DUR 0:e2579e8d9b13 567 /**
DUR 0:e2579e8d9b13 568 * @brief Funzione per il reset sw.
DUR 0:e2579e8d9b13 569 * @note No one.
DUR 0:e2579e8d9b13 570 * @param No one.
DUR 0:e2579e8d9b13 571 * @retval uint16_t errore restituito dal metodo (se 0, tutto ok)
DUR 0:e2579e8d9b13 572 * @todo No one.
DUR 0:e2579e8d9b13 573 * @warning No one.
DUR 0:e2579e8d9b13 574 */
DUR 0:e2579e8d9b13 575 uint16_t adxl355_sw_reset(void)
DUR 0:e2579e8d9b13 576 {
DUR 0:e2579e8d9b13 577 uint16_t adxl_swres_error = 0u;
DUR 0:e2579e8d9b13 578 uint8_t adxl_swres_data[2];
DUR 0:e2579e8d9b13 579
DUR 0:e2579e8d9b13 580 /* Lettura del registro */
DUR 0:e2579e8d9b13 581 adxl_swres_data[0] = (uint8_t)((ADXL355_RESET << 1) & ADXL355_WRITE_BYTE_MASK);
DUR 0:e2579e8d9b13 582 adxl_swres_data[1] = ADXL355_RESET_CODE;
DUR 0:e2579e8d9b13 583 if(adxl355_spi_transfer((uint8_t*)&adxl_swres_data, 2) == 0)
DUR 0:e2579e8d9b13 584 {}
DUR 0:e2579e8d9b13 585 else
DUR 0:e2579e8d9b13 586 {
DUR 0:e2579e8d9b13 587 adxl_swres_error = (uint16_t)__LINE__;//ERRORE RESET ACCELEROMETRO
DUR 0:e2579e8d9b13 588 }
DUR 0:e2579e8d9b13 589
DUR 0:e2579e8d9b13 590 return adxl_swres_error;
DUR 0:e2579e8d9b13 591 }
DUR 0:e2579e8d9b13 592
DUR 0:e2579e8d9b13 593
DUR 0:e2579e8d9b13 594
DUR 0:e2579e8d9b13 595 /**
DUR 0:e2579e8d9b13 596 * @brief Funzione per il self-test.
DUR 0:e2579e8d9b13 597 * @note Questo metodo va utilizzato lanciandolo ponendo a true adxl_start
DUR 0:e2579e8d9b13 598 * ad acquisizione in corso; in questa modalità il metodo va lanciato
DUR 0:e2579e8d9b13 599 * diverse volte in modo che si possa registrare la variazione di
DUR 0:e2579e8d9b13 600 * accelerazione sui 3 assi che deve essere, secondo datasheet:
DUR 0:e2579e8d9b13 601 * [X]: 0.3g
DUR 0:e2579e8d9b13 602 * [Y]: 0.3g
DUR 0:e2579e8d9b13 603 * [Z]: 1.5g
DUR 0:e2579e8d9b13 604 * In modalità self-test, il sensore non registra alcuna accelerazione
DUR 0:e2579e8d9b13 605 * esterna; ponendo a false adxl_start, il sensore termina il self-test
DUR 0:e2579e8d9b13 606 * e ritorna in modalità normale di funzionamento.
DUR 0:e2579e8d9b13 607 * @param adxl_start booleano per avviare/fermare il self test
DUR 0:e2579e8d9b13 608 * @retval uint16_t errore restituito dal metodo (se 0, tutto ok)
DUR 0:e2579e8d9b13 609 * @todo No one.
DUR 0:e2579e8d9b13 610 * @warning No one.
DUR 0:e2579e8d9b13 611 */
DUR 0:e2579e8d9b13 612 uint16_t adxl355_self_test(bool adxl_start)
DUR 0:e2579e8d9b13 613 {
DUR 0:e2579e8d9b13 614 uint16_t adxl_st_error = 0u;
DUR 0:e2579e8d9b13 615 static uint8_t adxl_st2_val = 0u;
DUR 0:e2579e8d9b13 616
DUR 0:e2579e8d9b13 617 if(adxl_start == true)
DUR 0:e2579e8d9b13 618 {
DUR 0:e2579e8d9b13 619 adxl_measure_on = adxl355_acc;
DUR 0:e2579e8d9b13 620 if(0u == adxl355_set_parameter(ADXL355_SELF_TEST, ADXL355_SELF_TEST_MASK, (adxl_st2_val<<1)|ADXL355_SELF_TEST_ENABLE ))
DUR 0:e2579e8d9b13 621 {
DUR 0:e2579e8d9b13 622 if(adxl_st2_val == 0u) adxl_st2_val = 1u;
DUR 0:e2579e8d9b13 623 else adxl_st2_val = 0u;
DUR 0:e2579e8d9b13 624 }
DUR 0:e2579e8d9b13 625 else
DUR 0:e2579e8d9b13 626 {
DUR 0:e2579e8d9b13 627 adxl_st_error = (uint16_t)__LINE__;//ERRORE AVVIO SELF-TEST
DUR 0:e2579e8d9b13 628 }
DUR 0:e2579e8d9b13 629 }
DUR 0:e2579e8d9b13 630 else
DUR 0:e2579e8d9b13 631 {
DUR 0:e2579e8d9b13 632 if(0u == adxl355_set_parameter(ADXL355_SELF_TEST, ADXL355_SELF_TEST_MASK, ADXL355_SELF_TEST_DISABLE))
DUR 0:e2579e8d9b13 633 {
DUR 0:e2579e8d9b13 634 adxl_st2_val = 0u;
DUR 0:e2579e8d9b13 635 }
DUR 0:e2579e8d9b13 636 else
DUR 0:e2579e8d9b13 637 {
DUR 0:e2579e8d9b13 638 adxl_st_error = (uint16_t)__LINE__;//ERRORE STOP SELF-TEST
DUR 0:e2579e8d9b13 639 }
DUR 0:e2579e8d9b13 640 }
DUR 0:e2579e8d9b13 641
DUR 0:e2579e8d9b13 642 return adxl_st_error;
DUR 0:e2579e8d9b13 643 }
DUR 0:e2579e8d9b13 644
DUR 0:e2579e8d9b13 645
DUR 0:e2579e8d9b13 646
DUR 0:e2579e8d9b13 647 /**
DUR 0:e2579e8d9b13 648 * @}
DUR 0:e2579e8d9b13 649 */
DUR 0:e2579e8d9b13 650
DUR 0:e2579e8d9b13 651
DUR 0:e2579e8d9b13 652
DUR 0:e2579e8d9b13 653 /**
DUR 0:e2579e8d9b13 654 * @}
DUR 0:e2579e8d9b13 655 */
DUR 0:e2579e8d9b13 656
DUR 0:e2579e8d9b13 657 /************************ (C) COPYRIGHT TD Group *****END OF FILE**************/
DUR 0:e2579e8d9b13 658
DUR 0:e2579e8d9b13 659