drv_mma8562.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-07-22 Magicoe The first version for LPC55S6x
  9. */
  10. #include <rthw.h>
  11. #include <rtdevice.h>
  12. #include <rtthread.h>
  13. #include "rtconfig.h"
  14. #include "drv_mma8562.h"
  15. enum _mma8562_i2c_constants
  16. {
  17. kMMA8562_ADDR = 0x1D,
  18. kMMA8562_ADDR_With_SAO_Set = kMMA8562_ADDR | 1
  19. };
  20. #define MMA8562_I2CBUS_NAME "i2c4"
  21. static struct rt_i2c_bus_device *mma8562_i2c_bus;
  22. ////////////////////////////////////////////////////////////////////////////////
  23. // Code
  24. ////////////////////////////////////////////////////////////////////////////////
  25. rt_err_t mma8562_read_reg(rt_uint8_t reg, rt_uint8_t len, rt_uint8_t *buf)
  26. {
  27. struct rt_i2c_msg msgs[2];
  28. msgs[0].addr = kMMA8562_ADDR;
  29. msgs[0].flags = RT_I2C_WR;
  30. msgs[0].buf = &reg;
  31. msgs[0].len = 1;
  32. msgs[1].addr = kMMA8562_ADDR;
  33. msgs[1].flags = RT_I2C_RD;
  34. msgs[1].buf = buf;
  35. msgs[1].len = len;
  36. if (rt_i2c_transfer(mma8562_i2c_bus, msgs, 2) == 2)
  37. {
  38. return RT_EOK;
  39. }
  40. else
  41. {
  42. return -RT_ERROR;
  43. }
  44. }
  45. rt_err_t mma8562_write_reg(rt_uint8_t reg, rt_uint8_t data)
  46. {
  47. rt_uint8_t buf[2];
  48. buf[0] = reg;
  49. buf[1] = data;
  50. if (rt_i2c_master_send(mma8562_i2c_bus, kMMA8562_ADDR, 0, buf ,2) == 2)
  51. {
  52. return RT_EOK;
  53. }
  54. else
  55. {
  56. return -RT_ERROR;
  57. }
  58. }
  59. #ifdef RT_USING_FINSH
  60. #include <finsh.h>
  61. #include <rtdevice.h>
  62. void get_mma8562(uint8_t data)
  63. {
  64. volatile acceleration_t accel;
  65. uint8_t ucVal1 = 0;
  66. uint8_t ucVal2 = 0;
  67. uint8_t ucStatus = 0;
  68. do {
  69. mma8562_read_reg(kMMA8562_STATUS, 1, &ucStatus);
  70. } while (!(ucStatus & 0x08));
  71. mma8562_read_reg(kMMA8562_OUT_X_MSB, 1, &ucVal1);
  72. mma8562_read_reg(kMMA8562_OUT_X_LSB, 1, &ucVal2);
  73. accel.x = ucVal1*256 +ucVal2;
  74. mma8562_read_reg(kMMA8562_OUT_Y_MSB, 1, &ucVal1);
  75. mma8562_read_reg(kMMA8562_OUT_Y_LSB, 1, &ucVal2);
  76. accel.y = ucVal1*256 +ucVal2;
  77. mma8562_read_reg(kMMA8562_OUT_Z_MSB, 1, &ucVal1);
  78. mma8562_read_reg(kMMA8562_OUT_Z_LSB, 1, &ucVal2);
  79. accel.z = ucVal1*256 +ucVal2;
  80. rt_kprintf("*** MMA8562 X %d, Y %d, Z %d\r\n", (accel.x), (accel.y), (accel.z) );
  81. }
  82. MSH_CMD_EXPORT(get_mma8562, get mma8562. e.g: get_mma8562(0))
  83. #endif
  84. int mma8562_hw_init(void)
  85. {
  86. // Init the I2C port.
  87. // Should be init in startup
  88. uint8_t val = 0;
  89. mma8562_i2c_bus = rt_i2c_bus_device_find(MMA8562_I2CBUS_NAME); /* */
  90. // Read WHO_AM_I register.
  91. mma8562_read_reg(kMMA8562_WHO_AM_I, 1, &val);
  92. if (val != kMMA8562_WHO_AM_I_Device_ID)
  93. {
  94. rt_kprintf("MMA8562: Unexpected result from WHO_AM_I (0x%02x)\n", val);
  95. return -RT_ERROR;
  96. }
  97. /* please refer to the "example FXOS8700CQ Driver Code" in FXOS8700 datasheet. */
  98. /* write 0000 0000 = 0x00 to accelerometer control register 1 */
  99. /* standby */
  100. /* [7-1] = 0000 000 */
  101. /* [0]: active=0 */
  102. val = 0;
  103. mma8562_write_reg( kMMA8562_CTRL_REG1, val);
  104. /* write 0000 0001= 0x01 to XYZ_DATA_CFG register */
  105. /* [7]: reserved */
  106. /* [6]: reserved */
  107. /* [5]: reserved */
  108. /* [4]: hpf_out=0 */
  109. /* [3]: reserved */
  110. /* [2]: reserved */
  111. /* [1-0]: fs=01 for accelerometer range of +/-4g range with 0.488mg/LSB */
  112. /* databyte = 0x01; */
  113. val = 0x01;
  114. mma8562_write_reg(kMMA8562_XYZ_DATA_CFG, val);
  115. /* write 0000 1101 = 0x0D to accelerometer control register 1 */
  116. /* [7-6]: aslp_rate=00 */
  117. /* [5-3]: dr=001 for 200Hz data rate (when in hybrid mode) */
  118. /* [2]: lnoise=1 for low noise mode */
  119. /* [1]: f_read=0 for normal 16 bit reads */
  120. /* [0]: active=1 to take the part out of standby and enable sampling */
  121. /* databyte = 0x0D; */
  122. val = 0x0D;
  123. mma8562_write_reg(kMMA8562_CTRL_REG1, val);
  124. return 0;
  125. }
  126. INIT_DEVICE_EXPORT(mma8562_hw_init);
  127. ////////////////////////////////////////////////////////////////////////////////
  128. // EOF
  129. ////////////////////////////////////////////////////////////////////////////////