极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 92806|回复: 47

MPU6050.CPP核心代码注释翻译--01

  [复制链接]
发表于 2013-5-10 15:46:21 | 显示全部楼层 |阅读模式
MPU6050在众多姿态传感器中使用者非常多,因其集成了陀螺仪与加速度传感器两个组件,本身还有DMP融合输出,使用起来也很方便,受到了广大爱好者的青睐。

在众多的Arduino资源中,MPU6050库是其中一个宝贵的财富,把其核心代码部分注释翻译过来更有助于大家学习研究。

先放出这个MPU6050库的库文件。



再放一位同学汉化的60X0寄存器中文版介绍。。。非常好的东东,大家可以结合在一起参考的学习。


其他介绍日后慢慢补充~~

如转载本帖需获得作者许可。


  1. // I2C库-- MPU6050 I2C设备类
  2. // 基于InvenSense 的MPU-6050寄存器映射文件,其版本为2.0、5/19/2011 (RM-MPU-6000A-00)
  3. // 作者Jeff Rowberg写于2011年8月24日 [email protected]
  4. // 可在网站https://github.com/jrowberg/i2cdevlib上获取更新信息
  5. //
  6. // 更新:
  7. //     ... 正在调试的版本

  8. // 注意: 这只是一个不完整的版本。这个设备类目前正在积极地发展,但是仍不完善。如果你决定使用这个代码,请牢记这一点。

  9. /* ============================================
  10. I2C设备库代码已获MIT授权

  11. 特此授予许可,只要遵循以下条例者,皆可免费复制此软件及相关文件,并可自由使用、复制、合并、出版、发布、转授许可或出售:

  12. 所有副本和实质性内容都应包括上述版权和许可声明。

  13. 该软件不提供任何明示或暗示的保证,以软件“现状”出售。该软件包括但不限于适销性的保证,适用于特殊目的和非侵权活动。作者或版权持有者在任何情况下都无需对软件负责,无论是合同的签订、侵权行为或其它与该软件有关的活动和交易。
  14. ===============================================
  15. */

  16. #include "MPU6050.h"

  17. /*
  18. * 默认的函数结构,使用默认的I2C地址。
  19. * 请参考MPU6050_DEFAULT_ADDRESS字段
  20. */
  21. MPU6050::MPU6050() {
  22.     devAddr = MPU6050_DEFAULT_ADDRESS;
  23. }

  24. /*
  25. * 特殊地址的函数结构。
  26. * I2C地址参数
  27. * 请参考MPU6050_DEFAULT_ADDRESS字段
  28. * 请参考MPU6050_ADDRESS_AD0_LOW字段
  29. * 请参考MPU6050_ADDRESS_AD0_HIGH字段
  30. */
  31. MPU6050::MPU6050(uint8_t address) {
  32.     devAddr = address;
  33. }

  34. /*
  35. * 开机并调试。
  36. * 这将激活设备,结束其睡眠模式(必须在完成启动后)。同时,这个函数将加速度传感器和陀螺仪设置为最灵敏模式,即+ / - 2 g和+ / - 250度/秒; 并把X陀螺仪设置为时钟源的参考,这比默认的内部时钟源要准确。
  37. */
  38. void MPU6050::initialize() {
  39.     setClockSource(MPU6050_CLOCK_PLL_XGYRO);
  40.     setFullScaleGyroRange(MPU6050_GYRO_FS_250);
  41.     setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  42.     setSleepEnabled(false); // 多亏了Jack Elston指出了这一点
  43. }

  44. /*
  45. * 验证I2C接口。
  46. * 确保装置正确连接并反应正常。
  47. * 如果连接有效,返回True;否则返回false
  48. */
  49. bool MPU6050::testConnection() {
  50.     return getDeviceID() == 0x34;
  51. }

  52. // AUX_VDDIO寄存器(InvenSense演示代码调用这个RA_*G_OFFS_TC)

  53. /*
  54. * 获取I2C辅助电源电压。
  55. * 当设置为1,辅助I2C总线高电平是VDD。当电压为0,辅助I2C总线高电平是VLOGIC。这并不适用于MPU-6000,因为它没有VLOGIC端口。
  56. * 返回I2C电源电压 (0 = VLOGIC,1 = VDD)
  57. */
  58. uint8_t MPU6050::getAuxVDDIOLevel() {
  59.     I2Cdev::readBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, buffer);
  60.     return buffer[0];
  61. }
  62. /*
  63. * 设置I2C辅助电源电压。
  64. * 当设置为1时,辅助I2C总线高电平是VDD。当设置为0时,辅助I2C总线高电平是VLOGIC。这并不适用于MPU-6000,因为它没有VLOGIC端口。
  65. * param level I2C电源电压(0 = VLOGIC,1 = VDD)
  66. */
  67. void MPU6050::setAuxVDDIOLevel(uint8_t level) {
  68.     I2Cdev::writeBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, level);
  69. }

  70. // SMPLRT_DIV寄存器

  71. /*获取陀螺仪输出频率间隔
  72. *
  73. * 传感器的寄存器输出,FIFO输出,DMP采样、运动检测、零运动检测和自由落体检测都是基于采样率。通过SMPLRT_DIV把陀螺仪输出率分频即可得到采样率
  74. *
  75. * 采样率=陀螺仪输出率/ (1 + SMPLRT_DIV)
  76. *
  77. * 其中,在禁用DLPF的情况下(DLPF_CFG = 0或7) ,陀螺仪输出率= 8 khz;在启用DLPF(见寄存器26)时,陀螺仪输出率= 1 khz。
  78. *
  79. * 注意:加速度传感器输出率是1 khz。这意味着,采样率大于1 khz时,同一个加速度传感器的样品可能会多次输入到FIFO、DMP和传感器寄存器。
  80. *
  81. * 陀螺仪和加速度传感器的信号路径图,请参见第八节的MPU-6000/MPU-6050产品规格文档。
  82. *
  83. * 返回电流采样率
  84. *
  85. * 请参见MPU6050_RA_SMPLRT_DIV字段
  86. */
  87. uint8_t MPU6050::getRate() {
  88.     I2Cdev::readByte(devAddr, MPU6050_RA_SMPLRT_DIV, buffer);
  89.     return buffer[0];
  90. }
  91. /*
  92. * 设定陀螺仪采样频率间隔。
  93. * 新采样频率间隔参数
  94. * 请参见getRate()字段
  95. * 请参见MPU6050_RA_SMPLRT_DIV字段
  96. */
  97. void MPU6050::setRate(uint8_t rate) {
  98.     I2Cdev::writeByte(devAddr, MPU6050_RA_SMPLRT_DIV, rate);
  99. }

  100. // 配置寄存器

  101. /*
  102. * 获取FSYNC函数外接配置
  103. * 配置连接到FSYNC端口进行采样。一个连接到FSYNC端口的外部信号可以通过配置EXT_SYNC_SET来采样。为了捕获短频闪光,我们将FSYNC端口的信号变化关闭。我们在寄存器25中定义,由关闭的FSYNC端口信号变化采样而来的数据为采样率。采样完毕后, 锁存器将重置为当前的FSYNC信号状态。
  104. *
  105. * 根据下表所示的EXT_SYNC_SET值,我们将所得采样值的最低有效位输入传感器数据寄存器中。
  106. *
  107. * <pre>
  108. * EXT_SYNC_SET | FSYNC Bit Location
  109. * -------------+-------------------
  110. * 0            | Input disabled
  111. * 1            | TEMP_OUT_L[0]
  112. * 2            | GYRO_XOUT_L[0]
  113. * 3            | GYRO_YOUT_L[0]
  114. * 4            | GYRO_ZOUT_L[0]
  115. * 5            | ACCEL_XOUT_L[0]
  116. * 6            | ACCEL_YOUT_L[0]
  117. * 7            | ACCEL_ZOUT_L[0]
  118. * </pre>
  119. *
  120. * 返回FSYNC配置值
  121. */
  122. uint8_t MPU6050::getExternalFrameSync() {
  123.     I2Cdev::readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, buffer);
  124.     return buffer[0];
  125. }
  126. /*
  127. * 设定FSYNC函数外接配置
  128. * 请参见getExternalFrameSync()字段
  129. * 请参见MPU6050_RA_CONFIG字段
  130. * 新FSYNC配置的同步参数
  131. */
  132. void MPU6050::setExternalFrameSync(uint8_t sync) {
  133.     I2Cdev::writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, sync);
  134. }
  135. /*
  136. * 获取数字低通滤波器的配置
  137. *
  138. * DLPF_CFG参数设置了数字低通滤波器的配置。同时,通过下表所示的设备,DLPF_CFG参数决定了内部采样率。
  139. *
  140. * 注意:加速度传感器输出率是1 khz。这意味着,采样率大于1 khz时,同一个加速度传感器的样品可能会多次输入到FIFO、DMP和传感器寄存器。
  141. *
  142. * <pre>
  143. *          |   加速度传感器     |             陀螺仪
  144. * DLPF_CFG |    带宽   |  延迟  |    带宽   |  延迟  | 采样率
  145. * ---------+-----------+--------+-----------+--------+-------------
  146. * 0        | 260Hz     | 0ms    | 256Hz     | 0.98ms | 8kHz
  147. * 1        | 184Hz     | 2.0ms  | 188Hz     | 1.9ms  | 1kHz
  148. * 2        | 94Hz      | 3.0ms  | 98Hz      | 2.8ms  | 1kHz
  149. * 3        | 44Hz      | 4.9ms  | 42Hz      | 4.8ms  | 1kHz
  150. * 4        | 21Hz      | 8.5ms  | 20Hz      | 8.3ms  | 1kHz
  151. * 5        | 10Hz      | 13.8ms | 10Hz      | 13.4ms | 1kHz
  152. * 6        | 5Hz       | 19.0ms | 5Hz       | 18.6ms | 1kHz
  153. * 7        |   -- Reserved --   |   -- Reserved --   | Reserved
  154. * </pre>
  155. *
  156. * 请参见MPU6050_RA_CONFIG字段
  157. * 请参见MPU6050_CFG_DLPF_CFG_BIT字段
  158. * 请参见MPU6050_CFG_DLPF_CFG_LENGTH字段
  159. */
  160. uint8_t MPU6050::getDLPFMode() {
  161.     I2Cdev::readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, buffer);
  162.     return buffer[0];
  163. }
  164. /*
  165. * 设定数字低通滤波器的配置.
  166. * @新DLFP配置的模式参数
  167. * @请参见getDLPFBandwidth()字段
  168. * @请参见MPU6050_DLPF_BW_256字段
  169. * @请参见MPU6050_RA_CONFIG字段
  170. * @请参见MPU6050_CFG_DLPF_CFG_BIT字段
  171. * @请参见MPU6050_CFG_DLPF_CFG_LENGTH字段
  172. */
  173. void MPU6050::setDLPFMode(uint8_t mode) {
  174.     I2Cdev::writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, mode);
  175. }

  176. // 陀螺仪配置寄存器

  177. /*
  178. * 获取全量程的陀螺仪范围。
  179. * 如下表所示,FS_SEL参数允许将陀螺仪传感器的范围设置为全量程。
  180. *
  181. * <pre>
  182. * 0 = +/- 250 度/秒
  183. * 1 = +/- 500 度/秒
  184. * 2 = +/- 1000 度/秒
  185. * 3 = +/- 2000 度/秒
  186. * </pre>
  187. *
  188. * @返回当前陀螺仪范围的全量程设置
  189. * @请参见MPU6050_GYRO_FS_250字段
  190. * @请参见MPU6050_RA_GYRO_CONFIG字段
  191. * @请参见MPU6050_GCONFIG_FS_SEL_BIT字段
  192. * @请参见MPU6050_GCONFIG_FS_SEL_LENGTH字段
  193. */
  194. uint8_t MPU6050::getFullScaleGyroRange() {
  195.     I2Cdev::readBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, buffer);
  196.     return buffer[0];
  197. }
  198. /*
  199. * 设定全量程的陀螺仪范围.
  200. * @全量程的陀螺仪范围参数
  201. * @请参见getFullScaleRange()字段
  202. * @请参见MPU6050_GYRO_FS_250字段
  203. * @请参见MPU6050_RA_GYRO_CONFIG字段
  204. * @请参见MPU6050_GCONFIG_FS_SEL_BIT字段
  205. * @请参见MPU6050_GCONFIG_FS_SEL_LENGTH字段
  206. */
  207. void MPU6050::setFullScaleGyroRange(uint8_t range) {
  208.     I2Cdev::writeBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range);
  209. }

  210. // 加速度器配置寄存器

  211. /*
  212. * 开启加速度器X轴的安全自测功能。
  213. * @返回测试值
  214. * @请参见MPU6050_RA_ACCEL_CONFIG字段
  215. */
  216. bool MPU6050::getAccelXSelfTest() {
  217.     I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, buffer);
  218.     return buffer[0];
  219. }
  220. /*
  221. * 开启加速度器X轴的安全自测功能。
  222. * @安全自测启用参数
  223. * @请参见MPU6050_RA_ACCEL_CONFIG字段
  224. */
  225. void MPU6050::setAccelXSelfTest(bool enabled) {
  226.     I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, enabled);
  227. }
  228. /*
  229. * 开启加速度器Y轴的安全自测功能。
  230. * @返回测试值
  231. * @请参见MPU6050_RA_ACCEL_CONFIG字段
  232. */
  233. bool MPU6050::getAccelYSelfTest() {
  234.     I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, buffer);
  235.     return buffer[0];
  236. }
  237. /*
  238. * 开启加速度器Y轴的安全自测功能。
  239. * @安全自测启用参数
  240. * @请参见MPU6050_RA_ACCEL_CONFIG字段
  241. */
  242. void MPU6050::setAccelYSelfTest(bool enabled) {
  243.     I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, enabled);
  244. }
  245. /*
  246. * 开启加速度器Z轴的安全自测功能。
  247. * @返回测试值
  248. * @请参见MPU6050_RA_ACCEL_CONFIG字段
  249. */
  250. bool MPU6050::getAccelZSelfTest() {
  251.     I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, buffer);
  252.     return buffer[0];
  253. }
  254. /*
  255. * 开启加速度器Z轴的安全自测功能。
  256. * @安全自测启用参数
  257. * @请参见MPU6050_RA_ACCEL_CONFIG字段
  258. */
  259. void MPU6050::setAccelZSelfTest(bool enabled) {
  260.     I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, enabled);
  261. }
  262. /*
  263. * 获取全量程的加速度计范围.
  264. * 如下表所示,FS_SEL参数允许将加速度传感器的范围设置为全量程。
  265. *
  266. * <pre>
  267. * 0 = +/- 2g
  268. * 1 = +/- 4g
  269. * 2 = +/- 8g
  270. * 3 = +/- 16g
  271. * </pre>
  272. *
  273. * @返回当前加速度传感器范围的全量程设置
  274. * @请参见MPU6050_ACCEL_FS_2字段
  275. * @请参见MPU6050_RA_ACCEL_CONFIG字段
  276. * @请参见MPU6050_ACONFIG_AFS_SEL_BIT字段
  277. * @请参见MPU6050_ACONFIG_AFS_SEL_LENGTH字段
  278. */
  279. uint8_t MPU6050::getFullScaleAccelRange() {
  280.     I2Cdev::readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, buffer);
  281.     return buffer[0];
  282. }
  283. /*
  284. * 设定全量程的加速度计范围
  285. * @全量程的加速度范围参数
  286. * @请参见getFullScaleAccelRange()字段
  287. */
  288. void MPU6050::setFullScaleAccelRange(uint8_t range) {
  289.     I2Cdev::writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range);
  290. }
  291. /*
  292. * 获取高通滤波器的配置.
  293. * DHPF是在路径中连接于运动探测器(自由落体,运动阈值,零运动)的一个滤波器模块。高通滤波器的输出值不在数据寄存器中(参见第八节的MPU-6000/ MPU-6050产品规格文档图)。
  294. *
  295. * 高通滤波器有三种模式:
  296. *
  297. * <pre>
  298. *    重置:在一个样本中将滤波器输出值设为零。这有效的禁用了高通滤波器。这种模式可以快速切换滤波器的设置模式。
  299. *
  300. *    开启:高通滤波器能通过高于截止频率的信号。
  301. *
  302. *    持续:触发后,过滤器持续当前采样。过滤器输出值是输入样本和持续样本之间的差异。
  303. * </pre>
  304. *
  305. * <pre>
  306. * ACCEL_HPF | 高通滤波模式| 截止频率
  307. * ----------+-------------+------------------
  308. * 0         | Reset       | None
  309. * 1         | On          | 5Hz
  310. * 2         | On          | 2.5Hz
  311. * 3         | On          | 1.25Hz
  312. * 4         | On          | 0.63Hz
  313. * 7         | Hold        | None
  314. * </pre>
  315. *
  316. * @返回当前高通滤波器配置
  317. * @请参见MPU6050_DHPF_RESET字段
  318. * @请参见MPU6050_RA_ACCEL_CONFIG字段
  319. */
  320. uint8_t MPU6050::getDHPFMode() {
  321.     I2Cdev::readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, buffer);
  322.     return buffer[0];
  323. }
  324. /*
  325. * 设定高通滤波器的配置.
  326. * @新高通滤波器配置的带宽参数
  327. * @请参见setDHPFMode()字段
  328. * @请参见MPU6050_DHPF_RESET字段
  329. * @请参见MPU6050_RA_ACCEL_CONFIG字段
  330. */
  331. void MPU6050::setDHPFMode(uint8_t bandwidth) {
  332.     I2Cdev::writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, bandwidth);
  333. }

  334. // FF_THR寄存器

  335. /*
  336. * 获取自由落体的加速度阈值。
  337. * 这个寄存器为自由落体的阈值检测进行配置。FF_THR的单位是1LSB = 2mg。当加速度传感器测量而得的三个轴的绝对值都小于检测阈值时,就可以测得自由落体值。这种情况下,自由落体时间计数器计数一次 (寄存器30)。当自由落体时间计数器达到FF_DUR中规定的时间时,自由落体被中断。
  338. *
  339. * 更多自由落体中断检测的相关信息,详见8.2节的MPU-6000/MPU-6050产品规格文件和该文件下的寄存器56和寄存器58.
  340. *
  341. * @返回当前自由落体加速度阈值(LSB = 2mg)
  342. * @请参见MPU6050_RA_FF_THR字段
  343. */
  344. uint8_t MPU6050::getFreefallDetectionThreshold() {
  345.     I2Cdev::readByte(devAddr, MPU6050_RA_FF_THR, buffer);
  346.     return buffer[0];
  347. }
  348. /*
  349. * 获取自由落体加速度阈值
  350. * @新自由落体加速度阈值参数(LSB = 2mg)
  351. * @请参见getFreefallDetectionThreshold()字段
  352. * @请参见MPU6050_RA_FF_THR字段
  353. */
  354. void MPU6050::setFreefallDetectionThreshold(uint8_t threshold) {
  355.     I2Cdev::writeByte(devAddr, MPU6050_RA_FF_THR, threshold);
  356. }

  357. // FF_DUR寄存器

  358. /*
  359. * 获取自由落体时间阈值
  360. * 这个寄存器为自由落体时间阈值计数器进行配置。时间计数频率为1 khz,因此FF_DUR的单位是 1 LSB = 1毫秒。
  361. *
  362. * 当加速度器测量而得的绝对值都小于检测阈值时,自由落体时间计数器计数一次。当自由落体时间计数器达到该寄存器的规定时间时,自由落体被中断。
  363. *
  364. * 更多自由落体中断检测的相关信息,详见8.2节的MPU-6000/MPU-6050产品规格文件和该文件下的寄存器56和寄存器58文件.
  365. *
  366. * 返回当前自由落体加速度阈值(LSB = 1ms)
  367. * 请参见MPU6050_RA_FF_DUR字段
  368. */
  369. uint8_t MPU6050::getFreefallDetectionDuration() {
  370.     I2Cdev::readByte(devAddr, MPU6050_RA_FF_DUR, buffer);
  371.     return buffer[0];
  372. }
  373. /*
  374. * 获取自由落体时间阈值
  375. * 自由落体时间阈值参数(LSB = 1ms)
  376. * 请参见getFreefallDetectionDuration()字段
  377. * 请参见MPU6050_RA_FF_DUR字段
  378. */
  379. void MPU6050::setFreefallDetectionDuration(uint8_t duration) {
  380.     I2Cdev::writeByte(devAddr, MPU6050_RA_FF_DUR, duration);
  381. }

  382. // MOT_THR寄存器

  383. /** 获取运动检测的加速度阈值。
  384. * 这个寄存器为运动中断的阈值检测进行配置。MOT_THR的单位是 1LSB = 2mg。当加速度器测量而得的绝对值都超过该运动检测的阈值时,即可测得该运动。这一情况下,运动时间检测计数器计数一次。当运动检测计数器达到MOT_DUR (Register 32)的规定时间时,运动检测被中断。
  385. *
  386. * 运动中断表明了被检测的运动MOT_DETECT_STATUS (Register 97)的轴和极性。
  387. *
  388. * 更多运动检测中断的相关信息,详见8.3节的MPU-6000/MPU-6050产品规格文件和该文件下的寄存器56和寄存器58文件.
  389. *
  390. * 返回当前运动检测加速度阈值(LSB = 2mg)
  391. * @请参见MPU6050_RA_MOT_THR字段@see MPU6050_RA_MOT_THR
  392. */
  393. uint8_t MPU6050::getMotionDetectionThreshold() {
  394.     I2Cdev::readByte(devAddr, MPU6050_RA_MOT_THR, buffer);
  395.     return buffer[0];
  396. }
  397. /**设定自由落体加速度阈值..
  398. * @新运动检测加速度阈值参数(LSB = 2mg)
  399. * @请参见getMotionDetectionThreshold()字段
  400. * @请参见MPU6050_RA_MOT_THR字段
  401. */
  402. void MPU6050::setMotionDetectionThreshold(uint8_t threshold) {
  403.     I2Cdev::writeByte(devAddr, MPU6050_RA_MOT_THR, threshold);
  404. }

  405. //MOT_DUR寄存器

  406. /** 获取运动检测时间的阈值。
  407. 这个寄存器为运动中断的阈值检测进行配置。时间计数器计数频率为1 kHz ,因此MOT_THR的单位是 1LSB = 1ms。当加速度器测量而得的绝对值都超过该运动检测的阈值时(Register 31),运动检测时间计数器计数一次。当运动检测计数器达到该寄存器规定的时间时,运动检测被中断。
  408. *
  409. * 更多运动检测中断的相关信息,详见8.3节的MPU-6000/MPU-6050产品规格文件。
  410. *
  411. * 返回当前运动检测加速度阈值(LSB = 1ms)
  412. ** @请参见MPU6050_RA_MOT_ DUR字段
  413. */
  414. uint8_t MPU6050::getMotionDetectionDuration() {
  415.     I2Cdev::readByte(devAddr, MPU6050_RA_MOT_DUR, buffer);
  416.     return buffer[0];
  417. }
  418. /** 设定运动检测的时间阈值
  419. * @新运动检测的时间阈值参数(LSB = 1ms)
  420. * @请参见getMotionDetectionDuration()字段
  421. * @请参见MPU6050_RA_MOT_DUR字段
  422. */
  423. void MPU6050::setMotionDetectionDuration(uint8_t duration) {
  424.     I2Cdev::writeByte(devAddr, MPU6050_RA_MOT_DUR, duration);
  425. }

  426. //ZRMOT_THR寄存器

  427. /** 获取零运动检测加速度阈值。
  428. * 这个寄存器为零运动中断检测进行配置。ZRMOT_THR的单位是1LSB = 2mg。当加速度器测量而得的三个轴的绝对值都小于检测阈值时,就可以测得零运动。这种情况下,零运动时间计数器计数一次 (寄存器34)。当自零运动时间计数器达到ZRMOT_DUR (Register 34)中规定的时间时,零运动被中断。
  429. *
  430. * 与自由落体或运动检测不同的是,当零运动首次检测到以及当零运动检测不到时,零运动检测都被中断。
  431. *
  432. * 当零运动被检测到时,其状态将在MOT_DETECT_STATUS寄存器(寄存器97) 中显示出来。当运动状态变为零运动状态被检测到时,状态位设置为1。当零运动状态变为运动状态被检测到时,状态位设置为0。
  433. *
  434. * 更多零运动检测中断的相关信息,详见8.4节的MPU-6000/MPU-6050产品规格文件和该文件下的寄存器56和寄存器58的相关文件。
  435. *
  436. * @返回当前零运动检测的加速度阈值(LSB = 2mg)
  437. * @请参见MPU6050_RA_ZRMOT_THR字段
  438. */
  439. uint8_t MPU6050::getZeroMotionDetectionThreshold() {
  440.     I2Cdev::readByte(devAddr, MPU6050_RA_ZRMOT_THR, buffer);
  441.     return buffer[0];
  442. }
  443. /**设定零运动检测的加速度阈值
  444. * @新零运动检测的加速度阈值参数 (LSB = 2mg)
  445. * @请参见getZeroMotionDetectionThreshold()字段
  446. * @请参见MPU6050_RA_ZRMOT_THR字段
  447. */
  448. void MPU6050::setZeroMotionDetectionThreshold(uint8_t threshold) {
  449.     I2Cdev::writeByte(devAddr, MPU6050_RA_ZRMOT_THR, threshold);
  450. }

  451. // ZRMOT_DUR寄存器

  452. /**获取零运动检测的时间阈值
  453. * 这个寄存器为零运动中断检测进行时间计数器的配置。时间计数器的计数频率为16 Hz,因此ZRMOT_DUR的单位是1 LSB = 64 ms。当加速度器测量而得的绝对值都小于检测器的阈值(Register 33)时,运动检测时间计数器计数一次。当零运动检测计数器达到该寄存器规定的时间时,零运动检测被中断。
  454. *
  455. * 更多零运动检测中断的相关信息,详见8.4节的MPU-6000/MPU-6050产品规格文件和该文件下的寄存器56和寄存器58的相关文件。
  456. *
  457. *返回当前零运动检测时间的阈值(LSB = 64ms)
  458. * @请参见MPU6050_RA_ZRMOT_DUR字段
  459. */
  460. uint8_t MPU6050::getZeroMotionDetectionDuration() {
  461.     I2Cdev::readByte(devAddr, MPU6050_RA_ZRMOT_DUR, buffer);
  462.     return buffer[0];
  463. }
  464. /** 设定零运动检测的时间阈值
  465. * @新零运动检测的时间阈值参数 (LSB = 1ms)
  466. * @请参见getZeroMotionDetectionDuration()字段
  467. * @请参见MPU6050_RA_ZRMOT_DU R字段
  468. */
  469. void MPU6050::setZeroMotionDetectionDuration(uint8_t duration) {
  470.     I2Cdev::writeByte(devAddr, MPU6050_RA_ZRMOT_DUR, duration);
  471. }

  472. // FIFO_EN寄存器

  473. /** 获取启用FIFO的温度值
  474. *当设置为1时,这一位点将TEMP_OUT_H and TEMP_OUT_L (寄存器  65 和
  475. 寄存器 66)写入FIFO缓冲中。
  476. *  @返回当前启用FIFO的温度值
  477. * @请参见MPU6050_RA_FIFO_EN字段
  478. */
  479. bool MPU6050::getTempFIFOEnabled() {
  480.     I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, buffer);
  481.     return buffer[0];
  482. }
  483. /** 设定启用FIFO的温度值
  484. * @启用FIFO的温度值参数
  485. * @请参见getTempFIFOEnabled()字段
  486. * @请参见MPU6050_RA_FIFO_EN字段
  487. */
  488. void MPU6050::setTempFIFOEnabled(bool enabled) {
  489.     I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, enabled);
  490. }
  491. /** 获取启用FIFO的陀螺仪的X轴的值。
  492. *当设置为1时,这一位点将GYRO_XOUT_H and GYRO_XOUT_L (寄存器  67 和
  493. 寄存器  68)写入FIFO缓冲中。
  494. * @返回启用FIFO的陀螺仪X轴的值
  495. * @请参见MPU6050_RA_FIFO_EN字段
  496. */
  497. bool MPU6050::getXGyroFIFOEnabled() {
  498.     I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, buffer);
  499.     return buffer[0];
  500. }
  501. /** 设定启用FIFO的陀螺仪的X轴的值。
  502. * @ FIFO的陀螺仪的X轴参数
  503. * @请参见getXGyroFIFOEnabled()字段
  504. * @请参见MPU6050_RA_FIFO_EN字段
  505. */
  506. void MPU6050::setXGyroFIFOEnabled(bool enabled) {
  507.     I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, enabled);
  508. }
  509. /** 获取启用FIFO的陀螺仪的Y轴的值。
  510. * 当设置为1时,这一位点将GYRO_YOUT_H and GYRO_YOUT_L (寄存器  69合寄存器 70)写入FIFO缓冲中。
  511. * @返回启用FIFO的陀螺仪Y轴的值
  512. * @请参见MPU6050_RA_FIFO_EN字段
  513. */
  514. bool MPU6050::getYGyroFIFOEnabled() {
  515.     I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, buffer);
  516.     return buffer[0];
  517. }
  518. /** 设定启用FIFO的陀螺仪的Y轴的值。
  519. * @ FIFO的陀螺仪的Y轴启用参数
  520. * @请参见getYGyroFIFOEnabled()字段
  521. * @请参见MPU6050_RA_FIFO_EN字段
  522. */
  523. void MPU6050::setYGyroFIFOEnabled(bool enabled) {
  524.     I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, enabled);
  525. }
  526. /** 获取启用FIFO的陀螺仪的Z轴的值。
  527. *当设置为1时,这一位点将GYRO_ZOUT_H and GYRO_ZOUT_L (寄存器  71 和寄存器 72)写入FIFO缓冲中。
  528. * @返回启用FIFO的陀螺仪Z轴的值
  529. * @请参见MPU6050_RA_FIFO_EN字段
  530. */
  531. bool MPU6050::getZGyroFIFOEnabled() {
  532.     I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, buffer);
  533.     return buffer[0];
  534. }
  535. /** 设定启用FIFO的陀螺仪的Z轴的值。
  536. * @ FIFO的陀螺仪的Z轴参数
  537. * @请参见getZGyroFIFOEnabled()字段
  538. * @请参见MPU6050_RA_FIFO_EN字段
  539. */
  540. void MPU6050::setZGyroFIFOEnabled(bool enabled) {
  541.     I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, enabled);
  542. }
  543. /** 获取启用FIFO的加速度值
  544. * 当设置为1时,这一位点将ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H,
  545. ACCEL_YOUT_L, ACCEL_ZOUT_H, and ACCEL_ZOUT_L寄存器  59 to寄存器 64)写入FIFO缓冲中。
  546. * @返回当前启用FIFO的加速度值
  547. * @请参见MPU6050_RA_FIFO_EN字段
  548. */
  549. bool MPU6050::getAccelFIFOEnabled() {
  550.     I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, buffer);
  551.     return buffer[0];
  552. }
  553. /**设定启用FIFO的加速度值
  554. * @ 启用新FIFO的加速度启用参数
  555. * @请参见getAccelFIFOEnabled()字段
  556. * @请参见MPU6050_RA_FIFO_EN字段
  557. */
  558. void MPU6050::setAccelFIFOEnabled(bool enabled) {
  559.     I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, enabled);
  560. }
  561. /** 获取Slave 2 FIFO的启用值
  562. *当设置为1时,这一位点将与Slave 2 相连的EXT_SENS_DATA 寄存器 (寄存器 73到o寄存器  96)写入FIFO缓冲中。
  563. * @返回当前Slave 2 FIFO的启用值
  564. * @请参见MPU6050_RA_FIFO_EN字段
  565. */
  566. bool MPU6050::getSlave2FIFOEnabled() {
  567.     I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, buffer);
  568.     return buffer[0];
  569. }
  570. /** 设定Slave 2 FIFO的启用值
  571. * @新Slave 2 FIFO的启用参数
  572. * @请参见getSlave2FIFOEnabled()字段
  573. * @请参见MPU6050_RA_FIFO_EN字段
  574. */
  575. void MPU6050::setSlave2FIFOEnabled(bool enabled) {
  576.     I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, enabled);
  577. }
  578. /** 获取Slave 1 FIFO的启用值
  579. *当设置为1时,这一位点将与Slave 1 相连的EXT_SENS_DATA寄存器(寄存器73 到寄存器 96)写入FIFO缓冲中。
  580. * @返回当前Slave 1 FIFO的启用值
  581. * @请参见MPU6050_RA_FIFO_EN字段
  582. */
  583. bool MPU6050::getSlave1FIFOEnabled() {
  584.     I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, buffer);
  585.     return buffer[0];
  586. }
  587. /** 设定启用Slave 1 FIFO的值
  588. * @ 新的Slave 1 FIFO启用参数
  589. * @请参见getSlave1FIFOEnabled()字段
  590. * @请参见MPU6050_RA_FIFO_EN字段
  591. */
  592. void MPU6050::setSlave1FIFOEnabled(bool enabled) {
  593.     I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, enabled);
  594. }
  595. /** 获取Slave 0 FIFO的启用值
  596. *当设置为1时,这一位点将与Slave0 相连的EXT_SENS_DATA寄存器(寄存器73 到寄存器 96)写入FIFO缓冲中。
  597. * @返回当前Slave 0 FIFO的启用值
  598.   * @请参见MPU6050_RA_FIFO_EN字段
  599. */
  600. bool MPU6050::getSlave0FIFOEnabled() {
  601.     I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, buffer);
  602.     return buffer[0];
  603. }
  604. /** 设定Slave 0 FIFO的启用值
  605. * @新Slave 0 FIFO的启用参数
  606. * @请参见getSlave0FIFOEnabled()字段
  607. * @请参见MPU6050_RA_FIFO_EN字段
  608. */
  609. void MPU6050::setSlave0FIFOEnabled(bool enabled) {
  610.     I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, enabled);
  611. }

  612. // I2C_MST_CTRL寄存器

  613. /** 获取multi-master的启用值
  614. * Multi-master功能允许在同一总线上使用多个I2C主机。在需要multi-master功能的电路中,将MULT_MST_EN设置为1。这将使电流增加约30 uA。
  615. *
  616. *在需要multi-master功能的电路中,I2C总线的状态由每个单独的I2C主机所决定。在一个I2C主机能够承担总线的仲裁之前,必须先确认没有其他I2C主机承担总线的仲裁。当MULT_MST_EN设置为1时,MPU-60X0的总线仲裁检测逻辑被打开,启用该检测逻辑来检测总线是否可用。
  617. *
  618. * @返回当前multi-master的启用值
  619. * @请参见MPU6050_RA_I2C_MST_CTRL字段
  620. */
  621. bool MPU6050::getMultiMasterEnabled() {
  622.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, buffer);
  623.     return buffer[0];
  624. }
  625. /**设定multi-master的启用值
  626.   * @新multi-master的启用参数
  627. * @请参见getMultiMasterEnabled()字段
  628. * @请参见MPU6050_RA_I2C_MST_CTRL字段
  629. */
  630. void MPU6050::setMultiMasterEnabled(bool enabled) {
  631.     I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, enabled);
  632. }
  633. /** 获取wait-for-external-sensor-data的启用值
  634. * *当WAIT_FOR_ES位设置为1时,数据准备中断将会被推迟直到从Slave而得的外部传感器数据加载到EXT_SENS_DATA寄存器中。这是用来确保当数据准备中断被开启时,内部传感器数据(即陀螺仪和加速度传感器)和外部传感器数据都成功加载到各自的数据寄存器中(即数据同步完成)。
  635. *
  636. * @返回当前 wait-for-external-sensor-data 的启用值
  637. * @请参见MPU6050_RA_I2C_MST_CTRL字段
  638. */
  639. bool MPU6050::getWaitForExternalSensorEnabled() {
  640.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, buffer);
  641.     return buffer[0];
  642. }
  643. /** 设置wait-for-external-sensor-data的启用值.
  644. * @新wait-for-external-sensor-data的启用参数
  645. * @请参见getWaitForExternalSensorEnabled()字段
  646. * @请参见MPU6050_RA_I2C_MST_CTRL字段
  647. */
  648. void MPU6050::setWaitForExternalSensorEnabled(bool enabled) {
  649.     I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, enabled);
  650. }
  651. /** 获取Slave 3 FIFO的启用值
  652. * *当设置为1时,这一位点将与Slave3 相连的EXT_SENS_DATA寄存器(寄存器73 到寄存器 96)写入FIFO缓冲中。
  653. * @返回当前启用Slave 3 FIFO的值
  654. * @ 请参见MPU6050_RA_MST_CTRL字段
  655. */
  656. bool MPU6050::getSlave3FIFOEnabled() {
  657.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, buffer);
  658.     return buffer[0];
  659. }
  660. /** 设定Slave 3 FIFO的启用值
  661. * @新Slave 3 FIFO的启用参数
  662. * @请参见getSlave3FIFOEnabled()字段
  663. * @请参见MPU6050_RA_MST_CTRL字段
  664. */
  665. void MPU6050::setSlave3FIFOEnabled(bool enabled) {
  666.     I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, enabled);
  667. }
  668. /** 获取slave读/写转换的启用值
  669. * I2C_MST_P_NSR位对I2C主机slave读取间的转变进行配置。如果该位等于0,将重新读取。如果该位等于1,下一个读取之前会有停顿。当一个读取转换为一个编写,通常在停顿后开始连续编写。
  670. *
  671. *@返回当前slave读/编转换的启用值
  672. * @请参见MPU6050_RA_I2C_MST_CTRL字段
  673. */
  674. bool MPU6050::getSlaveReadWriteTransitionEnabled() {
  675.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, buffer);
  676.     return buffer[0];
  677. }
  678. /** 设定slave读/编转换的启用值
  679. *@新slave读/编转换的启用参数
  680. * @请参见getSlaveReadWriteTransitionEnabled()字段
  681. * @请参见 MPU6050_RA_I2C_MST_CTRL字段
  682. */
  683. void MPU6050::setSlaveReadWriteTransitionEnabled(bool enabled) {
  684.     I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, enabled);
  685. }
  686. /** 获取I2C主时钟速度。
  687. * * I2C_MST_CLK是一个4位的无符号值,它用于对内部的频率为8MHz的时钟进行分频配置。它根据下表对I2C主时钟速度进行设置:
  688. *
  689. * <pre>
  690. * I2C_MST_CLK | I2C 主时钟速度 | 8MHz 时钟分频器
  691. * ------------+------------------------+-------------------
  692. * 0           | 348kHz                 | 23
  693. * 1           | 333kHz                 | 24
  694. * 2           | 320kHz                 | 25
  695. * 3           | 308kHz                 | 26
  696. * 4           | 296kHz                 | 27
  697. * 5           | 286kHz                 | 28
  698. * 6           | 276kHz                 | 29
  699. * 7           | 267kHz                 | 30
  700. * 8           | 258kHz                 | 31
  701. * 9           | 500kHz                 | 16
  702. * 10          | 471kHz                 | 17
  703. * 11          | 444kHz                 | 18
  704. * 12          | 421kHz                 | 19
  705. * 13          | 400kHz                 | 20
  706. * 14          | 381kHz                 | 21
  707. * 15          | 364kHz                 | 22
  708. * </pre>
  709. *
  710. * @返回当前I2C 主时钟速度值
  711. * @请参见MPU6050_RA_I2C_MST_CTRL字段
  712. */
  713. uint8_t MPU6050::getMasterClockSpeed() {
  714.     I2Cdev::readBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, buffer);
  715.     return buffer[0];
  716. }
  717. /** 设定I2C 主时钟速度值
  718. * @返回当前I2C 主时钟速度值
  719. * @请参见MPU6050_RA_I2C_MST_CTRL字段
  720. */
  721. void MPU6050::setMasterClockSpeed(uint8_t speed) {
  722.     I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, speed);
  723. }

  724. // I2C_SLV*寄存器(Slave 0-3)

  725. /** 获取指定slave (0-3)的I2C地址
  726. * 注意Bit 7 (MSB)控制了读/写模式。如果设置了Bit 7,那么这是一个读取操作,如果将其清除,那么这是一个编写操作。其余位(6-0)是slave设备的7-bit设备地址。
  727. *
  728. * 在读取模式中,读取结果是存储于最低可用的EXT_SENS_DATA寄存器中。更多读取结果分布信息,请参阅EXT_SENS_DATA寄存器的描述(寄存器 73 - 96)。
  729. *
  730. * MPU-6050支持全5个slave,但Slave 4有其特殊功能(getSlave4* 和setSlave4*)。
  731. *
  732. * 如寄存器25中所述,I2C数据转换通过采样率体现。用户负责确保I2C数据转换能够在一个采样率周期内完成。
  733. *
  734. * I2C slave数据传输速率可根据采样率来减小。减小的传输速率是由I2C_MST_DLY(寄存器52)所决定的。slave数据传输速率是否根据采样率来减小是由I2C_MST_DELAY_CTRL (寄存器103)所决定的。
  735. *
  736. * slave的处理指令是固定的。Slave的处理顺序是Slave 1, Slave 2, Slave 3 和 Slave 4。如果某一个Slave被禁用了,那么它会被自动忽略。
  737. *
  738. * 每个slave可按采样率或降低的采样率来读取。在有些slave以采样率读取有些以减小的采样率读取的情况下,slave的读取顺序依旧不变。然而,如果一些slave的读取速率不能在特定循环中进行读取,那么它们会被自动忽略。更多降低的读取速率相关信息,请参阅寄存器52。Slave是否按采样率或降低的采样率来读取由寄存器103得Delay Enable位来决定。
  739. *
  740. * @Slave 数 (0-3)参数
  741. * @返回当前指定slave地址
  742. * @请参见MPU6050_RA_I2C_SLV0_ADDR字段
  743. */
  744. uint8_t MPU6050::getSlaveAddress(uint8_t num) {
  745.     if (num > 3) return 0;
  746.     I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num*3, buffer);
  747.     return buffer[0];
  748. }
  749. /** 设定指定slave (0-3)的I2C 地址
  750. * @Slave 数 (0-3)参数
  751. * @指定slave的新地址参数
  752. * @请参见getSlaveAddress()字段
  753. * @请参见MPU6050_RA_I2C_SLV0_ADDR字段
  754. */
  755. void MPU6050::setSlaveAddress(uint8_t num, uint8_t address) {
  756.     if (num > 3) return;
  757.     I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num*3, address);
  758. }
  759. /** 获取指定slave (0-3)的当前内部寄存器
  760. * Slave的读/写操作适用于这个MPU寄存器,不管寄存器存储了什么地址。
  761. *
  762. * MPU-6050支持全5个slave,但Slave 4有其特殊功能。
  763. *
  764. * @Slave 数 (0-3)参数
  765. * @返回指定slave的当前寄存器
  766. * @请参见MPU6050_RA_I2C_SLV0_REG字段
  767. */
  768. uint8_t MPU6050::getSlaveRegister(uint8_t num) {
  769.     if (num > 3) return 0;
  770.     I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num*3, buffer);
  771.     return buffer[0];
  772. }
  773. /** 设定指定slave(0-3)的当前内部寄存器.
  774. * @Slave 数 (0-3)参数
  775. * @指定slave的新当前寄存器参数
  776. * @请参见getSlaveRegister()字段
  777. * @请参见 MPU6050_RA_I2C_SLV0_REG字段
  778. */
  779. void MPU6050::setSlaveRegister(uint8_t num, uint8_t reg) {
  780.     if (num > 3) return;
  781.     I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num*3, reg);
  782. }
  783. /** 获取指定slave(0-3)的启用值
  784. * 当设置为1时,这个位启用Slave 0数据传输操作。当设置为0时,这个位禁用了Slave 0数据传输操作。
  785. * @ Slave 数 (0-3)参数
  786. * @返回当前指定slave的启用值
  787. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  788. */
  789. bool MPU6050::getSlaveEnabled(uint8_t num) {
  790.     if (num > 3) return 0;
  791.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_EN_BIT, buffer);
  792.     return buffer[0];
  793. }
  794. /** 设定指定slave(0-3)的启用值
  795. * @ Slave 数 (0-3)参数
  796. * @指定slave的启用参数
  797. * 参见getSlaveEnabled()
  798. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  799. */
  800. void MPU6050::setSlaveEnabled(uint8_t num, bool enabled) {
  801.     if (num > 3) return;
  802.     I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_EN_BIT, enabled);
  803. }
  804. /** 启用指定slave的词对字节交换
  805. * 当设置为1时,字节交换启用。当启用字节交换时,词对的高低字节即可交换。词对配对规律,请参考I2C_SLV0_GRP。为了进行字节交换,当设置为0时,由slave0交换而来的字节将被存储于EXT_SENS_DATA寄存器中。
  806. *
  807. * @ Slave 数 (0-3)参数
  808. * @返回当前指定slave的词对字节交换启用值
  809. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  810. */
  811. bool MPU6050::getSlaveWordByteSwap(uint8_t num) {
  812.     if (num > 3) return 0;
  813.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_BYTE_SW_BIT, buffer);
  814.     return buffer[0];
  815. }
  816. /** 设定指定slave(0-3)的词对字节交换.
  817. *@ Slave 数 (0-3)参数
  818. * @当前指定slave的词对字节交换启用参数
  819. * @请参见getSlaveWordByteSwap()字段
  820. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  821. */
  822. void MPU6050::setSlaveWordByteSwap(uint8_t num, bool enabled) {
  823.     if (num > 3) return;
  824.     I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_BYTE_SW_BIT, enabled);
  825. }
  826. /**获取指定slave(0-3)的编写模式.
  827. * 当设置为1时,只进行数据的读或写操作。当设置为0时,在读写数据之前将编写一个寄存器地址。当指定寄存器地址在slave设备中时,这应该等于0,而在该寄存器中会进行数据处理。
  828. *
  829. * @ Slave 数 (0-3)参数 (0-3)
  830. * @返回当前指定slave的编写模式(0 = register address + data, 1 = data only)
  831. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  832. */
  833. bool MPU6050::getSlaveWriteMode(uint8_t num) {
  834.     if (num > 3) return 0;
  835.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_REG_DIS_BIT, buffer);
  836.     return buffer[0];
  837. }
  838. /** 设定指定slave(0-3)的编写模式
  839. * @ Slave 数 (0-3)参数
  840. * @指定slave的新编写模式参数
  841. * @请参见getSlaveWriteMode()字段
  842. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  843. */
  844. void MPU6050::setSlaveWriteMode(uint8_t num, bool mode) {
  845.     if (num > 3) return;
  846.     I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_REG_DIS_BIT, mode);
  847. }
  848. /** 获取指定slave(0-3)的词对分组顺序函数.
  849. * 这确定了从寄存器接收到的指定词对分组顺序。当设置为0时,寄存器地址为0和1、2和3等(甚至是不成对的寄存器地址)的字节组成词对。当设置为1时,寄存器地址为1和2、3和4等(甚至是不成对的寄存器地址)的字节组成词对。
  850. *
  851. * @Slave 数 (0-3)参数
  852. * @返回当前指定slave的词对分组顺序
  853. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  854. */
  855. bool MPU6050::getSlaveWordGroupOffset(uint8_t num) {
  856.     if (num > 3) return 0;
  857.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_GRP_BIT, buffer);
  858.     return buffer[0];
  859. }
  860. /** 设定指定slave(0-3)的词对分组顺序函数.
  861. * @Slave 数 (0-3)参数
  862. * @指定slave新词对分组顺序的启用参数。
  863. * @请参见getSlaveWordGroupOffset()字段
  864. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  865. */
  866. void MPU6050::setSlaveWordGroupOffset(uint8_t num, bool enabled) {
  867.     if (num > 3) return;
  868.     I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_GRP_BIT, enabled);
  869. }
  870. /**获取指定slave(0-3)读取的字节数
  871. * 确定由Slave 0转换而来和转换至Slave 0的字节数。将此位清楚为0就相当于通过在I2C_SLV0_EN上编写0来禁用该寄存器。
  872. * @Slave 数 (0-3)参数
  873. * @返回指定slave读取的字节数
  874. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  875. */
  876. uint8_t MPU6050::getSlaveDataLength(uint8_t num) {
  877.     if (num > 3) return 0;
  878.     I2Cdev::readBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, buffer);
  879.     return buffer[0];
  880. }
  881. /** 设定指定slave(0-3)读取的字节数
  882. * @Slave 数 (0-3)参数
  883. * @指定slave的字节数长度参数
  884. * @请参见getSlaveDataLength()字段
  885. * @请参见MPU6050_RA_I2C_SLV0_CTRL字段
  886. */
  887. void MPU6050::setSlaveDataLength(uint8_t num, uint8_t length) {
  888.     if (num > 3) return;
  889.     I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, length);
  890. }

  891. // I2C_SLV*寄存器(Slave 4)

  892. /** 获取指定slave4的I2C地址
  893. * 注意Bit 7 (MSB)控制了读/写模式。如果设置了Bit 7,那么这是一个读取操作,如果将其清除,那么这是一个编写操作。其余位(6-0)是slave设备的7-bit设备地址。
  894. *
  895. * @返回当前slave4的地址
  896. * @请参见getSlaveAddress()字段
  897. * @ 请参见MPU6050_RA_I2C_SLV4_ADDR字段
  898. */
  899. uint8_t MPU6050::getSlave4Address() {
  900.     I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, buffer);
  901.     return buffer[0];
  902. }
  903. /** 设定指定slave4的I2C地址
  904. * @ slave4的新地址参数
  905. * @请参见getSlave4Address()字段
  906. * @请参见MPU6050_RA_I2C_SLV4_ADDR字段
  907. */
  908. void MPU6050::setSlave4Address(uint8_t address) {
  909.     I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, address);
  910. }
  911. /** 获取slave4的当前内部寄存器
  912. * Slave的读/写操作适用于这个MPU寄存器,不管寄存器存储了什么地址。
  913. *
  914. * @返回slave4的当前寄存器
  915. * @请参见MPU6050_RA_I2C_SLV4_REG字段
  916. */
  917. uint8_t MPU6050::getSlave4Register() {
  918.     I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_REG, buffer);
  919.     return buffer[0];
  920. }
  921. /** 设定slave4的当前内部寄存器
  922. * @slave4当前寄存器的寄存参数
  923. * @请参见getSlave4Register()字段
  924. * @请参见MPU6050_RA_I2C_SLV4_REG字段
  925. */
  926. void MPU6050::setSlave4Register(uint8_t reg) {
  927.     I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_REG, reg);
  928. }
  929. /** 设定写于slave4的新字节
  930. * 这一寄存器可储存写于slave4的数据。如果I2C_SLV4_RW设置为1(设置为读取模式),那么该寄存器无法执行操作。
  931. * @写于slave4的新字节数据参数
  932. * @ 请参见MPU6050_RA_I2C_SLV4_DO字段
  933. */
  934. void MPU6050::setSlave4OutputByte(uint8_t data) {
  935.     I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_DO, data);
  936. }
  937. /** 获取slave4的启用值
  938. * 当设置为1时,此位启用了slave4的转换操作。当设置为0时,则禁用该操作。
  939. * @返回当前slave4的启用值
  940. * @请参见MPU6050_RA_I2C_SLV4_CTRL字段
  941. */
  942. bool MPU6050::getSlave4Enabled() {
  943.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, buffer);
  944.     return buffer[0];
  945. }
  946. /** 设定slave4的启用值
  947. * @slave4新启用参数
  948. * @请参见getSlave4Enabled()字段
  949. * @请参见MPU6050_RA_I2C_SLV4_CTRL字段
  950. */
  951. void MPU6050::setSlave4Enabled(bool enabled) {
  952.     I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, enabled);
  953. }
  954. /** 获取slave4事务中断的启用值
  955. * 当设置为1时,此位启用了slave4事务完成的中断信号的生成。当清除为0时,则禁用了该信号的生成。这一中断状态可在寄存器54中看到。
  956. *
  957. * @返回当前slave4事务中断的启用值
  958. * @请参见MPU6050_RA_I2C_SLV4_CTRL字段
  959. */
  960. bool MPU6050::getSlave4InterruptEnabled() {
  961.     I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, buffer);
  962.     return buffer[0];
  963. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-5-10 23:21:39 | 显示全部楼层
