社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 916|回复: 19

[环境传感器] LSM303电子罗盘测试结果

[复制链接]

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-9-12 20:49:36 | 显示全部楼层 |阅读模式
找到一个STM32F051的板子,发现板子基本的调试都忘光了,熟悉了半天开发板,先把数据读出来再说。串口返回数据如下,
参考其他的例程,先设置几个参数(具体的参数都打印出来 了),语文是没学好,都不知道该说些什么了,用过的朋友帮忙看下结果是否正确,传感器板子放在桌子上不动,返回的如下结果。
Start ...
SET_ODR_OK
SET_ODR_M_OK
SET_MODE_OK
SET_MODE_MAG_OK
SET_FULLSCALE_OK
SET_GAIN_MAG_OK
SET_AXIS_OK
AXIS_X value is -41
AXIS_Y value is 1
AXIS_Z value is -1058

AXIS_X value is -41
AXIS_Y value is 1
AXIS_Z value is -1058

AXIS_X value is -41
AXIS_Y value is 1
AXIS_Z value is -1058

AXIS_X value is -43
AXIS_Y value is 2
AXIS_Z value is -1058

AXIS_X value is -43
AXIS_Y value is 2
AXIS_Z value is -1058

AXIS_X value is -43
AXIS_Y value is 2
AXIS_Z value is -1058

AXIS_X value is -43
AXIS_Y value is 2
AXIS_Z value is -1058

AXIS_X value is -43
AXIS_Y value is 2
AXIS_Z value is -1062

AXIS_X value is -46
AXIS_Y value is 3
AXIS_Z value is -1062

AXIS_X value is -46
AXIS_Y value is 3
AXIS_Z value is -1062

AXIS_X value is -46
AXIS_Y value is 3
AXIS_Z value is -1062

AXIS_X value is -46
AXIS_Y value is 3
AXIS_Z value is -1062

AXIS_X value is -44
AXIS_Y value is 3
AXIS_Z value is -1063

AXIS_X value is -44
AXIS_Y value is 3
AXIS_Z value is -1063

AXIS_X value is -44
AXIS_Y value is 3
AXIS_Z value is -1063

AXIS_X value is -44
AXIS_Y value is 3
AXIS_Z value is -1063

AXIS_X value is -44
AXIS_Y value is 3
AXIS_Z value is -1063

AXIS_X value is -45
AXIS_Y value is 6
AXIS_Z value is -1059
607398720902978366.jpg
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

5028

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-12 21:53:00 来自手机 | 显示全部楼层
看这个更像是加速度的数据

点评

您说的对,我读磁场的值都是0,不知道是那里出问题了。 Start ... SET_ODR_OK SET_ODR_M_OK SET_MODE_OK SET_MODE_MAG_OK SET_FULLSCALE_OK SET_GAIN_MAG_OK SET_AXIS_OK AXIS_X value is -39 AXIS_Y val  详情 回复 发表于 2017-9-13 11:51


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-13 11:51:05 | 显示全部楼层
littleshrimp 发表于 2017-9-12 21:53
看这个更像是加速度的数据

您说的对,我读磁场的值都是0,不知道是那里出问题了。
Start ...
SET_ODR_OK
SET_ODR_M_OK
SET_MODE_OK
SET_MODE_MAG_OK
SET_FULLSCALE_OK
SET_GAIN_MAG_OK
SET_AXIS_OK
AXIS_X value is -39
AXIS_Y value is 6
AXIS_Z value is -1059

MAG_AXIS_X value is 0
MAG_AXIS_Y value is 0
MAG_AXIS_Z value is 0

AXIS_X value is -39
AXIS_Y value is 5
AXIS_Z value is -1060

MAG_AXIS_X value is 0
MAG_AXIS_Y value is 0
MAG_AXIS_Z value is 0

AXIS_X value is -40
AXIS_Y value is 6
AXIS_Z value is -1058

MAG_AXIS_X value is 0
MAG_AXIS_Y value is 0
MAG_AXIS_Z value is 0

AXIS_X value is -43
AXIS_Y value is 10
AXIS_Z value is -1055


http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-13 11:53:27 | 显示全部楼层
加速度至少读出来了,一样的函数,只是地址不同一个是0x32一个0x3C
读的时候都正确返回了,可是磁场却一直是0
G_response = GetAccAxesRaw(&L_data);
      if(G_response==MEMS_SUCCESS){
                printf("AXIS_X value is %d \r\n",L_data.AXIS_X);
                printf("AXIS_Y value is %d \r\n",L_data.AXIS_Y);  
                printf("AXIS_Z value is %d \r\n\r\n",L_data.AXIS_Z);
          
          
          }
         G_response = GetMagAxesRaw(&L_dataM);
           if(G_response==1){
                        printf("MAG_AXIS_X value is %d \r\n",L_dataM.AXIS_X);
                        printf("MAG_AXIS_Y value is %d \r\n",L_dataM.AXIS_Y);  
                        printf("MAG_AXIS_Z value is %d \r\n\r\n",L_dataM.AXIS_Z);               
          

          
         }
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-13 12:15:47 | 显示全部楼层
这个芯片还有温度传感器的功能,读出的温度是25度
手机里显示的当前温度是26度,也算是正确,只有磁场是0,这个是怎么回事呢?
Start ...
TEMPRATURE  ENABLE OK
SET_ODR_OK
SET_ODR_M_OK
SET_MODE_OK
SET_MODE_MAG_OK
SET_FULLSCALE_OK
SET_GAIN_MAG_OK
SET_AXIS_OK
temperature value is 25

AXIS_X value is -41
AXIS_Y value is 8
AXIS_Z value is -1061

MAG_AXIS_X value is 0
MAG_AXIS_Y value is 0
MAG_AXIS_Z value is 0

temperature value is 25

AXIS_X value is -42
AXIS_Y value is 6
AXIS_Z value is -1059

MAG_AXIS_X value is 0
MAG_AXIS_Y value is 0
MAG_AXIS_Z value is 0

temperature value is 25

点评

用这个贴子里说到的官方例程试试 http://bbs.eeworld.com.cn/thread-546624-1-1.html  详情 回复 发表于 2017-9-13 13:39
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

5028

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-13 13:39:23 | 显示全部楼层
kangkls 发表于 2017-9-13 12:15
这个芯片还有温度传感器的功能,读出的温度是25度
手机里显示的当前温度是26度,也算是正确,只有磁场是0 ...

用这个贴子里说到的官方例程试试
http://bbs.eeworld.com.cn/thread-546624-1-1.html
虾扯蛋


回复

使用道具 举报

