drv_fxas2100.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #define FXAS2100_DEV_NAME ("fxas2100")
  4. #define FXAS2100_I2C_DEV_NAME ("i2c2")
  5. #define FXAS2100_CHIP_ADDR (0x20)
  6. // register addresses FXAS21002C_H_
  7. #define FXAS21002C_H_STATUS 0x00
  8. #define FXAS21002C_H_DR_STATUS 0x07
  9. #define FXAS21002C_H_F_STATUS 0x08
  10. #define FXAS21002C_H_OUT_X_MSB 0x01
  11. #define FXAS21002C_H_OUT_X_LSB 0x02
  12. #define FXAS21002C_H_OUT_Y_MSB 0x03
  13. #define FXAS21002C_H_OUT_Y_LSB 0x04
  14. #define FXAS21002C_H_OUT_Z_MSB 0x05
  15. #define FXAS21002C_H_OUT_Z_LSB 0x06
  16. #define FXAS21002C_H_F_SETUP 0x09
  17. #define FXAS21002C_H_F_EVENT 0x0A
  18. #define FXAS21002C_H_INT_SRC_FLAG 0x0B
  19. #define FXAS21002C_H_WHO_AM_I 0x0C
  20. #define FXAS21002C_H_CTRL_REG0 0x0D
  21. #define FXAS21002C_H_RT_CFG 0x0E
  22. #define FXAS21002C_H_RT_SRC 0x0F
  23. #define FXAS21002C_H_RT_THS 0x10
  24. #define FXAS21002C_H_RT_COUNT 0x11
  25. #define FXAS21002C_H_TEMP 0x12
  26. #define FXAS21002C_H_CTRL_REG1 0x13
  27. #define FXAS21002C_H_CTRL_REG2 0x14
  28. #define FXAS21002C_H_CTRL_REG3 0x15
  29. #define DBG_TAG "drv.fxas2100"
  30. #define DBG_LVL DBG_LOG
  31. #include <rtdbg.h>
  32. typedef struct
  33. {
  34. struct rt_device parent;
  35. struct rt_i2c_bus_device *bus;
  36. uint8_t i2c_addr;
  37. }fxas2100_t;
  38. static uint8_t fxos_read_reg(fxas2100_t *dev, uint8_t reg_addr)
  39. {
  40. uint8_t val;
  41. rt_i2c_master_send(dev->bus, dev->i2c_addr, RT_I2C_WR, &reg_addr, 1);
  42. rt_i2c_master_recv(dev->bus, dev->i2c_addr, RT_I2C_RD, &val, 1);
  43. return val;
  44. }
  45. static void fxos_write_reg(fxas2100_t *dev, uint8_t reg_addr, uint8_t val)
  46. {
  47. uint8_t buf[2];
  48. buf[0] = reg_addr;
  49. buf[1] = val;
  50. rt_i2c_master_send(dev->bus, dev->i2c_addr, RT_I2C_WR, buf, 2);
  51. }
  52. static rt_err_t fxas2100_open(rt_device_t dev, rt_uint16_t oflag)
  53. {
  54. int i;
  55. uint8_t val;
  56. fxas2100_t *fxas2100 = (fxas2100_t *)dev;
  57. for(i=0; i<5; i++)
  58. {
  59. val = fxos_read_reg(fxas2100, 0x0C);
  60. if(val == 0xD7)
  61. {
  62. LOG_D("fxas2100 found, id:0x%X", val);
  63. /* stand by */
  64. val = fxos_read_reg(fxas2100, FXAS21002C_H_CTRL_REG1);
  65. fxos_write_reg(fxas2100, FXAS21002C_H_CTRL_REG1, val & ~(0x03));
  66. // Disable FIFO, route FIFO and rate threshold interrupts to INT2, enable data ready interrupt, route to INT1
  67. // Active HIGH, push-pull output driver on interrupts
  68. fxos_write_reg(fxas2100, FXAS21002C_H_CTRL_REG2, 0x0E);
  69. fxos_write_reg(fxas2100, FXAS21002C_H_CTRL_REG0, 0x80);
  70. // Set up rate threshold detection; at max rate threshold = FSR; rate threshold = THS*FSR/128
  71. fxos_write_reg(fxas2100, FXAS21002C_H_RT_CFG, 0x07); // enable rate threshold detection on all axes
  72. fxos_write_reg(fxas2100, FXAS21002C_H_RT_THS, 0x00 | 0x0D); // unsigned 7-bit THS, set to one-tenth FSR; set clearing debounce counter
  73. fxos_write_reg(fxas2100, FXAS21002C_H_RT_COUNT, 0x04); // set to 4 (can set up to 255)
  74. val = fxos_read_reg(fxas2100, FXAS21002C_H_CTRL_REG1);
  75. fxos_write_reg(fxas2100, FXAS21002C_H_CTRL_REG1, val & ~(0x03)); // Clear bits 0 and 1; standby mode
  76. fxos_write_reg(fxas2100, FXAS21002C_H_CTRL_REG1, val | 0x02); // Set bit 1 to 1, active mode; data acquisition enabled
  77. return RT_EOK;
  78. }
  79. else
  80. {
  81. LOG_D("fxas2100 cannot found, id:0x%X", val);
  82. }
  83. }
  84. return RT_ERROR;
  85. }
  86. static rt_ssize_t fxas2100_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  87. {
  88. fxas2100_t *fxas2100 = (fxas2100_t *)dev;
  89. uint8_t buf[12];
  90. buf[0] = FXAS21002C_H_OUT_X_MSB;
  91. rt_i2c_master_send(fxas2100->bus, fxas2100->i2c_addr, RT_I2C_WR, buf, 1);
  92. rt_i2c_master_recv(fxas2100->bus, fxas2100->i2c_addr, RT_I2C_RD, buf, 6);
  93. int16_t idata[3];
  94. idata[0] = (int16_t)((((int16_t)buf[0] << 8) | buf[1]));
  95. idata[1] = (int16_t)((((int16_t)buf[2] << 8) | buf[3]));
  96. idata[2] = (int16_t)((((int16_t)buf[4] << 8) | buf[5]));
  97. float *out_buf = buffer;
  98. out_buf[0] = (float)idata[0] *(2000.0F/32768.0F);
  99. out_buf[1] = (float)idata[1] *(2000.0F/32768.0F);
  100. out_buf[2] = (float)idata[2] *(2000.0F/32768.0F);
  101. }
  102. int rt_hw_fxas2100_init(void)
  103. {
  104. static fxas2100_t fxas2100;
  105. struct rt_i2c_bus_device *bus;
  106. bus = rt_i2c_bus_device_find(FXAS2100_I2C_DEV_NAME);
  107. if (bus == RT_NULL)
  108. {
  109. return RT_ENOSYS;
  110. }
  111. fxas2100.parent.type = RT_Device_Class_Sensor;
  112. fxas2100.parent.rx_indicate = RT_NULL;
  113. fxas2100.parent.tx_complete = RT_NULL;
  114. fxas2100.parent.init = RT_NULL;
  115. fxas2100.parent.open = fxas2100_open;
  116. fxas2100.parent.close = RT_NULL;
  117. fxas2100.parent.read = fxas2100_read;
  118. fxas2100.parent.write = RT_NULL;
  119. fxas2100.parent.user_data = RT_NULL;
  120. fxas2100.bus = bus;
  121. fxas2100.i2c_addr = FXAS2100_CHIP_ADDR;
  122. rt_device_register(&fxas2100.parent, FXAS2100_DEV_NAME, RT_DEVICE_FLAG_RDWR);
  123. return RT_EOK;
  124. }
  125. INIT_DEVICE_EXPORT(rt_hw_fxas2100_init);