mpu6050.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /**
  2. * Copyright (c) 2009 - 2019, Nordic Semiconductor ASA
  3. *
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without modification,
  7. * are permitted provided that the following conditions are met:
  8. *
  9. * 1. Redistributions of source code must retain the above copyright notice, this
  10. * list of conditions and the following disclaimer.
  11. *
  12. * 2. Redistributions in binary form, except as embedded into a Nordic
  13. * Semiconductor ASA integrated circuit in a product or a software update for
  14. * such product, must reproduce the above copyright notice, this list of
  15. * conditions and the following disclaimer in the documentation and/or other
  16. * materials provided with the distribution.
  17. *
  18. * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
  19. * contributors may be used to endorse or promote products derived from this
  20. * software without specific prior written permission.
  21. *
  22. * 4. This software, with or without modification, must only be used with a
  23. * Nordic Semiconductor ASA integrated circuit.
  24. *
  25. * 5. Any software provided in binary form under this license must not be reverse
  26. * engineered, decompiled, modified and/or disassembled.
  27. *
  28. * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
  29. * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30. * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
  31. * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
  32. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  33. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  34. * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  35. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  36. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  37. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  38. *
  39. */
  40. #include <stdbool.h>
  41. #include <stdint.h>
  42. #include "twi_master.h"
  43. #include "mpu6050.h"
  44. /*lint ++flb "Enter library region" */
  45. #define ADDRESS_WHO_AM_I (0x75U) // !< WHO_AM_I register identifies the device. Expected value is 0x68.
  46. #define ADDRESS_SIGNAL_PATH_RESET (0x68U) // !<
  47. static const uint8_t expected_who_am_i = 0x68U; // !< Expected value to get from WHO_AM_I register.
  48. static uint8_t m_device_address; // !< Device address in bits [7:1]
  49. bool mpu6050_init(uint8_t device_address)
  50. {
  51. bool transfer_succeeded = true;
  52. m_device_address = (uint8_t)(device_address << 1);
  53. // Do a reset on signal paths
  54. uint8_t reset_value = 0x04U | 0x02U | 0x01U; // Resets gyro, accelerometer and temperature sensor signal paths.
  55. transfer_succeeded &= mpu6050_register_write(ADDRESS_SIGNAL_PATH_RESET, reset_value);
  56. // Read and verify product ID
  57. transfer_succeeded &= mpu6050_verify_product_id();
  58. return transfer_succeeded;
  59. }
  60. bool mpu6050_verify_product_id(void)
  61. {
  62. uint8_t who_am_i;
  63. if (mpu6050_register_read(ADDRESS_WHO_AM_I, &who_am_i, 1))
  64. {
  65. if (who_am_i != expected_who_am_i)
  66. {
  67. return false;
  68. }
  69. else
  70. {
  71. return true;
  72. }
  73. }
  74. else
  75. {
  76. return false;
  77. }
  78. }
  79. bool mpu6050_register_write(uint8_t register_address, uint8_t value)
  80. {
  81. uint8_t w2_data[2];
  82. w2_data[0] = register_address;
  83. w2_data[1] = value;
  84. return twi_master_transfer(m_device_address, w2_data, 2, TWI_ISSUE_STOP);
  85. }
  86. bool mpu6050_register_read(uint8_t register_address, uint8_t * destination, uint8_t number_of_bytes)
  87. {
  88. bool transfer_succeeded;
  89. transfer_succeeded = twi_master_transfer(m_device_address, &register_address, 1, TWI_DONT_ISSUE_STOP);
  90. transfer_succeeded &= twi_master_transfer(m_device_address|TWI_READ_BIT, destination, number_of_bytes, TWI_ISSUE_STOP);
  91. return transfer_succeeded;
  92. }
  93. /*lint --flb "Leave library region" */