5028

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-13 13:39:55 | 显示全部楼层
  1. /******************** (C) COPYRIGHT 2016 STMicroelectronics ********************
  2. * File Name          : LSM303C_MAG_driver.c
  3. * Author             : MEMS Application Team
  4. * Version            : v1.1
  5. * Date               : 22 Nov 2016  
  6. * Description        : LSM303C Platform Independent Driver
  7. *
  8. ********************************************************************************
  9. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  10. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  11. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  12. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  13. * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  14. * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  15. *
  16. * THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS.
  17. *******************************************************************************/

  18. /* Includes ------------------------------------------------------------------*/
  19. #include "LSM303C_MAG_driver.h"
  20. #include "soft_i2c.h"                                                                                        //[Example]

  21. /* Private typedef -----------------------------------------------------------*/

  22. /* Private define ------------------------------------------------------------*/

  23. /* Private macro -------------------------------------------------------------*/

  24. /* Private variables ---------------------------------------------------------*/

  25. /* Private functions ---------------------------------------------------------*/

  26. /************** Generic Function  *******************/

  27. /*******************************************************************************
  28. * Function Name                : LSM303C_MAG_WriteReg
  29. * Description                : Generic Writing function. It must be fullfilled with either
  30. *                                        : I2C or SPI writing function
  31. * Input                                : Register Address, Data to be written
  32. * Output                        : None
  33. * Return                        : None
  34. *******************************************************************************/
  35. u8_t LSM303C_MAG_WriteReg(void *handle, u8_t Reg, u8_t *Bufp, u16_t len)
  36. {
  37.   /*Example*/
  38.   HAL_I2C_Mem_Write(LSM303C_MAG_I2C_ADDRESS, Reg,
  39.                      Bufp, len, 1000);
  40.   return MEMS_SUCCESS;
  41. }

  42. /*******************************************************************************
  43. * Function Name                : LSM303C_MAG_ReadReg
  44. * Description                : Generic Reading function. It must be fullfilled with either
  45. *                                        : I2C or SPI reading functions                                       
  46. * Input                                : Register Address
  47. * Output                        : Data REad
  48. * Return                        : None
  49. *******************************************************************************/
  50. u8_t LSM303C_MAG_ReadReg(void *handle, u8_t Reg, u8_t *Bufp, u16_t len)
  51. {
  52.   /*Example*/
  53.   HAL_I2C_Mem_Read(LSM303C_MAG_I2C_ADDRESS, Reg,
  54.                    Bufp, len, 1000);
  55.   return MEMS_SUCCESS;                                      
  56. }

  57. /**************** Base Function  *******************/

  58. /*******************************************************************************
  59. * Function Name  : LSM303C_MAG_R_WHO_AM_I_
  60. * Description    : Read WHO_AM_I_BIT
  61. * Input          : Pointer to u8_t
  62. * Output         : Status of WHO_AM_I_BIT
  63. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  64. *******************************************************************************/
  65. status_t LSM303C_MAG_R_WHO_AM_I_(void *handle, u8_t *value)
  66. {
  67. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_WHO_AM_I_REG, (u8_t *)value, 1) )
  68.     return MEMS_ERROR;

  69.   *value &= LSM303C_MAG_WHO_AM_I_BIT_MASK; //coerce       
  70.   *value = *value >> LSM303C_MAG_WHO_AM_I_BIT_POSITION; //mask       

  71.   return MEMS_SUCCESS;
  72. }

  73. /*******************************************************************************
  74. * Function Name  : LSM303C_MAG_W_SystemOperatingMode
  75. * Description    : Write MD
  76. * Input          : LSM303C_MAG_MD_t
  77. * Output         : None
  78. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  79. *******************************************************************************/
  80. status_t  LSM303C_MAG_W_SystemOperatingMode(void *handle, LSM303C_MAG_MD_t newValue)
  81. {
  82.   u8_t value;

  83.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG3, &value, 1) )
  84.     return MEMS_ERROR;

  85.   value &= ~LSM303C_MAG_MD_MASK;
  86.   value |= newValue;
  87.   
  88.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG3, &value, 1) )
  89.     return MEMS_ERROR;

  90.   return MEMS_SUCCESS;
  91. }

  92. /*******************************************************************************
  93. * Function Name  : LSM303C_MAG_R_SystemOperatingMode
  94. * Description    : Read MD
  95. * Input          : Pointer to LSM303C_MAG_MD_t
  96. * Output         : Status of MD see LSM303C_MAG_MD_t
  97. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  98. *******************************************************************************/
  99. status_t LSM303C_MAG_R_SystemOperatingMode(void *handle, LSM303C_MAG_MD_t *value)
  100. {
  101. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG3, (u8_t *)value, 1) )
  102.     return MEMS_ERROR;

  103.   *value &= LSM303C_MAG_MD_MASK; //mask

  104.   return MEMS_SUCCESS;
  105. }

  106. /*******************************************************************************
  107. * Function Name  : LSM303C_MAG_W_BlockDataUpdate
  108. * Description    : Write BDU
  109. * Input          : LSM303C_MAG_BDU_t
  110. * Output         : None
  111. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  112. *******************************************************************************/
  113. status_t  LSM303C_MAG_W_BlockDataUpdate(void *handle, LSM303C_MAG_BDU_t newValue)
  114. {
  115.   u8_t value;

  116.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG5, &value, 1) )
  117.     return MEMS_ERROR;

  118.   value &= ~LSM303C_MAG_BDU_MASK;
  119.   value |= newValue;
  120.   
  121.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG5, &value, 1) )
  122.     return MEMS_ERROR;

  123.   return MEMS_SUCCESS;
  124. }

  125. /*******************************************************************************
  126. * Function Name  : LSM303C_MAG_R_BlockDataUpdate
  127. * Description    : Read BDU
  128. * Input          : Pointer to LSM303C_MAG_BDU_t
  129. * Output         : Status of BDU see LSM303C_MAG_BDU_t
  130. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  131. *******************************************************************************/
  132. status_t LSM303C_MAG_R_BlockDataUpdate(void *handle, LSM303C_MAG_BDU_t *value)
  133. {
  134. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG5, (u8_t *)value, 1) )
  135.     return MEMS_ERROR;

  136.   *value &= LSM303C_MAG_BDU_MASK; //mask

  137.   return MEMS_SUCCESS;
  138. }

  139. /*******************************************************************************
  140. * Function Name  : LSM303C_MAG_W_FullScale
  141. * Description    : Write FS
  142. * Input          : LSM303C_MAG_FS_t
  143. * Output         : None
  144. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  145. *******************************************************************************/
  146. status_t  LSM303C_MAG_W_FullScale(void *handle, LSM303C_MAG_FS_t newValue)
  147. {
  148.   u8_t value;

  149.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG2, &value, 1) )
  150.     return MEMS_ERROR;

  151.   value &= ~LSM303C_MAG_FS_MASK;
  152.   value |= newValue;
  153.   
  154.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG2, &value, 1) )
  155.     return MEMS_ERROR;

  156.   return MEMS_SUCCESS;
  157. }

  158. /*******************************************************************************
  159. * Function Name  : LSM303C_MAG_R_FullScale
  160. * Description    : Read FS
  161. * Input          : Pointer to LSM303C_MAG_FS_t
  162. * Output         : Status of FS see LSM303C_MAG_FS_t
  163. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  164. *******************************************************************************/
  165. status_t LSM303C_MAG_R_FullScale(void *handle, LSM303C_MAG_FS_t *value)
  166. {
  167. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG2, (u8_t *)value, 1) )
  168.     return MEMS_ERROR;

  169.   *value &= LSM303C_MAG_FS_MASK; //mask

  170.   return MEMS_SUCCESS;
  171. }

  172. /*******************************************************************************
  173. * Function Name  : LSM303C_MAG_W_OutputDataRate
  174. * Description    : Write DO
  175. * Input          : LSM303C_MAG_DO_t
  176. * Output         : None
  177. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  178. *******************************************************************************/
  179. status_t  LSM303C_MAG_W_OutputDataRate(void *handle, LSM303C_MAG_DO_t newValue)
  180. {
  181.   u8_t value;

  182.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG1, &value, 1) )
  183.     return MEMS_ERROR;

  184.   value &= ~LSM303C_MAG_DO_MASK;
  185.   value |= newValue;
  186.   
  187.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG1, &value, 1) )
  188.     return MEMS_ERROR;

  189.   return MEMS_SUCCESS;
  190. }

  191. /*******************************************************************************
  192. * Function Name  : LSM303C_MAG_R_OutputDataRate
  193. * Description    : Read DO
  194. * Input          : Pointer to LSM303C_MAG_DO_t
  195. * Output         : Status of DO see LSM303C_MAG_DO_t
  196. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  197. *******************************************************************************/
  198. status_t LSM303C_MAG_R_OutputDataRate(void *handle, LSM303C_MAG_DO_t *value)
  199. {
  200. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG1, (u8_t *)value, 1) )
  201.     return MEMS_ERROR;

  202.   *value &= LSM303C_MAG_DO_MASK; //mask

  203.   return MEMS_SUCCESS;
  204. }

  205. /*******************************************************************************
  206. * Function Name  : status_t LSM303C_MAG_Get_Magnetic(u8_t *buff)
  207. * Description    : Read Magnetic output register
  208. * Input          : pointer to [u8_t]
  209. * Output         : Magnetic buffer u8_t
  210. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  211. *******************************************************************************/
  212. status_t LSM303C_MAG_Get_Magnetic(void *handle, u8_t *buff)
  213. {
  214.   u8_t i, j, k;
  215.   u8_t numberOfByteForDimension;
  216.   
  217.   numberOfByteForDimension=6/3;

  218.   k=0;
  219.   for (i=0; i<3;i++ )
  220.   {
  221.         for (j=0; j<numberOfByteForDimension;j++ )
  222.         {       
  223.                 if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_OUTX_L+k, &buff[k], 1))
  224.                   return MEMS_ERROR;
  225.                 k++;       
  226.         }
  227.   }

  228.   return MEMS_SUCCESS;
  229. }

  230. /**************** Advanced Function  *******************/

  231. /*******************************************************************************
  232. * Function Name  : LSM303C_MAG_W_SelfTest
  233. * Description    : Write ST
  234. * Input          : LSM303C_MAG_ST_t
  235. * Output         : None
  236. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  237. *******************************************************************************/
  238. status_t  LSM303C_MAG_W_SelfTest(void *handle, LSM303C_MAG_ST_t newValue)
  239. {
  240.   u8_t value;

  241.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG1, &value, 1) )
  242.     return MEMS_ERROR;

  243.   value &= ~LSM303C_MAG_ST_MASK;
  244.   value |= newValue;
  245.   
  246.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG1, &value, 1) )
  247.     return MEMS_ERROR;

  248.   return MEMS_SUCCESS;
  249. }

  250. /*******************************************************************************
  251. * Function Name  : LSM303C_MAG_R_SelfTest
  252. * Description    : Read ST
  253. * Input          : Pointer to LSM303C_MAG_ST_t
  254. * Output         : Status of ST see LSM303C_MAG_ST_t
  255. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  256. *******************************************************************************/
  257. status_t LSM303C_MAG_R_SelfTest(void *handle, LSM303C_MAG_ST_t *value)
  258. {
  259. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG1, (u8_t *)value, 1) )
  260.     return MEMS_ERROR;

  261.   *value &= LSM303C_MAG_ST_MASK; //mask

  262.   return MEMS_SUCCESS;
  263. }

  264. /*******************************************************************************
  265. * Function Name  : LSM303C_MAG_W_OperatingModeXY
  266. * Description    : Write OM
  267. * Input          : LSM303C_MAG_OM_t
  268. * Output         : None
  269. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  270. *******************************************************************************/
  271. status_t  LSM303C_MAG_W_OperatingModeXY(void *handle, LSM303C_MAG_OM_t newValue)
  272. {
  273.   u8_t value;

  274.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG1, &value, 1) )
  275.     return MEMS_ERROR;

  276.   value &= ~LSM303C_MAG_OM_MASK;
  277.   value |= newValue;
  278.   
  279.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG1, &value, 1) )
  280.     return MEMS_ERROR;

  281.   return MEMS_SUCCESS;
  282. }

  283. /*******************************************************************************
  284. * Function Name  : LSM303C_MAG_R_OperatingModeXY
  285. * Description    : Read OM
  286. * Input          : Pointer to LSM303C_MAG_OM_t
  287. * Output         : Status of OM see LSM303C_MAG_OM_t
  288. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  289. *******************************************************************************/
  290. status_t LSM303C_MAG_R_OperatingModeXY(void *handle, LSM303C_MAG_OM_t *value)
  291. {
  292. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG1, (u8_t *)value, 1) )
  293.     return MEMS_ERROR;

  294.   *value &= LSM303C_MAG_OM_MASK; //mask

  295.   return MEMS_SUCCESS;
  296. }

  297. /*******************************************************************************
  298. * Function Name  : LSM303C_MAG_W_TemperatureSensor
  299. * Description    : Write TEMP_EN
  300. * Input          : LSM303C_MAG_TEMP_EN_t
  301. * Output         : None
  302. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  303. *******************************************************************************/
  304. status_t  LSM303C_MAG_W_TemperatureSensor(void *handle, LSM303C_MAG_TEMP_EN_t newValue)
  305. {
  306.   u8_t value;

  307.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG1, &value, 1) )
  308.     return MEMS_ERROR;

  309.   value &= ~LSM303C_MAG_TEMP_EN_MASK;
  310.   value |= newValue;
  311.   
  312.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG1, &value, 1) )
  313.     return MEMS_ERROR;

  314.   return MEMS_SUCCESS;
  315. }

  316. /*******************************************************************************
  317. * Function Name  : LSM303C_MAG_R_TemperatureSensor
  318. * Description    : Read TEMP_EN
  319. * Input          : Pointer to LSM303C_MAG_TEMP_EN_t
  320. * Output         : Status of TEMP_EN see LSM303C_MAG_TEMP_EN_t
  321. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  322. *******************************************************************************/
  323. status_t LSM303C_MAG_R_TemperatureSensor(void *handle, LSM303C_MAG_TEMP_EN_t *value)
  324. {
  325. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG1, (u8_t *)value, 1) )
  326.     return MEMS_ERROR;

  327.   *value &= LSM303C_MAG_TEMP_EN_MASK; //mask

  328.   return MEMS_SUCCESS;
  329. }

  330. /*******************************************************************************
  331. * Function Name  : LSM303C_MAG_W_SoftRST
  332. * Description    : Write SOFT_RST
  333. * Input          : LSM303C_MAG_SOFT_RST_t
  334. * Output         : None
  335. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  336. *******************************************************************************/
  337. status_t  LSM303C_MAG_W_SoftRST(void *handle, LSM303C_MAG_SOFT_RST_t newValue)
  338. {
  339.   u8_t value;

  340.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG2, &value, 1) )
  341.     return MEMS_ERROR;

  342.   value &= ~LSM303C_MAG_SOFT_RST_MASK;
  343.   value |= newValue;
  344.   
  345.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG2, &value, 1) )
  346.     return MEMS_ERROR;

  347.   return MEMS_SUCCESS;
  348. }

  349. /*******************************************************************************
  350. * Function Name  : LSM303C_MAG_R_SoftRST
  351. * Description    : Read SOFT_RST
  352. * Input          : Pointer to LSM303C_MAG_SOFT_RST_t
  353. * Output         : Status of SOFT_RST see LSM303C_MAG_SOFT_RST_t
  354. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  355. *******************************************************************************/
  356. status_t LSM303C_MAG_R_SoftRST(void *handle, LSM303C_MAG_SOFT_RST_t *value)
  357. {
  358. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG2, (u8_t *)value, 1) )
  359.     return MEMS_ERROR;

  360.   *value &= LSM303C_MAG_SOFT_RST_MASK; //mask

  361.   return MEMS_SUCCESS;
  362. }

  363. /*******************************************************************************
  364. * Function Name  : LSM303C_MAG_W_Reboot
  365. * Description    : Write REBOOT
  366. * Input          : LSM303C_MAG_REBOOT_t
  367. * Output         : None
  368. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  369. *******************************************************************************/
  370. status_t  LSM303C_MAG_W_Reboot(void *handle, LSM303C_MAG_REBOOT_t newValue)
  371. {
  372.   u8_t value;

  373.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG2, &value, 1) )
  374.     return MEMS_ERROR;

  375.   value &= ~LSM303C_MAG_REBOOT_MASK;
  376.   value |= newValue;
  377.   
  378.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG2, &value, 1) )
  379.     return MEMS_ERROR;

  380.   return MEMS_SUCCESS;
  381. }

  382. /*******************************************************************************
  383. * Function Name  : LSM303C_MAG_R_Reboot
  384. * Description    : Read REBOOT
  385. * Input          : Pointer to LSM303C_MAG_REBOOT_t
  386. * Output         : Status of REBOOT see LSM303C_MAG_REBOOT_t
  387. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  388. *******************************************************************************/
  389. status_t LSM303C_MAG_R_Reboot(void *handle, LSM303C_MAG_REBOOT_t *value)
  390. {
  391. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG2, (u8_t *)value, 1) )
  392.     return MEMS_ERROR;

  393.   *value &= LSM303C_MAG_REBOOT_MASK; //mask

  394.   return MEMS_SUCCESS;
  395. }


  396. /*******************************************************************************
  397. * Function Name  : LSM303C_MAG_W_SerialInterfaceMode
  398. * Description    : Write SIM
  399. * Input          : LSM303C_MAG_SIM_t
  400. * Output         : None
  401. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  402. *******************************************************************************/
  403. status_t  LSM303C_MAG_W_SerialInterfaceMode(void *handle, LSM303C_MAG_SIM_t newValue)
  404. {
  405.   u8_t value;

  406.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG3, &value, 1) )
  407.     return MEMS_ERROR;

  408.   value &= ~LSM303C_MAG_SIM_MASK;
  409.   value |= newValue;
  410.   
  411.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG3, &value, 1) )
  412.     return MEMS_ERROR;

  413.   return MEMS_SUCCESS;
  414. }

  415. /*******************************************************************************
  416. * Function Name  : LSM303C_MAG_R_SerialInterfaceMode
  417. * Description    : Read SIM
  418. * Input          : Pointer to LSM303C_MAG_SIM_t
  419. * Output         : Status of SIM see LSM303C_MAG_SIM_t
  420. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  421. *******************************************************************************/
  422. status_t LSM303C_MAG_R_SerialInterfaceMode(void *handle, LSM303C_MAG_SIM_t *value)
  423. {
  424. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG3, (u8_t *)value, 1) )
  425.     return MEMS_ERROR;

  426.   *value &= LSM303C_MAG_SIM_MASK; //mask

  427.   return MEMS_SUCCESS;
  428. }

  429. /*******************************************************************************
  430. * Function Name  : LSM303C_MAG_W_FastLowPowerXYZ
  431. * Description    : Write LP
  432. * Input          : LSM303C_MAG_LP_t
  433. * Output         : None
  434. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  435. *******************************************************************************/
  436. status_t  LSM303C_MAG_W_FastLowPowerXYZ(void *handle, LSM303C_MAG_LP_t newValue)
  437. {
  438.   u8_t value;

  439.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG3, &value, 1) )
  440.     return MEMS_ERROR;

  441.   value &= ~LSM303C_MAG_LP_MASK;
  442.   value |= newValue;
  443.   
  444.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG3, &value, 1) )
  445.     return MEMS_ERROR;

  446.   return MEMS_SUCCESS;
  447. }

  448. /*******************************************************************************
  449. * Function Name  : LSM303C_MAG_R_FastLowPowerXYZ
  450. * Description    : Read LP
  451. * Input          : Pointer to LSM303C_MAG_LP_t
  452. * Output         : Status of LP see LSM303C_MAG_LP_t
  453. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  454. *******************************************************************************/
  455. status_t LSM303C_MAG_R_FastLowPowerXYZ(void *handle, LSM303C_MAG_LP_t *value)
  456. {
  457. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG3, (u8_t *)value, 1) )
  458.     return MEMS_ERROR;

  459.   *value &= LSM303C_MAG_LP_MASK; //mask

  460.   return MEMS_SUCCESS;
  461. }

  462. /*******************************************************************************
  463. * Function Name  : LSM303C_MAG_W_LittleBigEndianInversion
  464. * Description    : Write BLE
  465. * Input          : LSM303C_MAG_BLE_t
  466. * Output         : None
  467. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  468. *******************************************************************************/
  469. status_t  LSM303C_MAG_W_LittleBigEndianInversion(void *handle, LSM303C_MAG_BLE_t newValue)
  470. {
  471.   u8_t value;

  472.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG4, &value, 1) )
  473.     return MEMS_ERROR;

  474.   value &= ~LSM303C_MAG_BLE_MASK;
  475.   value |= newValue;
  476.   
  477.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG4, &value, 1) )
  478.     return MEMS_ERROR;

  479.   return MEMS_SUCCESS;
  480. }

  481. /*******************************************************************************
  482. * Function Name  : LSM303C_MAG_R_LittleBigEndianInversion
  483. * Description    : Read BLE
  484. * Input          : Pointer to LSM303C_MAG_BLE_t
  485. * Output         : Status of BLE see LSM303C_MAG_BLE_t
  486. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  487. *******************************************************************************/
  488. status_t LSM303C_MAG_R_LittleBigEndianInversion(void *handle, LSM303C_MAG_BLE_t *value)
  489. {
  490. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG4, (u8_t *)value, 1) )
  491.     return MEMS_ERROR;

  492.   *value &= LSM303C_MAG_BLE_MASK; //mask

  493.   return MEMS_SUCCESS;
  494. }

  495. /*******************************************************************************
  496. * Function Name  : LSM303C_MAG_W_OperatingModeZ
  497. * Description    : Write OMZ
  498. * Input          : LSM303C_MAG_OMZ_t
  499. * Output         : None
  500. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  501. *******************************************************************************/
  502. status_t  LSM303C_MAG_W_OperatingModeZ(void *handle, LSM303C_MAG_OMZ_t newValue)
  503. {
  504.   u8_t value;

  505.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG4, &value, 1) )
  506.     return MEMS_ERROR;

  507.   value &= ~LSM303C_MAG_OMZ_MASK;
  508.   value |= newValue;
  509.   
  510.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_CTRL_REG4, &value, 1) )
  511.     return MEMS_ERROR;

  512.   return MEMS_SUCCESS;
  513. }

  514. /*******************************************************************************
  515. * Function Name  : LSM303C_MAG_R_OperatingModeZ
  516. * Description    : Read OMZ
  517. * Input          : Pointer to LSM303C_MAG_OMZ_t
  518. * Output         : Status of OMZ see LSM303C_MAG_OMZ_t
  519. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  520. *******************************************************************************/
  521. status_t LSM303C_MAG_R_OperatingModeZ(void *handle, LSM303C_MAG_OMZ_t *value)
  522. {
  523. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_CTRL_REG4, (u8_t *)value, 1) )
  524.     return MEMS_ERROR;

  525.   *value &= LSM303C_MAG_OMZ_MASK; //mask

  526.   return MEMS_SUCCESS;
  527. }

  528. /*******************************************************************************
  529. * Function Name  : LSM303C_MAG_R_NewXData
  530. * Description    : Read XDA
  531. * Input          : Pointer to LSM303C_MAG_XDA_t
  532. * Output         : Status of XDA see LSM303C_MAG_XDA_t
  533. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  534. *******************************************************************************/
  535. status_t LSM303C_MAG_R_NewXData(void *handle, LSM303C_MAG_XDA_t *value)
  536. {
  537. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_STATUS_REG, (u8_t *)value, 1) )
  538.     return MEMS_ERROR;

  539.   *value &= LSM303C_MAG_XDA_MASK; //mask

  540.   return MEMS_SUCCESS;
  541. }

  542. /*******************************************************************************
  543. * Function Name  : LSM303C_MAG_R_NewYData
  544. * Description    : Read YDA
  545. * Input          : Pointer to LSM303C_MAG_YDA_t
  546. * Output         : Status of YDA see LSM303C_MAG_YDA_t
  547. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  548. *******************************************************************************/
  549. status_t LSM303C_MAG_R_NewYData(void *handle, LSM303C_MAG_YDA_t *value)
  550. {
  551. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_STATUS_REG, (u8_t *)value, 1) )
  552.     return MEMS_ERROR;

  553.   *value &= LSM303C_MAG_YDA_MASK; //mask

  554.   return MEMS_SUCCESS;
  555. }

  556. /*******************************************************************************
  557. * Function Name  : LSM303C_MAG_R_NewZData
  558. * Description    : Read ZDA
  559. * Input          : Pointer to LSM303C_MAG_ZDA_t
  560. * Output         : Status of ZDA see LSM303C_MAG_ZDA_t
  561. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  562. *******************************************************************************/
  563. status_t LSM303C_MAG_R_NewZData(void *handle, LSM303C_MAG_ZDA_t *value)
  564. {
  565. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_STATUS_REG, (u8_t *)value, 1) )
  566.     return MEMS_ERROR;

  567.   *value &= LSM303C_MAG_ZDA_MASK; //mask

  568.   return MEMS_SUCCESS;
  569. }

  570. /*******************************************************************************
  571. * Function Name  : LSM303C_MAG_R_NewXYZData
  572. * Description    : Read ZYXDA
  573. * Input          : Pointer to LSM303C_MAG_ZYXDA_t
  574. * Output         : Status of ZYXDA see LSM303C_MAG_ZYXDA_t
  575. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  576. *******************************************************************************/
  577. status_t LSM303C_MAG_R_NewXYZData(void *handle, LSM303C_MAG_ZYXDA_t *value)
  578. {
  579. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_STATUS_REG, (u8_t *)value, 1) )
  580.     return MEMS_ERROR;

  581.   *value &= LSM303C_MAG_ZYXDA_MASK; //mask

  582.   return MEMS_SUCCESS;
  583. }

  584. /*******************************************************************************
  585. * Function Name  : LSM303C_MAG_R_DataXOverrun
  586. * Description    : Read XOR
  587. * Input          : Pointer to LSM303C_MAG_XOR_t
  588. * Output         : Status of XOR see LSM303C_MAG_XOR_t
  589. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  590. *******************************************************************************/
  591. status_t LSM303C_MAG_R_DataXOverrun(void *handle, LSM303C_MAG_XOR_t *value)
  592. {
  593. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_STATUS_REG, (u8_t *)value, 1) )
  594.     return MEMS_ERROR;

  595.   *value &= LSM303C_MAG_XOR_MASK; //mask

  596.   return MEMS_SUCCESS;
  597. }

  598. /*******************************************************************************
  599. * Function Name  : LSM303C_MAG_R_DataYOverrun
  600. * Description    : Read YOR
  601. * Input          : Pointer to LSM303C_MAG_YOR_t
  602. * Output         : Status of YOR see LSM303C_MAG_YOR_t
  603. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  604. *******************************************************************************/
  605. status_t LSM303C_MAG_R_DataYOverrun(void *handle, LSM303C_MAG_YOR_t *value)
  606. {
  607. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_STATUS_REG, (u8_t *)value, 1) )
  608.     return MEMS_ERROR;

  609.   *value &= LSM303C_MAG_YOR_MASK; //mask

  610.   return MEMS_SUCCESS;
  611. }

  612. /*******************************************************************************
  613. * Function Name  : LSM303C_MAG_R_DataZOverrun
  614. * Description    : Read ZOR
  615. * Input          : Pointer to LSM303C_MAG_ZOR_t
  616. * Output         : Status of ZOR see LSM303C_MAG_ZOR_t
  617. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  618. *******************************************************************************/
  619. status_t LSM303C_MAG_R_DataZOverrun(void *handle, LSM303C_MAG_ZOR_t *value)
  620. {
  621. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_STATUS_REG, (u8_t *)value, 1) )
  622.     return MEMS_ERROR;

  623.   *value &= LSM303C_MAG_ZOR_MASK; //mask

  624.   return MEMS_SUCCESS;
  625. }

  626. /*******************************************************************************
  627. * Function Name  : LSM303C_MAG_R_DataXYZOverrun
  628. * Description    : Read ZYXOR
  629. * Input          : Pointer to LSM303C_MAG_ZYXOR_t
  630. * Output         : Status of ZYXOR see LSM303C_MAG_ZYXOR_t
  631. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  632. *******************************************************************************/
  633. status_t LSM303C_MAG_R_DataXYZOverrun(void *handle, LSM303C_MAG_ZYXOR_t *value)
  634. {
  635. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_STATUS_REG, (u8_t *)value, 1) )
  636.     return MEMS_ERROR;

  637.   *value &= LSM303C_MAG_ZYXOR_MASK; //mask

  638.   return MEMS_SUCCESS;
  639. }

  640. /*******************************************************************************
  641. * Function Name  : LSM303C_MAG_W_InterruptEnable
  642. * Description    : Write IEN
  643. * Input          : LSM303C_MAG_IEN_t
  644. * Output         : None
  645. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  646. *******************************************************************************/
  647. status_t  LSM303C_MAG_W_InterruptEnable(void *handle, LSM303C_MAG_IEN_t newValue)
  648. {
  649.   u8_t value;

  650.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  651.     return MEMS_ERROR;

  652.   value &= ~LSM303C_MAG_IEN_MASK;
  653.   value |= newValue;
  654.   
  655.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  656.     return MEMS_ERROR;

  657.   return MEMS_SUCCESS;
  658. }

  659. /*******************************************************************************
  660. * Function Name  : LSM303C_MAG_R_InterruptEnable
  661. * Description    : Read IEN
  662. * Input          : Pointer to LSM303C_MAG_IEN_t
  663. * Output         : Status of IEN see LSM303C_MAG_IEN_t
  664. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  665. *******************************************************************************/
  666. status_t LSM303C_MAG_R_InterruptEnable(void *handle, LSM303C_MAG_IEN_t *value)
  667. {
  668. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, (u8_t *)value, 1) )
  669.     return MEMS_ERROR;

  670.   *value &= LSM303C_MAG_IEN_MASK; //mask

  671.   return MEMS_SUCCESS;
  672. }

  673. /*******************************************************************************
  674. * Function Name  : LSM303C_MAG_W_LatchInterruptRq
  675. * Description    : Write LIR
  676. * Input          : LSM303C_MAG_LIR_t
  677. * Output         : None
  678. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  679. *******************************************************************************/
  680. status_t  LSM303C_MAG_W_LatchInterruptRq(void *handle, LSM303C_MAG_LIR_t newValue)
  681. {
  682.   u8_t value;

  683.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  684.     return MEMS_ERROR;

  685.   value &= ~LSM303C_MAG_LIR_MASK;
  686.   value |= newValue;
  687.   
  688.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  689.     return MEMS_ERROR;

  690.   return MEMS_SUCCESS;
  691. }

  692. /*******************************************************************************
  693. * Function Name  : LSM303C_MAG_R_LatchInterruptRq
  694. * Description    : Read LIR
  695. * Input          : Pointer to LSM303C_MAG_LIR_t
  696. * Output         : Status of LIR see LSM303C_MAG_LIR_t
  697. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  698. *******************************************************************************/
  699. status_t LSM303C_MAG_R_LatchInterruptRq(void *handle, LSM303C_MAG_LIR_t *value)
  700. {
  701. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, (u8_t *)value, 1) )
  702.     return MEMS_ERROR;

  703.   *value &= LSM303C_MAG_LIR_MASK; //mask

  704.   return MEMS_SUCCESS;
  705. }

  706. /*******************************************************************************
  707. * Function Name  : LSM303C_MAG_W_InterruptActive
  708. * Description    : Write IEA
  709. * Input          : LSM303C_MAG_IEA_t
  710. * Output         : None
  711. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  712. *******************************************************************************/
  713. status_t  LSM303C_MAG_W_InterruptActive(void *handle, LSM303C_MAG_IEA_t newValue)
  714. {
  715.   u8_t value;

  716.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  717.     return MEMS_ERROR;

  718.   value &= ~LSM303C_MAG_IEA_MASK;
  719.   value |= newValue;
  720.   
  721.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  722.     return MEMS_ERROR;

  723.   return MEMS_SUCCESS;
  724. }

  725. /*******************************************************************************
  726. * Function Name  : LSM303C_MAG_R_InterruptActive
  727. * Description    : Read IEA
  728. * Input          : Pointer to LSM303C_MAG_IEA_t
  729. * Output         : Status of IEA see LSM303C_MAG_IEA_t
  730. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  731. *******************************************************************************/
  732. status_t LSM303C_MAG_R_InterruptActive(void *handle, LSM303C_MAG_IEA_t *value)
  733. {
  734. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, (u8_t *)value, 1) )
  735.     return MEMS_ERROR;

  736.   *value &= LSM303C_MAG_IEA_MASK; //mask

  737.   return MEMS_SUCCESS;
  738. }

  739. /*******************************************************************************
  740. * Function Name  : LSM303C_MAG_W_InterruptOnZ
  741. * Description    : Write ZIEN
  742. * Input          : LSM303C_MAG_ZIEN_t
  743. * Output         : None
  744. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  745. *******************************************************************************/
  746. status_t  LSM303C_MAG_W_InterruptOnZ(void *handle, LSM303C_MAG_ZIEN_t newValue)
  747. {
  748.   u8_t value;

  749.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  750.     return MEMS_ERROR;

  751.   value &= ~LSM303C_MAG_ZIEN_MASK;
  752.   value |= newValue;
  753.   
  754.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  755.     return MEMS_ERROR;

  756.   return MEMS_SUCCESS;
  757. }

  758. /*******************************************************************************
  759. * Function Name  : LSM303C_MAG_R_InterruptOnZ
  760. * Description    : Read ZIEN
  761. * Input          : Pointer to LSM303C_MAG_ZIEN_t
  762. * Output         : Status of ZIEN see LSM303C_MAG_ZIEN_t
  763. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  764. *******************************************************************************/
  765. status_t LSM303C_MAG_R_InterruptOnZ(void *handle, LSM303C_MAG_ZIEN_t *value)
  766. {
  767. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, (u8_t *)value, 1) )
  768.     return MEMS_ERROR;

  769.   *value &= LSM303C_MAG_ZIEN_MASK; //mask

  770.   return MEMS_SUCCESS;
  771. }

  772. /*******************************************************************************
  773. * Function Name  : LSM303C_MAG_W_InterruptOnY
  774. * Description    : Write YIEN
  775. * Input          : LSM303C_MAG_YIEN_t
  776. * Output         : None
  777. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  778. *******************************************************************************/
  779. status_t  LSM303C_MAG_W_InterruptOnY(void *handle, LSM303C_MAG_YIEN_t newValue)
  780. {
  781.   u8_t value;

  782.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  783.     return MEMS_ERROR;

  784.   value &= ~LSM303C_MAG_YIEN_MASK;
  785.   value |= newValue;
  786.   
  787.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  788.     return MEMS_ERROR;

  789.   return MEMS_SUCCESS;
  790. }

  791. /*******************************************************************************
  792. * Function Name  : LSM303C_MAG_R_InterruptOnY
  793. * Description    : Read YIEN
  794. * Input          : Pointer to LSM303C_MAG_YIEN_t
  795. * Output         : Status of YIEN see LSM303C_MAG_YIEN_t
  796. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  797. *******************************************************************************/
  798. status_t LSM303C_MAG_R_InterruptOnY(void *handle, LSM303C_MAG_YIEN_t *value)
  799. {
  800. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, (u8_t *)value, 1) )
  801.     return MEMS_ERROR;

  802.   *value &= LSM303C_MAG_YIEN_MASK; //mask

  803.   return MEMS_SUCCESS;
  804. }

  805. /*******************************************************************************
  806. * Function Name  : LSM303C_MAG_W_InterruptOnX
  807. * Description    : Write XIEN
  808. * Input          : LSM303C_MAG_XIEN_t
  809. * Output         : None
  810. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  811. *******************************************************************************/
  812. status_t  LSM303C_MAG_W_InterruptOnX(void *handle, LSM303C_MAG_XIEN_t newValue)
  813. {
  814.   u8_t value;

  815.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  816.     return MEMS_ERROR;

  817.   value &= ~LSM303C_MAG_XIEN_MASK;
  818.   value |= newValue;
  819.   
  820.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_CFG, &value, 1) )
  821.     return MEMS_ERROR;

  822.   return MEMS_SUCCESS;
  823. }

  824. /*******************************************************************************
  825. * Function Name  : LSM303C_MAG_R_InterruptOnX
  826. * Description    : Read XIEN
  827. * Input          : Pointer to LSM303C_MAG_XIEN_t
  828. * Output         : Status of XIEN see LSM303C_MAG_XIEN_t
  829. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  830. *******************************************************************************/
  831. status_t LSM303C_MAG_R_InterruptOnX(void *handle, LSM303C_MAG_XIEN_t *value)
  832. {
  833. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_CFG, (u8_t *)value, 1) )
  834.     return MEMS_ERROR;

  835.   *value &= LSM303C_MAG_XIEN_MASK; //mask

  836.   return MEMS_SUCCESS;
  837. }

  838. /*******************************************************************************
  839. * Function Name  : LSM303C_MAG_W_InterruptFlag
  840. * Description    : Write INT
  841. * Input          : LSM303C_MAG_INT_t
  842. * Output         : None
  843. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  844. *******************************************************************************/
  845. status_t  LSM303C_MAG_W_InterruptFlag(void *handle, LSM303C_MAG_INT_t newValue)
  846. {
  847.   u8_t value;

  848.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  849.     return MEMS_ERROR;

  850.   value &= ~LSM303C_MAG_INT_MASK;
  851.   value |= newValue;
  852.   
  853.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  854.     return MEMS_ERROR;

  855.   return MEMS_SUCCESS;
  856. }

  857. /*******************************************************************************
  858. * Function Name  : LSM303C_MAG_R_InterruptFlag
  859. * Description    : Read INT
  860. * Input          : Pointer to LSM303C_MAG_INT_t
  861. * Output         : Status of INT see LSM303C_MAG_INT_t
  862. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  863. *******************************************************************************/
  864. status_t LSM303C_MAG_R_InterruptFlag(void *handle, LSM303C_MAG_INT_t *value)
  865. {
  866. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, (u8_t *)value, 1) )
  867.     return MEMS_ERROR;

  868.   *value &= LSM303C_MAG_INT_MASK; //mask

  869.   return MEMS_SUCCESS;
  870. }

  871. /*******************************************************************************
  872. * Function Name  : LSM303C_MAG_W_MagneticFieldOverflow
  873. * Description    : Write MROI
  874. * Input          : LSM303C_MAG_MROI_t
  875. * Output         : None
  876. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  877. *******************************************************************************/
  878. status_t  LSM303C_MAG_W_MagneticFieldOverflow(void *handle, LSM303C_MAG_MROI_t newValue)
  879. {
  880.   u8_t value;

  881.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  882.     return MEMS_ERROR;

  883.   value &= ~LSM303C_MAG_MROI_MASK;
  884.   value |= newValue;
  885.   
  886.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  887.     return MEMS_ERROR;

  888.   return MEMS_SUCCESS;
  889. }

  890. /*******************************************************************************
  891. * Function Name  : LSM303C_MAG_R_MagneticFieldOverflow
  892. * Description    : Read MROI
  893. * Input          : Pointer to LSM303C_MAG_MROI_t
  894. * Output         : Status of MROI see LSM303C_MAG_MROI_t
  895. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  896. *******************************************************************************/
  897. status_t LSM303C_MAG_R_MagneticFieldOverflow(void *handle, LSM303C_MAG_MROI_t *value)
  898. {
  899. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, (u8_t *)value, 1) )
  900.     return MEMS_ERROR;

  901.   *value &= LSM303C_MAG_MROI_MASK; //mask

  902.   return MEMS_SUCCESS;
  903. }

  904. /*******************************************************************************
  905. * Function Name  : LSM303C_MAG_W_NegativeThresholdFlagZ
  906. * Description    : Write NTH_Z
  907. * Input          : LSM303C_MAG_NTH_Z_t
  908. * Output         : None
  909. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  910. *******************************************************************************/
  911. status_t  LSM303C_MAG_W_NegativeThresholdFlagZ(void *handle, LSM303C_MAG_NTH_Z_t newValue)
  912. {
  913.   u8_t value;

  914.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  915.     return MEMS_ERROR;

  916.   value &= ~LSM303C_MAG_NTH_Z_MASK;
  917.   value |= newValue;
  918.   
  919.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  920.     return MEMS_ERROR;

  921.   return MEMS_SUCCESS;
  922. }

  923. /*******************************************************************************
  924. * Function Name  : LSM303C_MAG_R_NegativeThresholdFlagZ
  925. * Description    : Read NTH_Z
  926. * Input          : Pointer to LSM303C_MAG_NTH_Z_t
  927. * Output         : Status of NTH_Z see LSM303C_MAG_NTH_Z_t
  928. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  929. *******************************************************************************/
  930. status_t LSM303C_MAG_R_NegativeThresholdFlagZ(void *handle, LSM303C_MAG_NTH_Z_t *value)
  931. {
  932. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, (u8_t *)value, 1) )
  933.     return MEMS_ERROR;

  934.   *value &= LSM303C_MAG_NTH_Z_MASK; //mask

  935.   return MEMS_SUCCESS;
  936. }

  937. /*******************************************************************************
  938. * Function Name  : LSM303C_MAG_W_NegativeThresholdFlagY
  939. * Description    : Write NTH_Y
  940. * Input          : LSM303C_MAG_NTH_Y_t
  941. * Output         : None
  942. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  943. *******************************************************************************/
  944. status_t  LSM303C_MAG_W_NegativeThresholdFlagY(void *handle, LSM303C_MAG_NTH_Y_t newValue)
  945. {
  946.   u8_t value;

  947.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  948.     return MEMS_ERROR;

  949.   value &= ~LSM303C_MAG_NTH_Y_MASK;
  950.   value |= newValue;
  951.   
  952.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  953.     return MEMS_ERROR;

  954.   return MEMS_SUCCESS;
  955. }

  956. /*******************************************************************************
  957. * Function Name  : LSM303C_MAG_R_NegativeThresholdFlagY
  958. * Description    : Read NTH_Y
  959. * Input          : Pointer to LSM303C_MAG_NTH_Y_t
  960. * Output         : Status of NTH_Y see LSM303C_MAG_NTH_Y_t
  961. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  962. *******************************************************************************/
  963. status_t LSM303C_MAG_R_NegativeThresholdFlagY(void *handle, LSM303C_MAG_NTH_Y_t *value)
  964. {
  965. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, (u8_t *)value, 1) )
  966.     return MEMS_ERROR;

  967.   *value &= LSM303C_MAG_NTH_Y_MASK; //mask

  968.   return MEMS_SUCCESS;
  969. }

  970. /*******************************************************************************
  971. * Function Name  : LSM303C_MAG_W_NegativeThresholdFlagX
  972. * Description    : Write NTH_X
  973. * Input          : LSM303C_MAG_NTH_X_t
  974. * Output         : None
  975. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  976. *******************************************************************************/
  977. status_t  LSM303C_MAG_W_NegativeThresholdFlagX(void *handle, LSM303C_MAG_NTH_X_t newValue)
  978. {
  979.   u8_t value;

  980.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  981.     return MEMS_ERROR;

  982.   value &= ~LSM303C_MAG_NTH_X_MASK;
  983.   value |= newValue;
  984.   
  985.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  986.     return MEMS_ERROR;

  987.   return MEMS_SUCCESS;
  988. }

  989. /*******************************************************************************
  990. * Function Name  : LSM303C_MAG_R_NegativeThresholdFlagX
  991. * Description    : Read NTH_X
  992. * Input          : Pointer to LSM303C_MAG_NTH_X_t
  993. * Output         : Status of NTH_X see LSM303C_MAG_NTH_X_t
  994. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  995. *******************************************************************************/
  996. status_t LSM303C_MAG_R_NegativeThresholdFlagX(void *handle, LSM303C_MAG_NTH_X_t *value)
  997. {
  998. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, (u8_t *)value, 1) )
  999.     return MEMS_ERROR;

  1000.   *value &= LSM303C_MAG_NTH_X_MASK; //mask

  1001.   return MEMS_SUCCESS;
  1002. }

  1003. /*******************************************************************************
  1004. * Function Name  : LSM303C_MAG_W_PositiveThresholdFlagZ
  1005. * Description    : Write PTH_Z
  1006. * Input          : LSM303C_MAG_PTH_Z_t
  1007. * Output         : None
  1008. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1009. *******************************************************************************/
  1010. status_t  LSM303C_MAG_W_PositiveThresholdFlagZ(void *handle, LSM303C_MAG_PTH_Z_t newValue)
  1011. {
  1012.   u8_t value;

  1013.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  1014.     return MEMS_ERROR;

  1015.   value &= ~LSM303C_MAG_PTH_Z_MASK;
  1016.   value |= newValue;
  1017.   
  1018.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  1019.     return MEMS_ERROR;

  1020.   return MEMS_SUCCESS;
  1021. }

  1022. /*******************************************************************************
  1023. * Function Name  : LSM303C_MAG_R_PositiveThresholdFlagZ
  1024. * Description    : Read PTH_Z
  1025. * Input          : Pointer to LSM303C_MAG_PTH_Z_t
  1026. * Output         : Status of PTH_Z see LSM303C_MAG_PTH_Z_t
  1027. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1028. *******************************************************************************/
  1029. status_t LSM303C_MAG_R_PositiveThresholdFlagZ(void *handle, LSM303C_MAG_PTH_Z_t *value)
  1030. {
  1031. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, (u8_t *)value, 1) )
  1032.     return MEMS_ERROR;

  1033.   *value &= LSM303C_MAG_PTH_Z_MASK; //mask

  1034.   return MEMS_SUCCESS;
  1035. }

  1036. /*******************************************************************************
  1037. * Function Name  : LSM303C_MAG_W_PositiveThresholdFlagY
  1038. * Description    : Write PTH_Y
  1039. * Input          : LSM303C_MAG_PTH_Y_t
  1040. * Output         : None
  1041. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1042. *******************************************************************************/
  1043. status_t  LSM303C_MAG_W_PositiveThresholdFlagY(void *handle, LSM303C_MAG_PTH_Y_t newValue)
  1044. {
  1045.   u8_t value;

  1046.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  1047.     return MEMS_ERROR;

  1048.   value &= ~LSM303C_MAG_PTH_Y_MASK;
  1049.   value |= newValue;
  1050.   
  1051.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  1052.     return MEMS_ERROR;

  1053.   return MEMS_SUCCESS;
  1054. }

  1055. /*******************************************************************************
  1056. * Function Name  : LSM303C_MAG_R_PositiveThresholdFlagY
  1057. * Description    : Read PTH_Y
  1058. * Input          : Pointer to LSM303C_MAG_PTH_Y_t
  1059. * Output         : Status of PTH_Y see LSM303C_MAG_PTH_Y_t
  1060. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1061. *******************************************************************************/
  1062. status_t LSM303C_MAG_R_PositiveThresholdFlagY(void *handle, LSM303C_MAG_PTH_Y_t *value)
  1063. {
  1064. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, (u8_t *)value, 1) )
  1065.     return MEMS_ERROR;

  1066.   *value &= LSM303C_MAG_PTH_Y_MASK; //mask

  1067.   return MEMS_SUCCESS;
  1068. }

  1069. /*******************************************************************************
  1070. * Function Name  : LSM303C_MAG_W_PositiveThresholdFlagX
  1071. * Description    : Write PTH_X
  1072. * Input          : LSM303C_MAG_PTH_X_t
  1073. * Output         : None
  1074. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1075. *******************************************************************************/
  1076. status_t  LSM303C_MAG_W_PositiveThresholdFlagX(void *handle, LSM303C_MAG_PTH_X_t newValue)
  1077. {
  1078.   u8_t value;

  1079.   if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  1080.     return MEMS_ERROR;

  1081.   value &= ~LSM303C_MAG_PTH_X_MASK;
  1082.   value |= newValue;
  1083.   
  1084.   if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_SRC, &value, 1) )
  1085.     return MEMS_ERROR;

  1086.   return MEMS_SUCCESS;
  1087. }

  1088. /*******************************************************************************
  1089. * Function Name  : LSM303C_MAG_R_PositiveThresholdFlagX
  1090. * Description    : Read PTH_X
  1091. * Input          : Pointer to LSM303C_MAG_PTH_X_t
  1092. * Output         : Status of PTH_X see LSM303C_MAG_PTH_X_t
  1093. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1094. *******************************************************************************/
  1095. status_t LSM303C_MAG_R_PositiveThresholdFlagX(void *handle, LSM303C_MAG_PTH_X_t *value)
  1096. {
  1097. if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_SRC, (u8_t *)value, 1) )
  1098.     return MEMS_ERROR;

  1099.   *value &= LSM303C_MAG_PTH_X_MASK; //mask

  1100.   return MEMS_SUCCESS;
  1101. }

  1102. /*******************************************************************************
  1103. * Function Name  : status_t LSM303C_MAG_Get_Temperature(u8_t *buff)
  1104. * Description    : Read Temperature output register
  1105. * Input          : pointer to [u8_t]
  1106. * Output         : Temperature buffer u8_t
  1107. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1108. *******************************************************************************/
  1109. status_t LSM303C_MAG_Get_Temperature(void *handle, u8_t *buff)
  1110. {
  1111.   u8_t i, j, k;
  1112.   u8_t numberOfByteForDimension;
  1113.   
  1114.   numberOfByteForDimension=2/1;

  1115.   k=0;
  1116.   for (i=0; i<1;i++ )
  1117.   {
  1118.         for (j=0; j<numberOfByteForDimension;j++ )
  1119.         {       
  1120.                 if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_TEMP_OUT_L+k, &buff[k], 1))
  1121.                   return MEMS_ERROR;
  1122.                 k++;       
  1123.         }
  1124.   }

  1125.   return MEMS_SUCCESS;
  1126. }


  1127. /*******************************************************************************
  1128. * Function Name  : status_t LSM303C_MAG_Set_MagneticThreshold(u8_t *buff)
  1129. * Description    : Set MagneticThreshold data row
  1130. * Input          : pointer to [u8_t]
  1131. * Output         : None
  1132. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1133. *******************************************************************************/
  1134. status_t LSM303C_MAG_Set_MagneticThreshold(void *handle, u8_t *buff)
  1135. {
  1136.   u8_t  i;

  1137.   for (i=0; i<2;i++ )
  1138.   {
  1139.         if( !LSM303C_MAG_WriteReg(handle, LSM303C_MAG_INT_THS_L+i,  &buff[i], 1) )
  1140.                 return MEMS_ERROR;
  1141.   }
  1142.   return MEMS_SUCCESS;  
  1143. }

  1144. /*******************************************************************************
  1145. * Function Name  : status_t LSM303C_MAG_Get_MagneticThreshold(u8_t *buff)
  1146. * Description    : Read MagneticThreshold output register
  1147. * Input          : pointer to [u8_t]
  1148. * Output         : MagneticThreshold buffer u8_t
  1149. * Return         : Status [MEMS_ERROR, MEMS_SUCCESS]
  1150. *******************************************************************************/
  1151. status_t LSM303C_MAG_Get_MagneticThreshold(void *handle, u8_t *buff)
  1152. {
  1153.   u8_t i, j, k;
  1154.   u8_t numberOfByteForDimension;
  1155.   
  1156.   numberOfByteForDimension=2/1;

  1157.   k=0;
  1158.   for (i=0; i<1;i++ )
  1159.   {
  1160.         for (j=0; j<numberOfByteForDimension;j++ )
  1161.         {       
  1162.                 if( !LSM303C_MAG_ReadReg(handle, LSM303C_MAG_INT_THS_L+k, &buff[k], 1))
  1163.                   return MEMS_ERROR;
  1164.                 k++;       
  1165.         }
  1166.   }

  1167.   return MEMS_SUCCESS;
  1168. }

  1169. /*******************************************************************************
  1170. * Function Name                : SwapHighLowByte
  1171. * Description                : Swap High/low byte in multiple byte values
  1172. *                     It works with minimum 2 byte for every dimension.
  1173. *                     Example x,y,z with 2 byte for every dimension
  1174. *
  1175. * Input                                : bufferToSwap -> buffer to swap
  1176. *                     numberOfByte -> the buffer length in byte
  1177. *                     dimension -> number of dimension
  1178. *
  1179. * Output                        : bufferToSwap -> buffer swapped
  1180. * Return                        : None
  1181. *******************************************************************************/
  1182. void LSM303C_MAG_SwapHighLowByte(u8_t *bufferToSwap, u8_t numberOfByte, u8_t dimension)
  1183. {
  1184.   u8_t numberOfByteForDimension, i, j;
  1185.   u8_t tempValue[10];
  1186.   
  1187.   numberOfByteForDimension=numberOfByte/dimension;
  1188.    
  1189.   for (i=0; i<dimension;i++ )
  1190.   {
  1191.         for (j=0; j<numberOfByteForDimension;j++ )
  1192.                 tempValue[j]=bufferToSwap[j+i*numberOfByteForDimension];
  1193.         for (j=0; j<numberOfByteForDimension;j++ )
  1194.                 *(bufferToSwap+i*(numberOfByteForDimension)+j)=*(tempValue+(numberOfByteForDimension-1)-j);
  1195.   }
  1196. }