赞一个表示没看懂
回复 支持 反对

使用道具 举报

发表于 2013-5-10 23:34:02 | 显示全部楼层
得闲及及 {:soso__10169062262133571330_1:}
回复 支持 反对

使用道具 举报

发表于 2013-5-20 12:19:00 | 显示全部楼层
版主继续啊,等着看下文呢
回复 支持 反对

使用道具 举报

发表于 2013-5-20 15:51:35 | 显示全部楼层
这个好。可以好好学习了
回复 支持 反对

使用道具 举报

发表于 2013-5-20 18:12:33 | 显示全部楼层
支持支持。。。。加油
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-20 18:14:44 | 显示全部楼层
这个。。。这周把全部都整理好发出来。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-21 08:49:55 | 显示全部楼层
{:soso_e154:}本帖已经更新到600行。。。后面再开个新帖。。。一次发的太多后面写其他的也写不下了。。预计。。5贴发完。。
回复 支持 反对

使用道具 举报

发表于 2013-5-21 08:59:27 | 显示全部楼层
太好了,一直感觉没有把6050的性能充分放出来,就差这些库文件了,不过好像大陆版本的不支持融合吧,所以现在才这么便宜
回复 支持 反对

使用道具 举报

发表于 2013-5-22 09:36:55 | 显示全部楼层
好,感谢分享
回复 支持 反对

使用道具 举报

发表于 2013-5-22 11:30:45 | 显示全部楼层
好东西啊~这两天被这玩意折磨的死去活来
回复 支持 反对

使用道具 举报

发表于 2013-5-23 08:36:47 | 显示全部楼层
汉化的60X0寄存器中文版介绍,那个pdf为啥链接指向有问题呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-23 09:28:25 | 显示全部楼层
wunanyx 发表于 2013-5-23 08:36
汉化的60X0寄存器中文版介绍,那个pdf为啥链接指向有问题呢?

额。。。。谢谢提醒。。。。现在已经修复。。
回复 支持 反对

使用道具 举报

发表于 2013-5-23 10:42:08 | 显示全部楼层
弘毅 发表于 2013-5-23 09:28
额。。。。谢谢提醒。。。。现在已经修复。。

老大真牛呀!!!!!!!!!!!
回复 支持 反对

使用道具 举报

发表于 2013-5-23 15:04:24 | 显示全部楼层
第67行是不是翻译错了?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 12:47 , Processed in 0.047564 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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