bma253.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "bma253_defs.h"
  2. typedef struct _bma253_frame_
  3. {
  4. int16_t acc_x;
  5. int16_t acc_y;
  6. int16_t acc_z;
  7. } bma253_frame_t;
  8. uint8_t bma253_read_regs( uint8_t reg, uint8_t len, uint8_t *buf)
  9. {
  10. if(HAL_I2C_Mem_Read(&hi2c2, (uint16_t)BMA253_DEFAULT_ADDR<<1, reg,
  11. I2C_MEMADD_SIZE_8BIT, buf, len, BMA253_I2C_TIMEOUT )!= HAL_OK)
  12. {
  13. return -1;
  14. }
  15. return 0;
  16. }
  17. uint8_t bma253_write_regs( uint8_t reg, uint8_t len, uint8_t *buf)
  18. {
  19. if(HAL_I2C_Mem_Write(&hi2c2, (uint16_t)BMA253_DEFAULT_ADDR<<1, reg,
  20. I2C_MEMADD_SIZE_8BIT, buf, len, BMA253_I2C_TIMEOUT )!= HAL_OK)
  21. {
  22. return -1;
  23. }
  24. return 0;
  25. }
  26. uint32_t bma253_driver_read( void *buffer,uint32_t size)
  27. {
  28. uint8_t frame_len = sizeof(bma253_frame_t);
  29. uint8_t buf[6];
  30. uint16_t acc_x, acc_y, acc_z;
  31. bma253_frame_t frame;
  32. for (uint8_t i = 0; i < size; i++)
  33. {
  34. if (bma253_read_regs( BMA253_REG_FIFO_DATA, 6, buf) != 0){
  35. printf("BMA253 Error \r\n");
  36. return -1;
  37. }
  38. acc_x = (((uint16_t)buf[1] << 8) | (buf[0] & (_BMA253_ACCD12_LSB_MASK << _BMA253_ACCD12_LSB_SHIFT))) >> _BMA253_ACCD12_LSB_SHIFT;
  39. acc_y = (((uint16_t)buf[3] << 8) | (buf[2] & (_BMA253_ACCD12_LSB_MASK << _BMA253_ACCD12_LSB_SHIFT))) >> _BMA253_ACCD12_LSB_SHIFT;
  40. acc_z = (((uint16_t)buf[5] << 8) | (buf[4] & (_BMA253_ACCD12_LSB_MASK << _BMA253_ACCD12_LSB_SHIFT))) >> _BMA253_ACCD12_LSB_SHIFT;
  41. frame.acc_x = (int16_t)(acc_x>2048?(int16_t)acc_x-4096:acc_x);
  42. // printf("frame.acc_x : %d \r\n",frame.acc_x);
  43. frame.acc_y = (int16_t)(acc_y>2048?(int16_t)acc_y-4096:acc_y);
  44. // printf("frame.acc_y : %d \r\n",frame.acc_y);
  45. frame.acc_z = (int16_t)(acc_z>2048?(int16_t)acc_z-4096:acc_z);
  46. // printf("frame.acc_z : %d \r\n",frame.acc_z);
  47. printf(" ======================\r\n");
  48. printf("||X | Y | Z |\r\n");
  49. printf("||%d |%d |%d |\r\n",frame.acc_x,frame.acc_y,frame.acc_z);
  50. printf("=======================\r\n");
  51. memcpy((uint8_t *)buffer+frame_len * i, (uint8_t *)&frame, frame_len);
  52. }
  53. return size * frame_len;
  54. }
  55. int8_t bma253_reset(void)
  56. {
  57. uint8_t reg = BMA253_RESET_BYTE;
  58. if (bma253_write_regs(BMA253_REG_BGW_SOFTRESET, 1, &reg) != 0){
  59. printf("BMA253 Error \r\n");
  60. return -1;
  61. }
  62. HAL_Delay(1000);
  63. return 0;
  64. }
  65. void i2c_check(uint8_t result,uint8_t* res){
  66. switch(result){
  67. case HAL_OK:
  68. printf("HAL_OK : %d Result : %02x\r\n",result,res[0]);
  69. break;
  70. case HAL_ERROR:
  71. printf("HAL_ERROR : %d\r\n",result);
  72. break;
  73. case HAL_BUSY:
  74. printf("HAL_BUSY : %d\r\n",result);
  75. break;
  76. case HAL_TIMEOUT:
  77. printf("HAL_TIMEOUT : %d\r\n",result);
  78. break;
  79. }
  80. }
  81. int bma253_get_chip_id(void){
  82. uint8_t res[1]={0,};
  83. i2c_check(HAL_I2C_Mem_Read(&hi2c2, (uint16_t)BMA253_DEFAULT_ADDR<<1, BMA253_REG_BGW_CHIPID,I2C_MEMADD_SIZE_8BIT, res, I2C_MEMADD_SIZE_8BIT, 1000 ),res);
  84. }