复制代码
虾扯蛋


回复

使用道具 举报

5028

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-13 13:48:15 | 显示全部楼层
  1. int lsm303c_test(void)
  2. {

  3.   char outBuf[64];
  4.   whoAmI = 0;
  5.   LSM303C_MAG_R_WHO_AM_I_(0, &whoAmI);
  6.   
  7.   LSM303C_ACC_ReadReg(0, LSM303C_ACC_WHO_AM_I_REG, &whoAmI, 1);
  8.   
  9.      
  10. //Initialize Magnetometer
  11. //set ODR (turn ON device)
  12. response = LSM303C_MAG_W_OutputDataRate(0, LSM303C_MAG_DO_10Hz);
  13. if(response==MEMS_ERROR) while(1); //manage here comunication error

  14. //set Fullscale
  15. response = LSM303C_MAG_W_FullScale(0, LSM303C_MAG_FS_16Ga);
  16. if(response==MEMS_ERROR) while(1); //manage here comunication error
  17.   
  18.    //set Block Data Update
  19. response = LSM303C_MAG_W_BlockDataUpdate(0, LSM303C_MAG_BDU_ENABLE);
  20. if(response==MEMS_ERROR) while(1); //manage here comunication error
  21.   
  22.      //set XY Axis Operation Mode
  23. response = LSM303C_MAG_W_OperatingModeXY(0, LSM303C_MAG_OM_HIGH);
  24. if(response==MEMS_ERROR) while(1) //manage here comunication error
  25.   
  26.      //set Z Axis Operation Mode
  27. response = LSM303C_MAG_W_OperatingModeZ(0, LSM303C_MAG_OMZ_HIGH);
  28. if(response==MEMS_ERROR) while(1); //manage here comunication error
  29.   
  30.      //set Continuous Mode
  31. response = LSM303C_MAG_W_SystemOperatingMode(0, LSM303C_MAG_MD_CONTINUOUS);
  32. if(response==MEMS_ERROR) while(1); //manage here comunication error  
  33.   
  34. //this flag is used for reading data only when there are new data
  35. u8_t flag_LSM303C_ACC_STATUS_FLAGS;
  36. LSM303C_MAG_ZYXDA_t flag_LSM303C_MAG_XYZDA;  

  37. //Initialize Accelerometer
  38. //set Fullscale
  39. response = LSM303C_ACC_SetFullScale(0, LSM303C_ACC_FS_2g);
  40. if(response==MEMS_ERROR) while(1); //manage here comunication error
  41.   
  42.    //set Block Data Update
  43. response = LSM303C_ACC_BlockDataUpdate(0, LSM303C_ACC_BDU_ENABLE);
  44. if(response==MEMS_ERROR) while(1); //manage here comunication error
  45.   
  46. //Enable Axis
  47. response = LSM303C_ACC_EnableAxis(0, LSM303C_ACC_X_ENABLE|LSM303C_ACC_Y_ENABLE|LSM303C_ACC_Z_ENABLE);
  48. if(response==MEMS_ERROR) while(1); //manage here comunication error
  49.   
  50. //set ODR (turn ON device)
  51. response = LSM303C_ACC_SetODR(0, LSM303C_ACC_ODR_100_Hz);
  52. if(response==MEMS_ERROR) while(1); //manage here comunication error

  53. //main loop
  54.   while(1)
  55.   {
  56.        //get Acceleration Raw data  
  57.        response = LSM303C_ACC_Status_Flags(0, &flag_LSM303C_ACC_STATUS_FLAGS);
  58.        if(response==MEMS_ERROR) while(1); //manage here comunication error
  59.        //read only if new data are available from accelerometer  
  60.        else if (flag_LSM303C_ACC_STATUS_FLAGS&LSM303C_ACC_ZYX_NEW_DATA_AVAILABLE)
  61.        {
  62.           response = LSM303C_ACC_GetAccRaw(0, data.u8bit);
  63.           //convert from LSB to mg
  64.           mgData_X=data.i16bit[0]*SENSITIVITY_ACC;
  65.           mgData_Y=data.i16bit[1]*SENSITIVITY_ACC;
  66.           mgData_Z=data.i16bit[2]*SENSITIVITY_ACC;
  67.           sprintf(outBuf,"acc:\tx=%.2f\ty=%.2f\tz=%.2f\r\n",mgData_X,mgData_Y,mgData_Z);
  68.           uart_tx_string(outBuf);//输出到PC
  69.           uart_tx_string("\r\n");//换行
  70.        }
  71.            //get Magnetic Raw data

  72.        response = LSM303C_MAG_R_NewXYZData(0, (LSM303C_MAG_ZYXDA_t*) &flag_LSM303C_MAG_XYZDA);
  73.        if(response==MEMS_ERROR) while(1); //manage here comunication error
  74.        //read only if new data are available  
  75.        else if ((LSM303C_MAG_ZYXDA_t) flag_LSM303C_MAG_XYZDA & LSM303C_MAG_ZYXDA_AVAILABLE)
  76.        {
  77.           response = LSM303C_MAG_Get_Magnetic(0, data.u8bit);
  78.           //convert from LSB to Gauss
  79.           gaussData_X=data.i16bit[0]*SENSITIVITY_MAG;
  80.           gaussData_Y=data.i16bit[1]*SENSITIVITY_MAG;
  81.           gaussData_Z=data.i16bit[2]*SENSITIVITY_MAG;
  82.           sprintf(outBuf,"mag:\tx=%.2f\ty=%.2f\tz=%.2f\r\n",gaussData_X,gaussData_Y,gaussData_Z);
  83.           uart_tx_string(outBuf);//输出到PC
  84.           uart_tx_string("\r\n");//换行
  85.        }
  86.   }
  87. }
