Suppressed conflicting destructor function.
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Dependents: D7A_1x_TRAINING D7_MLX_AND_BAT D7A_1x_demo_sensors_v3
Fork of X_NUCLEO_IKS01A1 by
LSM303C_ACC_driver.c
00001 /** 00002 ****************************************************************************** 00003 * @file LSM303C_ACC_driver.c 00004 * @author MEMS Application Team 00005 * @version V1.1 00006 * @date 24-February-2016 00007 * @brief LSM303C Accelerometer driver file 00008 ****************************************************************************** 00009 * @attention 00010 * 00011 * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> 00012 * 00013 * Redistribution and use in source and binary forms, with or without modification, 00014 * are permitted provided that the following conditions are met: 00015 * 1. Redistributions of source code must retain the above copyright notice, 00016 * this list of conditions and the following disclaimer. 00017 * 2. Redistributions in binary form must reproduce the above copyright notice, 00018 * this list of conditions and the following disclaimer in the documentation 00019 * and/or other materials provided with the distribution. 00020 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00021 * may be used to endorse or promote products derived from this software 00022 * without specific prior written permission. 00023 * 00024 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00025 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00026 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00027 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00028 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00029 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00030 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00031 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00032 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00033 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00034 * 00035 ****************************************************************************** 00036 */ 00037 00038 /* Includes ------------------------------------------------------------------*/ 00039 #include "LSM303C_ACC_driver.h" 00040 00041 /* Imported function prototypes ----------------------------------------------*/ 00042 extern uint8_t LSM303C_ACC_IO_Write(void *handle, uint8_t WriteAddr, uint8_t *pBuffer, uint16_t nBytesToWrite); 00043 extern uint8_t LSM303C_ACC_IO_Read(void *handle, uint8_t ReadAddr, uint8_t *pBuffer, uint16_t nBytesToRead); 00044 00045 /* Private typedef -----------------------------------------------------------*/ 00046 00047 /* Private define ------------------------------------------------------------*/ 00048 00049 /* Private macro -------------------------------------------------------------*/ 00050 00051 /* Private variables ---------------------------------------------------------*/ 00052 00053 /* Private functions ---------------------------------------------------------*/ 00054 00055 /******************************************************************************* 00056 * Function Name : LSM303C_ACC_ReadReg 00057 * Description : Generic Reading function. It must be fullfilled with either 00058 * : I2C or SPI reading functions 00059 * Input : Register Address 00060 * Output : Data REad 00061 * Return : None 00062 *******************************************************************************/ 00063 status_t LSM303C_ACC_ReadReg(void *handle, u8_t Reg, u8_t* Data) 00064 { 00065 00066 if (LSM303C_ACC_IO_Read(handle, Reg, Data, 1)) 00067 { 00068 return MEMS_ERROR; 00069 } 00070 else 00071 { 00072 return MEMS_SUCCESS; 00073 } 00074 } 00075 00076 /******************************************************************************* 00077 * Function Name : LSM303C_ACC_WriteReg 00078 * Description : Generic Writing function. It must be fullfilled with either 00079 * : I2C or SPI writing function 00080 * Input : Register Address, Data to be written 00081 * Output : None 00082 * Return : None 00083 *******************************************************************************/ 00084 status_t LSM303C_ACC_WriteReg(void *handle, u8_t Reg, u8_t Data) 00085 { 00086 00087 if (LSM303C_ACC_IO_Write(handle, Reg, &Data, 1)) 00088 { 00089 return MEMS_ERROR; 00090 } 00091 else 00092 { 00093 return MEMS_SUCCESS; 00094 } 00095 } 00096 00097 /******************************************************************************* 00098 * Function Name : SwapHighLowByte 00099 * Description : Swap High/low byte in multiple byte values 00100 * It works with minimum 2 byte for every dimension. 00101 * Example x,y,z with 2 byte for every dimension 00102 * 00103 * Input : bufferToSwap -> buffer to swap 00104 * numberOfByte -> the buffer length in byte 00105 * dimension -> number of dimension 00106 * 00107 * Output : bufferToSwap -> buffer swapped 00108 * Return : None 00109 *******************************************************************************/ 00110 void LSM303C_ACC_SwapHighLowByte(u8_t *bufferToSwap, u8_t numberOfByte, u8_t dimension) 00111 { 00112 00113 u8_t numberOfByteForDimension, i, j; 00114 u8_t tempValue[10]; 00115 00116 numberOfByteForDimension=numberOfByte/dimension; 00117 00118 for (i=0; i<dimension;i++ ) 00119 { 00120 for (j=0; j<numberOfByteForDimension;j++ ) 00121 tempValue[j]=bufferToSwap[j+i*numberOfByteForDimension]; 00122 for (j=0; j<numberOfByteForDimension;j++ ) 00123 *(bufferToSwap+i*(numberOfByteForDimension)+j)=*(tempValue+(numberOfByteForDimension-1)-j); 00124 } 00125 } 00126 00127 /* Exported functions ---------------------------------------------------------*/ 00128 00129 /******************************************************************************* 00130 * Function Name : LSM303C_ACC_R_WHO_AM_I 00131 * Description : Read WHO_AM_I 00132 * Input : Pointer to u8_t 00133 * Output : Status of WHO_AM_I 00134 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00135 *******************************************************************************/ 00136 00137 status_t LSM303C_ACC_R_WHO_AM_I(void *handle, u8_t *value) 00138 { 00139 if( !LSM303C_ACC_ReadReg(handle, LSM303C_WHO_AM_I_REG_A, (u8_t *)value) ) 00140 return MEMS_ERROR; 00141 00142 *value &= LSM303C_ACC_WHO_AM_I_MASK; //coerce 00143 *value = *value >> LSM303C_ACC_WHO_AM_I_POSITION; //mask 00144 00145 return MEMS_SUCCESS; 00146 } 00147 00148 /******************************************************************************* 00149 * Function Name : LSM303C_ACC_W_XEN 00150 * Description : Write XEN 00151 * Input : LSM303C_ACC_XEN_t 00152 * Output : None 00153 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00154 *******************************************************************************/ 00155 status_t LSM303C_ACC_W_XEN(void *handle, LSM303C_ACC_XEN_t newValue) 00156 { 00157 u8_t value; 00158 00159 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) ) 00160 return MEMS_ERROR; 00161 00162 value &= ~LSM303C_ACC_XEN_MASK; 00163 value |= newValue; 00164 00165 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) ) 00166 return MEMS_ERROR; 00167 00168 return MEMS_SUCCESS; 00169 } 00170 00171 /******************************************************************************* 00172 * Function Name : LSM303C_ACC_R_XEN 00173 * Description : Read XEN 00174 * Input : Pointer to LSM303C_ACC_XEN_t 00175 * Output : Status of XEN see LSM303C_ACC_XEN_t 00176 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00177 *******************************************************************************/ 00178 00179 status_t LSM303C_ACC_R_XEN(void *handle, LSM303C_ACC_XEN_t *value) 00180 { 00181 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) ) 00182 return MEMS_ERROR; 00183 00184 *value &= LSM303C_ACC_XEN_MASK; //mask 00185 00186 return MEMS_SUCCESS; 00187 } 00188 /******************************************************************************* 00189 * Function Name : LSM303C_ACC_W_YEN 00190 * Description : Write YEN 00191 * Input : LSM303C_ACC_YEN_t 00192 * Output : None 00193 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00194 *******************************************************************************/ 00195 status_t LSM303C_ACC_W_YEN(void *handle, LSM303C_ACC_YEN_t newValue) 00196 { 00197 u8_t value; 00198 00199 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) ) 00200 return MEMS_ERROR; 00201 00202 value &= ~LSM303C_ACC_YEN_MASK; 00203 value |= newValue; 00204 00205 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) ) 00206 return MEMS_ERROR; 00207 00208 return MEMS_SUCCESS; 00209 } 00210 00211 /******************************************************************************* 00212 * Function Name : LSM303C_ACC_R_YEN 00213 * Description : Read YEN 00214 * Input : Pointer to LSM303C_ACC_YEN_t 00215 * Output : Status of YEN see LSM303C_ACC_YEN_t 00216 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00217 *******************************************************************************/ 00218 00219 status_t LSM303C_ACC_R_YEN(void *handle, LSM303C_ACC_YEN_t *value) 00220 { 00221 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) ) 00222 return MEMS_ERROR; 00223 00224 *value &= LSM303C_ACC_YEN_MASK; //mask 00225 00226 return MEMS_SUCCESS; 00227 } 00228 /******************************************************************************* 00229 * Function Name : LSM303C_ACC_W_ZEN 00230 * Description : Write ZEN 00231 * Input : LSM303C_ACC_ZEN_t 00232 * Output : None 00233 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00234 *******************************************************************************/ 00235 status_t LSM303C_ACC_W_ZEN(void *handle, LSM303C_ACC_ZEN_t newValue) 00236 { 00237 u8_t value; 00238 00239 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) ) 00240 return MEMS_ERROR; 00241 00242 value &= ~LSM303C_ACC_ZEN_MASK; 00243 value |= newValue; 00244 00245 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) ) 00246 return MEMS_ERROR; 00247 00248 return MEMS_SUCCESS; 00249 } 00250 00251 /******************************************************************************* 00252 * Function Name : LSM303C_ACC_R_ZEN 00253 * Description : Read ZEN 00254 * Input : Pointer to LSM303C_ACC_ZEN_t 00255 * Output : Status of ZEN see LSM303C_ACC_ZEN_t 00256 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00257 *******************************************************************************/ 00258 00259 status_t LSM303C_ACC_R_ZEN(void *handle, LSM303C_ACC_ZEN_t *value) 00260 { 00261 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) ) 00262 return MEMS_ERROR; 00263 00264 *value &= LSM303C_ACC_ZEN_MASK; //mask 00265 00266 return MEMS_SUCCESS; 00267 } 00268 00269 /******************************************************************************* 00270 * Function Name : LSM303C_ACC_W_ODR 00271 * Description : Write ODR 00272 * Input : LSM303C_ACC_ODR_t 00273 * Output : None 00274 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00275 *******************************************************************************/ 00276 status_t LSM303C_ACC_W_ODR(void *handle, LSM303C_ACC_ODR_t newValue) 00277 { 00278 u8_t value; 00279 00280 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) ) 00281 return MEMS_ERROR; 00282 00283 value &= ~LSM303C_ACC_ODR_MASK; 00284 value |= newValue; 00285 00286 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) ) 00287 return MEMS_ERROR; 00288 00289 return MEMS_SUCCESS; 00290 } 00291 00292 /******************************************************************************* 00293 * Function Name : LSM303C_ACC_R_ODR 00294 * Description : Read ODR 00295 * Input : Pointer to LSM303C_ACC_ODR_t 00296 * Output : Status of ODR see LSM303C_ACC_ODR_t 00297 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00298 *******************************************************************************/ 00299 00300 status_t LSM303C_ACC_R_ODR(void *handle, LSM303C_ACC_ODR_t *value) 00301 { 00302 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) ) 00303 return MEMS_ERROR; 00304 00305 *value &= LSM303C_ACC_ODR_MASK; //mask 00306 00307 return MEMS_SUCCESS; 00308 } 00309 00310 /******************************************************************************* 00311 * Function Name : LSM303C_ACC_W_Data_Filter 00312 * Description : Write FDS 00313 * Input : LSM303C_ACC_FDS_t 00314 * Output : None 00315 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00316 *******************************************************************************/ 00317 status_t LSM303C_ACC_W_Data_Filter(void *handle, LSM303C_ACC_FDS_t newValue) 00318 { 00319 u8_t value; 00320 00321 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, &value) ) 00322 return MEMS_ERROR; 00323 00324 value &= ~LSM303C_ACC_FDS_MASK; 00325 value |= newValue; 00326 00327 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG2_A, value) ) 00328 return MEMS_ERROR; 00329 00330 return MEMS_SUCCESS; 00331 } 00332 00333 /******************************************************************************* 00334 * Function Name : LSM303C_ACC_R_Data_Filter 00335 * Description : Read FDS 00336 * Input : Pointer to LSM303C_ACC_FDS_t 00337 * Output : Status of FDS see LSM303C_ACC_FDS_t 00338 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00339 *******************************************************************************/ 00340 00341 status_t LSM303C_ACC_R_Data_Filter(void *handle, LSM303C_ACC_FDS_t *value) 00342 { 00343 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, (u8_t *)value) ) 00344 return MEMS_ERROR; 00345 00346 *value &= LSM303C_ACC_FDS_MASK; //mask 00347 00348 return MEMS_SUCCESS; 00349 } 00350 00351 /******************************************************************************* 00352 * Function Name : LSM303C_ACC_W_hpf_cutoff_freq 00353 * Description : Write HPCF 00354 * Input : LSM303C_ACC_DFC_t 00355 * Output : None 00356 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00357 *******************************************************************************/ 00358 status_t LSM303C_ACC_W_hpf_cutoff_freq(void *handle, LSM303C_ACC_DFC_t newValue) 00359 { 00360 u8_t value; 00361 00362 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, &value) ) 00363 return MEMS_ERROR; 00364 00365 value &= ~LSM303C_ACC_DFC_MASK; 00366 value |= newValue; 00367 00368 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG2_A, value) ) 00369 return MEMS_ERROR; 00370 00371 return MEMS_SUCCESS; 00372 } 00373 00374 /******************************************************************************* 00375 * Function Name : LSM303C_ACC_R_hpf_cutoff_freq 00376 * Description : Read HPCF 00377 * Input : Pointer to LSM303C_ACC_DFC_t 00378 * Output : Status of HPCF see LSM303C_ACC_DFC_t 00379 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00380 *******************************************************************************/ 00381 00382 status_t LSM303C_ACC_R_hpf_cutoff_freq(void *handle, LSM303C_ACC_DFC_t *value) 00383 { 00384 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, (u8_t *)value) ) 00385 return MEMS_ERROR; 00386 00387 *value &= LSM303C_ACC_DFC_MASK; //mask 00388 00389 return MEMS_SUCCESS; 00390 } 00391 /******************************************************************************* 00392 * Function Name : LSM303C_ACC_W_hpf_mode 00393 * Description : Write HPM 00394 * Input : LSM303C_ACC_HPM_t 00395 * Output : None 00396 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00397 *******************************************************************************/ 00398 status_t LSM303C_ACC_W_hpf_mode(void *handle, LSM303C_ACC_HPM_t newValue) 00399 { 00400 u8_t value; 00401 00402 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, &value) ) 00403 return MEMS_ERROR; 00404 00405 value &= ~LSM303C_ACC_HPM_MASK; 00406 value |= newValue; 00407 00408 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG2_A, value) ) 00409 return MEMS_ERROR; 00410 00411 return MEMS_SUCCESS; 00412 } 00413 00414 /******************************************************************************* 00415 * Function Name : LSM303C_ACC_R_hpf_mode 00416 * Description : Read HPM 00417 * Input : Pointer to LSM303C_ACC_HPM_t 00418 * Output : Status of HPM see LSM303C_ACC_HPM_t 00419 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00420 *******************************************************************************/ 00421 00422 status_t LSM303C_ACC_R_hpf_mode(void *handle, LSM303C_ACC_HPM_t *value) 00423 { 00424 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG2_A, (u8_t *)value) ) 00425 return MEMS_ERROR; 00426 00427 *value &= LSM303C_ACC_HPM_MASK; //mask 00428 00429 return MEMS_SUCCESS; 00430 } 00431 00432 /******************************************************************************* 00433 * Function Name : LSM303C_ACC_W_HiRes 00434 * Description : Write HR 00435 * Input : LSM303C_ACC_HR_t 00436 * Output : None 00437 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00438 *******************************************************************************/ 00439 status_t LSM303C_ACC_W_HiRes(void *handle, LSM303C_ACC_HR_t newValue) 00440 { 00441 u8_t value; 00442 00443 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) ) 00444 return MEMS_ERROR; 00445 00446 value &= ~LSM303C_ACC_HR_MASK; 00447 value |= newValue; 00448 00449 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) ) 00450 return MEMS_ERROR; 00451 00452 return MEMS_SUCCESS; 00453 } 00454 00455 /******************************************************************************* 00456 * Function Name : LSM303C_ACC_R_HiRes 00457 * Description : Read HR 00458 * Input : Pointer to LSM303C_ACC_HR_t 00459 * Output : Status of HR see LSM303C_ACC_HR_t 00460 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00461 *******************************************************************************/ 00462 00463 status_t LSM303C_ACC_R_HiRes(void *handle, LSM303C_ACC_HR_t *value) 00464 { 00465 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) ) 00466 return MEMS_ERROR; 00467 00468 *value &= LSM303C_ACC_HR_MASK; //mask 00469 00470 return MEMS_SUCCESS; 00471 } 00472 00473 /******************************************************************************* 00474 * Function Name : LSM303C_ACC_W_FullScale 00475 * Description : Write FS 00476 * Input : LSM303C_ACC_FS_t 00477 * Output : None 00478 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00479 *******************************************************************************/ 00480 status_t LSM303C_ACC_W_FullScale(void *handle, LSM303C_ACC_FS_t newValue) 00481 { 00482 u8_t value; 00483 00484 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG4_A, &value) ) 00485 return MEMS_ERROR; 00486 00487 value &= ~LSM303C_ACC_FS_MASK; 00488 value |= newValue; 00489 00490 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG4_A, value) ) 00491 return MEMS_ERROR; 00492 00493 return MEMS_SUCCESS; 00494 } 00495 00496 /******************************************************************************* 00497 * Function Name : LSM303C_ACC_R_FullScale 00498 * Description : Read FS 00499 * Input : Pointer to LSM303C_ACC_FS_t 00500 * Output : Status of FS see LSM303C_ACC_FS_t 00501 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00502 *******************************************************************************/ 00503 00504 status_t LSM303C_ACC_R_FullScale(void *handle, LSM303C_ACC_FS_t *value) 00505 { 00506 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG4_A, (u8_t *)value) ) 00507 return MEMS_ERROR; 00508 00509 *value &= LSM303C_ACC_FS_MASK; //mask 00510 00511 return MEMS_SUCCESS; 00512 } 00513 00514 /******************************************************************************* 00515 * Function Name : LSM303C_ACC_W_BlockDataUpdate 00516 * Description : Write BDU 00517 * Input : LSM303C_ACC_BDU_t 00518 * Output : None 00519 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00520 *******************************************************************************/ 00521 status_t LSM303C_ACC_W_BlockDataUpdate(void *handle, LSM303C_ACC_BDU_t newValue) 00522 { 00523 u8_t value; 00524 00525 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, &value) ) 00526 return MEMS_ERROR; 00527 00528 value &= ~LSM303C_ACC_BDU_MASK; 00529 value |= newValue; 00530 00531 if( !LSM303C_ACC_WriteReg(handle, LSM303C_CTRL_REG1_A, value) ) 00532 return MEMS_ERROR; 00533 00534 return MEMS_SUCCESS; 00535 } 00536 00537 /******************************************************************************* 00538 * Function Name : LSM303C_ACC_R_BlockDataUpdate 00539 * Description : Read BDU 00540 * Input : Pointer to LSM303C_ACC_BDU_t 00541 * Output : Status of BDU see LSM303C_ACC_BDU_t 00542 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00543 *******************************************************************************/ 00544 00545 status_t LSM303C_ACC_R_BlockDataUpdate(void *handle, LSM303C_ACC_BDU_t *value) 00546 { 00547 if( !LSM303C_ACC_ReadReg(handle, LSM303C_CTRL_REG1_A, (u8_t *)value) ) 00548 return MEMS_ERROR; 00549 00550 *value &= LSM303C_ACC_BDU_MASK; //mask 00551 00552 return MEMS_SUCCESS; 00553 } 00554 00555 /******************************************************************************* 00556 * Function Name : LSM303C_ACC_R_XDataAvail 00557 * Description : Read XDA 00558 * Input : Pointer to LSM303C_ACC_XDA_t 00559 * Output : Status of XDA see LSM303C_ACC_XDA_t 00560 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00561 *******************************************************************************/ 00562 00563 status_t LSM303C_ACC_R_XDataAvail(void *handle, LSM303C_ACC_XDA_t *value) 00564 { 00565 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) ) 00566 return MEMS_ERROR; 00567 00568 *value &= LSM303C_ACC_XDA_MASK; //mask 00569 00570 return MEMS_SUCCESS; 00571 } 00572 /******************************************************************************* 00573 * Function Name : LSM303C_ACC_R_YDataAvail 00574 * Description : Read YDA 00575 * Input : Pointer to LSM303C_ACC_YDA_t 00576 * Output : Status of YDA see LSM303C_ACC_YDA_t 00577 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00578 *******************************************************************************/ 00579 00580 status_t LSM303C_ACC_R_YDataAvail(void *handle, LSM303C_ACC_YDA_t *value) 00581 { 00582 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) ) 00583 return MEMS_ERROR; 00584 00585 *value &= LSM303C_ACC_YDA_MASK; //mask 00586 00587 return MEMS_SUCCESS; 00588 } 00589 /******************************************************************************* 00590 * Function Name : LSM303C_ACC_R_ZDataAvail 00591 * Description : Read ZDA 00592 * Input : Pointer to LSM303C_ACC_ZDA_t 00593 * Output : Status of ZDA see LSM303C_ACC_ZDA_t 00594 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00595 *******************************************************************************/ 00596 00597 status_t LSM303C_ACC_R_ZDataAvail(void *handle, LSM303C_ACC_ZDA_t *value) 00598 { 00599 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) ) 00600 return MEMS_ERROR; 00601 00602 *value &= LSM303C_ACC_ZDA_MASK; //mask 00603 00604 return MEMS_SUCCESS; 00605 } 00606 /******************************************************************************* 00607 * Function Name : LSM303C_ACC_R_XYZDataAvail 00608 * Description : Read ZYXDA 00609 * Input : Pointer to LSM303C_ACC_ZYXDA_t 00610 * Output : Status of ZYXDA see LSM303C_ACC_ZYXDA_t 00611 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00612 *******************************************************************************/ 00613 00614 status_t LSM303C_ACC_R_XYZDataAvail(void *handle, LSM303C_ACC_ZYXDA_t *value) 00615 { 00616 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) ) 00617 return MEMS_ERROR; 00618 00619 *value &= LSM303C_ACC_ZYXDA_MASK; //mask 00620 00621 return MEMS_SUCCESS; 00622 } 00623 /******************************************************************************* 00624 * Function Name : LSM303C_ACC_R_XDataOverrun 00625 * Description : Read XOR 00626 * Input : Pointer to LSM303C_ACC_XOR_t 00627 * Output : Status of XOR see LSM303C_ACC_XOR_t 00628 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00629 *******************************************************************************/ 00630 00631 status_t LSM303C_ACC_R_XDataOverrun(void *handle, LSM303C_ACC_XOR_t *value) 00632 { 00633 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) ) 00634 return MEMS_ERROR; 00635 00636 *value &= LSM303C_ACC_XOR_MASK; //mask 00637 00638 return MEMS_SUCCESS; 00639 } 00640 /******************************************************************************* 00641 * Function Name : LSM303C_ACC_R_YDataOverrun 00642 * Description : Read YOR 00643 * Input : Pointer to LSM303C_ACC_YOR_t 00644 * Output : Status of YOR see LSM303C_ACC_YOR_t 00645 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00646 *******************************************************************************/ 00647 00648 status_t LSM303C_ACC_R_YDataOverrun(void *handle, LSM303C_ACC_YOR_t *value) 00649 { 00650 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) ) 00651 return MEMS_ERROR; 00652 00653 *value &= LSM303C_ACC_YOR_MASK; //mask 00654 00655 return MEMS_SUCCESS; 00656 } 00657 /******************************************************************************* 00658 * Function Name : LSM303C_ACC_R_ZDataOverrun 00659 * Description : Read ZOR 00660 * Input : Pointer to LSM303C_ACC_ZOR_t 00661 * Output : Status of ZOR see LSM303C_ACC_ZOR_t 00662 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00663 *******************************************************************************/ 00664 00665 status_t LSM303C_ACC_R_ZDataOverrun(void *handle, LSM303C_ACC_ZOR_t *value) 00666 { 00667 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) ) 00668 return MEMS_ERROR; 00669 00670 *value &= LSM303C_ACC_ZOR_MASK; //mask 00671 00672 return MEMS_SUCCESS; 00673 } 00674 /******************************************************************************* 00675 * Function Name : LSM303C_ACC_R_XYZDataOverrun 00676 * Description : Read ZYXOR 00677 * Input : Pointer to LSM303C_ACC_ZYXOR_t 00678 * Output : Status of ZYXOR see LSM303C_ACC_ZYXOR_t 00679 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00680 *******************************************************************************/ 00681 00682 status_t LSM303C_ACC_R_XYZDataOverrun(void *handle, LSM303C_ACC_ZYXOR_t *value) 00683 { 00684 if( !LSM303C_ACC_ReadReg(handle, LSM303C_STATUS_REG_A, (u8_t *)value) ) 00685 return MEMS_ERROR; 00686 00687 *value &= LSM303C_ACC_ZYXOR_MASK; //mask 00688 00689 return MEMS_SUCCESS; 00690 } 00691 00692 /******************************************************************************* 00693 * Function Name : status_t LSM303C_ACC_Get_Raw_Acceleration(u8_t *buff) 00694 * Description : Read Acceleration output register 00695 * Input : pointer to [u8_t] 00696 * Output : Acceleration buffer u8_t 00697 * Return : Status [MEMS_ERROR, MEMS_SUCCESS] 00698 *******************************************************************************/ 00699 status_t LSM303C_ACC_Get_Raw_Acceleration(void *handle, u8_t *buff) 00700 { 00701 u8_t i, j, k; 00702 u8_t numberOfByteForDimension; 00703 00704 numberOfByteForDimension=6/3; 00705 00706 k=0; 00707 for (i=0; i<3;i++ ) 00708 { 00709 for (j=0; j<numberOfByteForDimension;j++ ) 00710 { 00711 if( !LSM303C_ACC_ReadReg(handle, LSM303C_OUT_X_L_A+k, &buff[k])) 00712 return MEMS_ERROR; 00713 k++; 00714 } 00715 } 00716 00717 return MEMS_SUCCESS; 00718 } 00719 00720 /* 00721 * Following is the table of sensitivity values for each case. 00722 * Values are espressed in ug/digit. 00723 */ 00724 const long long LSM303C_ACC_Sensitivity_List[3] = { 00725 980, /* FS @2g */ 00726 1950, /* FS @4g */ 00727 3900, /* FS @8g */ 00728 }; 00729 00730 /* 00731 * Values returned are espressed in mg. 00732 */ 00733 status_t LSM303C_ACC_Get_Acceleration(void *handle, int *buff) 00734 { 00735 Type3Axis16bit_U raw_data_tmp; 00736 u8_t fs_mode = 0, shift = 0; 00737 LSM303C_ACC_FS_t fs; 00738 00739 /* Determine the Full Scale the acc is set */ 00740 if(!LSM303C_ACC_R_FullScale(handle, &fs)) { 00741 return MEMS_ERROR; 00742 } 00743 00744 switch (fs) { 00745 case LSM303C_ACC_FS_2G: 00746 fs_mode = 0; 00747 break; 00748 00749 case LSM303C_ACC_FS_4G: 00750 fs_mode = 1; 00751 break; 00752 00753 case LSM303C_ACC_FS_8G: 00754 fs_mode = 2; 00755 break; 00756 } 00757 00758 /* Read out raw accelerometer samples */ 00759 if(!LSM303C_ACC_Get_Raw_Acceleration(handle, raw_data_tmp.u8bit)) { 00760 return MEMS_ERROR; 00761 } 00762 00763 /* Apply proper shift and sensitivity */ 00764 buff[0] = ((raw_data_tmp.i16bit[0] >> shift) * LSM303C_ACC_Sensitivity_List[fs_mode] + 500) / 1000; 00765 buff[1] = ((raw_data_tmp.i16bit[1] >> shift) * LSM303C_ACC_Sensitivity_List[fs_mode] + 500) / 1000; 00766 buff[2] = ((raw_data_tmp.i16bit[2] >> shift) * LSM303C_ACC_Sensitivity_List[fs_mode] + 500) / 1000; 00767 00768 return MEMS_SUCCESS; 00769 }
Generated on Tue Jul 12 2022 17:30:06 by
1.7.2