复制代码

点评

非常感谢您的回复,我太想当然的去考虑问题了,两个型号虽然貌似差别不大,但是,寄存器的地址是不一样的。找了半天也没找到LSM303AGR的例程。之前以为测试就是跑跑现成的,看来这次不行了,其他小伙伴注意了,别犯  详情 回复 发表于 2017-9-13 16:16
虾扯蛋


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-13 16:16:03 | 显示全部楼层
littleshrimp 发表于 2017-9-13 13:48
[code]int lsm303c_test(void)
{

  char outBuf[64];
  whoAmI = 0;
  LSM303C_MAG_R ...

非常感谢您的回复,我太想当然的去考虑问题了,两个型号虽然貌似差别不大,但是,寄存器的地址是不一样的。找了半天也没找到LSM303AGR的例程。之前以为测试就是跑跑现成的,看来这次不行了,其他小伙伴注意了,别犯我的错哦!
303AH寄存器地址.bmp
303AGR寄存器地址.bmp

点评

ST的传感同一型号不同尾缀寄存器不同、功能不同这个问题我也遇到过 感觉这种命名很不规范,用起来比较麻烦  详情 回复 发表于 2017-9-13 19:45
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

5028

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-13 19:45:55 | 显示全部楼层
kangkls 发表于 2017-9-13 16:16
非常感谢您的回复,我太想当然的去考虑问题了,两个型号虽然貌似差别不大,但是,寄存器的地址是不一样的 ...

ST的传感同一型号不同尾缀寄存器不同、功能不同这个问题我也遇到过
感觉这种命名很不规范,用起来比较麻烦



lsm303agr.rar (33.24 KB, 下载次数: 2)

点评

文件缺少好几个结构定义,方便发一下吗?这个应该是其他工程里摘出来的吧,可否发一下原链接? ..\lLSM303AGR_ACC_driver_HL.c(63): error: #20: identifier "DrvStatusTypeDef" is undefined  详情 回复 发表于 2017-9-14 10:11
虾扯蛋


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-14 10:11:10 | 显示全部楼层
littleshrimp 发表于 2017-9-13 19:45
ST的传感同一型号不同尾缀寄存器不同、功能不同这个问题我也遇到过
感觉这种命名很不规范,用起来比较麻 ...

文件缺少好几个结构定义,方便发一下吗?这个应该是其他工程里摘出来的吧,可否发一下原链接?
..\lLSM303AGR_ACC_driver_HL.c(63): error:  #20: identifier "DrvStatusTypeDef" is undefined

点评

产品页面 http://www.st.com/content/st_com/en/products/mems-and-sensors/e-compasses/lsm303agr.html找到STM32 OPEN DEVELOPMENT ENVIRONMENT[/backcolor] [attachimg]321246[/attachimg] 进入X-NUCLEO-  详情 回复 发表于 2017-9-14 11:05
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

5028

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-14 11:05:05 | 显示全部楼层
kangkls 发表于 2017-9-14 10:11
文件缺少好几个结构定义,方便发一下吗?这个应该是其他工程里摘出来的吧,可否发一下原链接?
..\lLSM3 ...

产品页面
http://www.st.com/content/st_com ... sses/lsm303agr.html找到STM32 OPEN DEVELOPMENT ENVIRONMENT

QQ图片20170914105650.png


进入X-NUCLEO-IKS01A2 页面
http://www.st.com/content/st_com ... nucleo-iks01a2.html
找到MCUS EMBEDDED SOFTWARE下的X-CUBE-MEMS1
QQ图片20170914105827.png
点Get Software,登陆,下载
解压en.x-cube-mems1.zip
找到Drivers\BSP\Components\lsm303agr
具体的宏定义和配置可以打开工程查看

点评

非常感谢您的如此详细的细心的答复,本想尽快有了结果给您回复,可是,遇到点挫折,我尝试下载,开始总是到下载界面就没有了,注册了不行,又单独申请下载链接,折腾好几次,最终发现申请两次连接,第二次的下载连接  详情 回复 发表于 2017-9-17 10:31
虾扯蛋


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-17 10:31:12 | 显示全部楼层
littleshrimp 发表于 2017-9-14 11:05
产品页面
http://www.st.com/content/st_com/en/products/mems-and-sensors/e-compasses/lsm303agr.html ...

非常感谢您的如此详细的细心的答复,本想尽快有了结果给您回复,可是,遇到点挫折,我尝试下载,开始总是到下载界面就没有了,注册了不行,又单独申请下载链接,折腾好几次,最终发现申请两次连接,第二次的下载连接才能用,总算是下载成功了,可是,我用的是051的discovery板,没找到合适的工程,拿来驱动没法直接用,折腾半天最终还是回答自己修改寄存器地址去了,
现在总算是有了结果,磁场的数据挺稳定
Start ...
TEMPRATURE  ENABLE OK
SET_ODR_OK
SET_ODR_M_OK
SET_MODE_OK
SET_MODE_MAG_OK
SET_FULLSCALE_OK
SET_GAIN_MAG_OK
SET_AXIS_OK
temperature value is 25

AXIS_X value is -43
AXIS_Y value is 2
AXIS_Z value is -1055

MAG_AXIS_X value is 3
MAG_AXIS_Y value is -15
MAG_AXIS_Z value is -7

temperature value is 25

AXIS_X value is -42
AXIS_Y value is 0
AXIS_Z value is -1053

MAG_AXIS_X value is 3
MAG_AXIS_Y value is -15
MAG_AXIS_Z value is -7

temperature value is 25

AXIS_X value is -42
AXIS_Y value is 0
AXIS_Z value is -1053

MAG_AXIS_X value is 3
MAG_AXIS_Y value is -15
MAG_AXIS_Z value is -7

temperature value is 25

AXIS_X value is -40
AXIS_Y value is 0
AXIS_Z value is -1053

MAG_AXIS_X value is 3
MAG_AXIS_Y value is -15
MAG_AXIS_Z value is -7

temperature value is 25

AXIS_X value is -40
AXIS_Y value is 0
AXIS_Z value is -1053

MAG_AXIS_X value is 3
MAG_AXIS_Y value is -15
MAG_AXIS_Z value is -7

temperature value is 25

AXIS_X value is -41
AXIS_Y value is 1
AXIS_Z value is -1056

MAG_AXIS_X value is 3
MAG_AXIS_Y value is -15
MAG_AXIS_Z value is -7
再次感谢您的回复。

点评

ST的例程你可以用来参考 看看他在读取磁场数据时是怎么配置的  详情 回复 发表于 2017-9-17 11:09
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

5028

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-17 11:09:00 来自手机 | 显示全部楼层
kangkls 发表于 2017-9-17 10:31
非常感谢您的如此详细的细心的答复,本想尽快有了结果给您回复,可是,遇到点挫折,我尝试下载,开始总是 ...

ST的例程你可以用来参考 看看他在读取磁场数据时是怎么配置的

点评

非常感谢您的建议,先跑个边,完成任务再回去研究。 现在读LPS22HB,读出来的器件ID是对的,可是,气压和温度不对, LPS22HB DeviceID is 177 湿度 =75882, 温度=0 temperature value is 25 AXIS_X va  详情 回复 发表于 2017-9-17 20:54


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-17 20:54:29 | 显示全部楼层
littleshrimp 发表于 2017-9-17 11:09
ST的例程你可以用来参考 看看他在读取磁场数据时是怎么配置的

非常感谢您的建议,先跑个边,完成任务再回去研究。
现在读LPS22HB,读出来的器件ID是对的,可是,气压和温度不对,
LPS22HB DeviceID  is 177

湿度 =75882, 温度=0
temperature value is 25

AXIS_X value is -39
AXIS_Y value is 4
AXIS_Z value is -1057

MAG_AXIS_X value is -1
MAG_AXIS_Y value is 5
MAG_AXIS_Z value is 6


LPS22HB DeviceID  is 177

湿度 =75882, 温度=0
temperature value is 25

AXIS_X value is -39
AXIS_Y value is 3
AXIS_Z value is -1060

MAG_AXIS_X value is -1
MAG_AXIS_Y value is 5
MAG_AXIS_Z value is 6
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-17 21:31:37 | 显示全部楼层
本帖最后由 kangkls 于 2017-9-18 09:03 编辑

LPS22HB_Set_I2C(0,LPS22HB_ENABLE);
        LPS22HB_Init(0);
        LPS22HB_Get_DeviceID(0, &WhoAmI);
        printf("\r\nDeviceID  is %d \r\n\r\n",WhoAmI);
LPS22HB_Get_Measurement(0, &Measurement_Value);
                printf(" 气压 =%d, 温度=%d\r\n",Measurement_Value.Pout, Measurement_Value.Tout);
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-17 22:02:18 | 显示全部楼层
本帖最后由 kangkls 于 2017-9-18 09:04 编辑

LSM303的温度跟 HTS221的温度相差5度,其他小伙伴的测试结果有吗?对比一下,
Start ...
TEMPRATURE  ENABLE OK
SET_ODR_OK
SET_ODR_M_OK
SET_MODE_OK
SET_MODE_MAG_OK
SET_FULLSCALE_OK
SET_GAIN_MAG_OK
SET_AXIS_OK

DeviceID  is 177

LSM303 temperature value is 25

LSM303 AXIS_X value is -38
LSM303 AXIS_Y value is 8
LSM303 AXIS_Z value is -1063

LSM303 MAG_AXIS_X value is -1
LSM303 MAG_AXIS_Y value is 5
LSM303 MAG_AXIS_Z value is 6


LPS22HB DeviceID  is 177

LPS22HB 气压 =75882, 温度=0
HTS221温度=19
HTS221湿度=20

点评

LPS22HB 你先对比一下官方例程,看看他们是怎么配置的 然后读一下 WHO AM I看看通信是否正常  详情 回复 发表于 2017-9-18 19:30
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

5028

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-18 19:30:56 | 显示全部楼层
kangkls 发表于 2017-9-17 22:02
LSM303的温度跟 HTS221的温度相差5度,其他小伙伴的测试结果有吗?对比一下,
Start ...
TEMPRATURE  ENA ...

LPS22HB 你先对比一下官方例程,看看他们是怎么配置的
然后读一下 WHO AM I看看通信是否正常

点评

LPS22HB 的ID 我读取是正确的,datasheet里的值是0xb1也就是10进制的177 LPS22HB DeviceID is 177 LSM303AGR的ID 我读取也是正确的,datasheet里的值是0x33也就是10进制的51 LSM303AGR DeviceID is 51 现  详情 回复 发表于 2017-9-20 16:11
虾扯蛋


回复

使用道具 举报

229

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-9-20 16:11:00 | 显示全部楼层
littleshrimp 发表于 2017-9-18 19:30
LPS22HB 你先对比一下官方例程,看看他们是怎么配置的
然后读一下 WHO AM I看看通信是否正常

LPS22HB 的ID 我读取是正确的,datasheet里的值是0xb1也就是10进制的177
LPS22HB DeviceID  is 177

LSM303AGR的ID 我读取也是正确的,datasheet里的值是0x33也就是10进制的51
LSM303AGR DeviceID  is 51
现在的问题是我读取LSM33agr的温度不对,STATUS_REG_AUX_A (07h)的值应该是0x44,读取正常,
最终读取温度的时候,TEMP_OUT_H_M的值一直是0,导致输出温度是25度,TEMP_OUT_H_M的地址是0x0D,这些都核对过了。
The LSM303AGR is supplied with an internal temperature sensor. Temperature data can be
enabled by setting the TEMP_EN[1:0] bits to ‘1’ in the TEMP_CFG_REG_A (1Fh) register.
To retrieve the temperature sensor data the BDU bit in CTRL_REG4_A (23h) must be set
to ‘1’.
Both the OUT_TEMP_L_A (0Ch), OUT_TEMP_H_A (0Dh) registers must be read.
Temperature data is stored inside OUT_TEMP_H as two’s complement data in 8-bit format
left-justified.
status_t GetTempRaw(i16_t* val) {
  u8_t valueH;

        valueH=SetTemperature(MEMS_ENABLE);
       
       
       
        if( !ReadReg(ACC_I2C_ADDRESS, TEMP_OUT_L_M, &valueH) )
      return MEMS_ERROR;
       
       
       
        //KLS                lsm303agr
  if( !ReadReg(ACC_I2C_ADDRESS, TEMP_OUT_H_M, &valueH) )
      return MEMS_ERROR;
  if(valueH & 0x80){
        valueH &= 0x7F;
        valueH = 0x7F - valueH;
    *val = 25 - (i16_t)(valueH);
  } else {
          *val = 25 + (i16_t)(valueH);
  }
  return MEMS_SUCCESS;  
}

点评

这有一个汇总贴你看下 http://bbs.eeworld.com.cn/thread-528139-1-1.html  详情 回复 发表于 2017-9-21 13:06
http://www.jslaser.com高性价比激光测距传感器


回复

使用道具 举报

5028

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-9-21 13:06:35 | 显示全部楼层
kangkls 发表于 2017-9-20 16:11
LPS22HB 的ID 我读取是正确的,datasheet里的值是0xb1也就是10进制的177
LPS22HB DeviceID  is 177

...

这有一个汇总贴你看下
http://bbs.eeworld.com.cn/thread-528139-1-1.html
虾扯蛋


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-6-25 17:51 , Processed in 0.531705 second(s), 19 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表