弘毅 发表于 2013-5-10 15:46:21

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

MPU6050在众多姿态传感器中使用者非常多,因其集成了陀螺仪与加速度传感器两个组件,本身还有DMP融合输出,使用起来也很方便,受到了广大爱好者的青睐。

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

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


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


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

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

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

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

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

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

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

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

#include "MPU6050.h"

/*
* 默认的函数结构,使用默认的I2C地址。
* 请参考MPU6050_DEFAULT_ADDRESS字段
*/
MPU6050::MPU6050() {
    devAddr = MPU6050_DEFAULT_ADDRESS;
}

/*
* 特殊地址的函数结构。
* I2C地址参数
* 请参考MPU6050_DEFAULT_ADDRESS字段
* 请参考MPU6050_ADDRESS_AD0_LOW字段
* 请参考MPU6050_ADDRESS_AD0_HIGH字段
*/
MPU6050::MPU6050(uint8_t address) {
    devAddr = address;
}

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

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

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

/*
* 获取I2C辅助电源电压。
* 当设置为1,辅助I2C总线高电平是VDD。当电压为0,辅助I2C总线高电平是VLOGIC。这并不适用于MPU-6000,因为它没有VLOGIC端口。
* 返回I2C电源电压 (0 = VLOGIC,1 = VDD)
*/
uint8_t MPU6050::getAuxVDDIOLevel() {
    I2Cdev::readBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, buffer);
    return buffer;
}
/*
* 设置I2C辅助电源电压。
* 当设置为1时,辅助I2C总线高电平是VDD。当设置为0时,辅助I2C总线高电平是VLOGIC。这并不适用于MPU-6000,因为它没有VLOGIC端口。
* param level I2C电源电压(0 = VLOGIC,1 = VDD)
*/
void MPU6050::setAuxVDDIOLevel(uint8_t level) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_YG_OFFS_TC, MPU6050_TC_PWR_MODE_BIT, level);
}

// SMPLRT_DIV寄存器

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

// 配置寄存器

/*
* 获取FSYNC函数外接配置
* 配置连接到FSYNC端口进行采样。一个连接到FSYNC端口的外部信号可以通过配置EXT_SYNC_SET来采样。为了捕获短频闪光,我们将FSYNC端口的信号变化关闭。我们在寄存器25中定义,由关闭的FSYNC端口信号变化采样而来的数据为采样率。采样完毕后, 锁存器将重置为当前的FSYNC信号状态。
*
* 根据下表所示的EXT_SYNC_SET值,我们将所得采样值的最低有效位输入传感器数据寄存器中。
*
* <pre>
* EXT_SYNC_SET | FSYNC Bit Location
* -------------+-------------------
* 0            | Input disabled
* 1            | TEMP_OUT_L
* 2            | GYRO_XOUT_L
* 3            | GYRO_YOUT_L
* 4            | GYRO_ZOUT_L
* 5            | ACCEL_XOUT_L
* 6            | ACCEL_YOUT_L
* 7            | ACCEL_ZOUT_L
* </pre>
*
* 返回FSYNC配置值
*/
uint8_t MPU6050::getExternalFrameSync() {
    I2Cdev::readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, buffer);
    return buffer;
}
/*
* 设定FSYNC函数外接配置
* 请参见getExternalFrameSync()字段
* 请参见MPU6050_RA_CONFIG字段
* 新FSYNC配置的同步参数
*/
void MPU6050::setExternalFrameSync(uint8_t sync) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_EXT_SYNC_SET_BIT, MPU6050_CFG_EXT_SYNC_SET_LENGTH, sync);
}
/*
* 获取数字低通滤波器的配置
*
* DLPF_CFG参数设置了数字低通滤波器的配置。同时,通过下表所示的设备,DLPF_CFG参数决定了内部采样率。
*
* 注意:加速度传感器输出率是1 khz。这意味着,采样率大于1 khz时,同一个加速度传感器的样品可能会多次输入到FIFO、DMP和传感器寄存器。
*
* <pre>
*          |   加速度传感器   |             陀螺仪
* DLPF_CFG |    带宽   |延迟|    带宽   |延迟| 采样率
* ---------+-----------+--------+-----------+--------+-------------
* 0      | 260Hz   | 0ms    | 256Hz   | 0.98ms | 8kHz
* 1      | 184Hz   | 2.0ms| 188Hz   | 1.9ms| 1kHz
* 2      | 94Hz      | 3.0ms| 98Hz      | 2.8ms| 1kHz
* 3      | 44Hz      | 4.9ms| 42Hz      | 4.8ms| 1kHz
* 4      | 21Hz      | 8.5ms| 20Hz      | 8.3ms| 1kHz
* 5      | 10Hz      | 13.8ms | 10Hz      | 13.4ms | 1kHz
* 6      | 5Hz       | 19.0ms | 5Hz       | 18.6ms | 1kHz
* 7      |   -- Reserved --   |   -- Reserved --   | Reserved
* </pre>
*
* 请参见MPU6050_RA_CONFIG字段
* 请参见MPU6050_CFG_DLPF_CFG_BIT字段
* 请参见MPU6050_CFG_DLPF_CFG_LENGTH字段
*/
uint8_t MPU6050::getDLPFMode() {
    I2Cdev::readBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, buffer);
    return buffer;
}
/*
* 设定数字低通滤波器的配置.
* @新DLFP配置的模式参数
* @请参见getDLPFBandwidth()字段
* @请参见MPU6050_DLPF_BW_256字段
* @请参见MPU6050_RA_CONFIG字段
* @请参见MPU6050_CFG_DLPF_CFG_BIT字段
* @请参见MPU6050_CFG_DLPF_CFG_LENGTH字段
*/
void MPU6050::setDLPFMode(uint8_t mode) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, mode);
}

// 陀螺仪配置寄存器

/*
* 获取全量程的陀螺仪范围。
* 如下表所示,FS_SEL参数允许将陀螺仪传感器的范围设置为全量程。
*
* <pre>
* 0 = +/- 250 度/秒
* 1 = +/- 500 度/秒
* 2 = +/- 1000 度/秒
* 3 = +/- 2000 度/秒
* </pre>
*
* @返回当前陀螺仪范围的全量程设置
* @请参见MPU6050_GYRO_FS_250字段
* @请参见MPU6050_RA_GYRO_CONFIG字段
* @请参见MPU6050_GCONFIG_FS_SEL_BIT字段
* @请参见MPU6050_GCONFIG_FS_SEL_LENGTH字段
*/
uint8_t MPU6050::getFullScaleGyroRange() {
    I2Cdev::readBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, buffer);
    return buffer;
}
/*
* 设定全量程的陀螺仪范围.
* @全量程的陀螺仪范围参数
* @请参见getFullScaleRange()字段
* @请参见MPU6050_GYRO_FS_250字段
* @请参见MPU6050_RA_GYRO_CONFIG字段
* @请参见MPU6050_GCONFIG_FS_SEL_BIT字段
* @请参见MPU6050_GCONFIG_FS_SEL_LENGTH字段
*/
void MPU6050::setFullScaleGyroRange(uint8_t range) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range);
}

// 加速度器配置寄存器

/*
* 开启加速度器X轴的安全自测功能。
* @返回测试值
* @请参见MPU6050_RA_ACCEL_CONFIG字段
*/
bool MPU6050::getAccelXSelfTest() {
    I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, buffer);
    return buffer;
}
/*
* 开启加速度器X轴的安全自测功能。
* @安全自测启用参数
* @请参见MPU6050_RA_ACCEL_CONFIG字段
*/
void MPU6050::setAccelXSelfTest(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_XA_ST_BIT, enabled);
}
/*
* 开启加速度器Y轴的安全自测功能。
* @返回测试值
* @请参见MPU6050_RA_ACCEL_CONFIG字段
*/
bool MPU6050::getAccelYSelfTest() {
    I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, buffer);
    return buffer;
}
/*
* 开启加速度器Y轴的安全自测功能。
* @安全自测启用参数
* @请参见MPU6050_RA_ACCEL_CONFIG字段
*/
void MPU6050::setAccelYSelfTest(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_YA_ST_BIT, enabled);
}
/*
* 开启加速度器Z轴的安全自测功能。
* @返回测试值
* @请参见MPU6050_RA_ACCEL_CONFIG字段
*/
bool MPU6050::getAccelZSelfTest() {
    I2Cdev::readBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, buffer);
    return buffer;
}
/*
* 开启加速度器Z轴的安全自测功能。
* @安全自测启用参数
* @请参见MPU6050_RA_ACCEL_CONFIG字段
*/
void MPU6050::setAccelZSelfTest(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ZA_ST_BIT, enabled);
}
/*
* 获取全量程的加速度计范围.
* 如下表所示,FS_SEL参数允许将加速度传感器的范围设置为全量程。
*
* <pre>
* 0 = +/- 2g
* 1 = +/- 4g
* 2 = +/- 8g
* 3 = +/- 16g
* </pre>
*
* @返回当前加速度传感器范围的全量程设置
* @请参见MPU6050_ACCEL_FS_2字段
* @请参见MPU6050_RA_ACCEL_CONFIG字段
* @请参见MPU6050_ACONFIG_AFS_SEL_BIT字段
* @请参见MPU6050_ACONFIG_AFS_SEL_LENGTH字段
*/
uint8_t MPU6050::getFullScaleAccelRange() {
    I2Cdev::readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, buffer);
    return buffer;
}
/*
* 设定全量程的加速度计范围
* @全量程的加速度范围参数
* @请参见getFullScaleAccelRange()字段
*/
void MPU6050::setFullScaleAccelRange(uint8_t range) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range);
}
/*
* 获取高通滤波器的配置.
* DHPF是在路径中连接于运动探测器(自由落体,运动阈值,零运动)的一个滤波器模块。高通滤波器的输出值不在数据寄存器中(参见第八节的MPU-6000/ MPU-6050产品规格文档图)。
*
* 高通滤波器有三种模式:
*
* <pre>
*    重置:在一个样本中将滤波器输出值设为零。这有效的禁用了高通滤波器。这种模式可以快速切换滤波器的设置模式。
*
*    开启:高通滤波器能通过高于截止频率的信号。
*
*    持续:触发后,过滤器持续当前采样。过滤器输出值是输入样本和持续样本之间的差异。
* </pre>
*
* <pre>
* ACCEL_HPF | 高通滤波模式| 截止频率
* ----------+-------------+------------------
* 0         | Reset       | None
* 1         | On          | 5Hz
* 2         | On          | 2.5Hz
* 3         | On          | 1.25Hz
* 4         | On          | 0.63Hz
* 7         | Hold      | None
* </pre>
*
* @返回当前高通滤波器配置
* @请参见MPU6050_DHPF_RESET字段
* @请参见MPU6050_RA_ACCEL_CONFIG字段
*/
uint8_t MPU6050::getDHPFMode() {
    I2Cdev::readBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, buffer);
    return buffer;
}
/*
* 设定高通滤波器的配置.
* @新高通滤波器配置的带宽参数
* @请参见setDHPFMode()字段
* @请参见MPU6050_DHPF_RESET字段
* @请参见MPU6050_RA_ACCEL_CONFIG字段
*/
void MPU6050::setDHPFMode(uint8_t bandwidth) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_ACCEL_HPF_BIT, MPU6050_ACONFIG_ACCEL_HPF_LENGTH, bandwidth);
}

// FF_THR寄存器

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

// FF_DUR寄存器

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

// MOT_THR寄存器

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

//MOT_DUR寄存器

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

//ZRMOT_THR寄存器

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

// ZRMOT_DUR寄存器

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

// FIFO_EN寄存器

/** 获取启用FIFO的温度值
*当设置为1时,这一位点将TEMP_OUT_H and TEMP_OUT_L (寄存器65 和
寄存器 66)写入FIFO缓冲中。
*@返回当前启用FIFO的温度值
* @请参见MPU6050_RA_FIFO_EN字段
*/
bool MPU6050::getTempFIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, buffer);
    return buffer;
}
/** 设定启用FIFO的温度值
* @启用FIFO的温度值参数
* @请参见getTempFIFOEnabled()字段
* @请参见MPU6050_RA_FIFO_EN字段
*/
void MPU6050::setTempFIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_TEMP_FIFO_EN_BIT, enabled);
}
/** 获取启用FIFO的陀螺仪的X轴的值。
*当设置为1时,这一位点将GYRO_XOUT_H and GYRO_XOUT_L (寄存器67 和
寄存器68)写入FIFO缓冲中。
* @返回启用FIFO的陀螺仪X轴的值
* @请参见MPU6050_RA_FIFO_EN字段
*/
bool MPU6050::getXGyroFIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, buffer);
    return buffer;
}
/** 设定启用FIFO的陀螺仪的X轴的值。
* @ FIFO的陀螺仪的X轴参数
* @请参见getXGyroFIFOEnabled()字段
* @请参见MPU6050_RA_FIFO_EN字段
*/
void MPU6050::setXGyroFIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_XG_FIFO_EN_BIT, enabled);
}
/** 获取启用FIFO的陀螺仪的Y轴的值。
* 当设置为1时,这一位点将GYRO_YOUT_H and GYRO_YOUT_L (寄存器69合寄存器 70)写入FIFO缓冲中。
* @返回启用FIFO的陀螺仪Y轴的值
* @请参见MPU6050_RA_FIFO_EN字段
*/
bool MPU6050::getYGyroFIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, buffer);
    return buffer;
}
/** 设定启用FIFO的陀螺仪的Y轴的值。
* @ FIFO的陀螺仪的Y轴启用参数
* @请参见getYGyroFIFOEnabled()字段
* @请参见MPU6050_RA_FIFO_EN字段
*/
void MPU6050::setYGyroFIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_YG_FIFO_EN_BIT, enabled);
}
/** 获取启用FIFO的陀螺仪的Z轴的值。
*当设置为1时,这一位点将GYRO_ZOUT_H and GYRO_ZOUT_L (寄存器71 和寄存器 72)写入FIFO缓冲中。
* @返回启用FIFO的陀螺仪Z轴的值
* @请参见MPU6050_RA_FIFO_EN字段
*/
bool MPU6050::getZGyroFIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, buffer);
    return buffer;
}
/** 设定启用FIFO的陀螺仪的Z轴的值。
* @ FIFO的陀螺仪的Z轴参数
* @请参见getZGyroFIFOEnabled()字段
* @请参见MPU6050_RA_FIFO_EN字段
*/
void MPU6050::setZGyroFIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ZG_FIFO_EN_BIT, enabled);
}
/** 获取启用FIFO的加速度值
* 当设置为1时,这一位点将ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H,
ACCEL_YOUT_L, ACCEL_ZOUT_H, and ACCEL_ZOUT_L寄存器59 to寄存器 64)写入FIFO缓冲中。
* @返回当前启用FIFO的加速度值
* @请参见MPU6050_RA_FIFO_EN字段
*/
bool MPU6050::getAccelFIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, buffer);
    return buffer;
}
/**设定启用FIFO的加速度值
* @ 启用新FIFO的加速度启用参数
* @请参见getAccelFIFOEnabled()字段
* @请参见MPU6050_RA_FIFO_EN字段
*/
void MPU6050::setAccelFIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_ACCEL_FIFO_EN_BIT, enabled);
}
/** 获取Slave 2 FIFO的启用值
*当设置为1时,这一位点将与Slave 2 相连的EXT_SENS_DATA 寄存器 (寄存器 73到o寄存器96)写入FIFO缓冲中。
* @返回当前Slave 2 FIFO的启用值
* @请参见MPU6050_RA_FIFO_EN字段
*/
bool MPU6050::getSlave2FIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, buffer);
    return buffer;
}
/** 设定Slave 2 FIFO的启用值
* @新Slave 2 FIFO的启用参数
* @请参见getSlave2FIFOEnabled()字段
* @请参见MPU6050_RA_FIFO_EN字段
*/
void MPU6050::setSlave2FIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV2_FIFO_EN_BIT, enabled);
}
/** 获取Slave 1 FIFO的启用值
*当设置为1时,这一位点将与Slave 1 相连的EXT_SENS_DATA寄存器(寄存器73 到寄存器 96)写入FIFO缓冲中。
* @返回当前Slave 1 FIFO的启用值
* @请参见MPU6050_RA_FIFO_EN字段
*/
bool MPU6050::getSlave1FIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, buffer);
    return buffer;
}
/** 设定启用Slave 1 FIFO的值
* @ 新的Slave 1 FIFO启用参数
* @请参见getSlave1FIFOEnabled()字段
* @请参见MPU6050_RA_FIFO_EN字段
*/
void MPU6050::setSlave1FIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV1_FIFO_EN_BIT, enabled);
}
/** 获取Slave 0 FIFO的启用值
*当设置为1时,这一位点将与Slave0 相连的EXT_SENS_DATA寄存器(寄存器73 到寄存器 96)写入FIFO缓冲中。
* @返回当前Slave 0 FIFO的启用值
* @请参见MPU6050_RA_FIFO_EN字段
*/
bool MPU6050::getSlave0FIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, buffer);
    return buffer;
}
/** 设定Slave 0 FIFO的启用值
* @新Slave 0 FIFO的启用参数
* @请参见getSlave0FIFOEnabled()字段
* @请参见MPU6050_RA_FIFO_EN字段
*/
void MPU6050::setSlave0FIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_FIFO_EN, MPU6050_SLV0_FIFO_EN_BIT, enabled);
}

// I2C_MST_CTRL寄存器

/** 获取multi-master的启用值
* Multi-master功能允许在同一总线上使用多个I2C主机。在需要multi-master功能的电路中,将MULT_MST_EN设置为1。这将使电流增加约30 uA。
*
*在需要multi-master功能的电路中,I2C总线的状态由每个单独的I2C主机所决定。在一个I2C主机能够承担总线的仲裁之前,必须先确认没有其他I2C主机承担总线的仲裁。当MULT_MST_EN设置为1时,MPU-60X0的总线仲裁检测逻辑被打开,启用该检测逻辑来检测总线是否可用。
*
* @返回当前multi-master的启用值
* @请参见MPU6050_RA_I2C_MST_CTRL字段
*/
bool MPU6050::getMultiMasterEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, buffer);
    return buffer;
}
/**设定multi-master的启用值
* @新multi-master的启用参数
* @请参见getMultiMasterEnabled()字段
* @请参见MPU6050_RA_I2C_MST_CTRL字段
*/
void MPU6050::setMultiMasterEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_MULT_MST_EN_BIT, enabled);
}
/** 获取wait-for-external-sensor-data的启用值
* *当WAIT_FOR_ES位设置为1时,数据准备中断将会被推迟直到从Slave而得的外部传感器数据加载到EXT_SENS_DATA寄存器中。这是用来确保当数据准备中断被开启时,内部传感器数据(即陀螺仪和加速度传感器)和外部传感器数据都成功加载到各自的数据寄存器中(即数据同步完成)。
*
* @返回当前 wait-for-external-sensor-data 的启用值
* @请参见MPU6050_RA_I2C_MST_CTRL字段
*/
bool MPU6050::getWaitForExternalSensorEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, buffer);
    return buffer;
}
/** 设置wait-for-external-sensor-data的启用值.
* @新wait-for-external-sensor-data的启用参数
* @请参见getWaitForExternalSensorEnabled()字段
* @请参见MPU6050_RA_I2C_MST_CTRL字段
*/
void MPU6050::setWaitForExternalSensorEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_WAIT_FOR_ES_BIT, enabled);
}
/** 获取Slave 3 FIFO的启用值
* *当设置为1时,这一位点将与Slave3 相连的EXT_SENS_DATA寄存器(寄存器73 到寄存器 96)写入FIFO缓冲中。
* @返回当前启用Slave 3 FIFO的值
* @ 请参见MPU6050_RA_MST_CTRL字段
*/
bool MPU6050::getSlave3FIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, buffer);
    return buffer;
}
/** 设定Slave 3 FIFO的启用值
* @新Slave 3 FIFO的启用参数
* @请参见getSlave3FIFOEnabled()字段
* @请参见MPU6050_RA_MST_CTRL字段
*/
void MPU6050::setSlave3FIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_SLV_3_FIFO_EN_BIT, enabled);
}
/** 获取slave读/写转换的启用值
* I2C_MST_P_NSR位对I2C主机slave读取间的转变进行配置。如果该位等于0,将重新读取。如果该位等于1,下一个读取之前会有停顿。当一个读取转换为一个编写,通常在停顿后开始连续编写。
*
*@返回当前slave读/编转换的启用值
* @请参见MPU6050_RA_I2C_MST_CTRL字段
*/
bool MPU6050::getSlaveReadWriteTransitionEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, buffer);
    return buffer;
}
/** 设定slave读/编转换的启用值
*@新slave读/编转换的启用参数
* @请参见getSlaveReadWriteTransitionEnabled()字段
* @请参见 MPU6050_RA_I2C_MST_CTRL字段
*/
void MPU6050::setSlaveReadWriteTransitionEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_P_NSR_BIT, enabled);
}
/** 获取I2C主时钟速度。
* * I2C_MST_CLK是一个4位的无符号值,它用于对内部的频率为8MHz的时钟进行分频配置。它根据下表对I2C主时钟速度进行设置:
*
* <pre>
* I2C_MST_CLK | I2C 主时钟速度 | 8MHz 时钟分频器
* ------------+------------------------+-------------------
* 0         | 348kHz               | 23
* 1         | 333kHz               | 24
* 2         | 320kHz               | 25
* 3         | 308kHz               | 26
* 4         | 296kHz               | 27
* 5         | 286kHz               | 28
* 6         | 276kHz               | 29
* 7         | 267kHz               | 30
* 8         | 258kHz               | 31
* 9         | 500kHz               | 16
* 10          | 471kHz               | 17
* 11          | 444kHz               | 18
* 12          | 421kHz               | 19
* 13          | 400kHz               | 20
* 14          | 381kHz               | 21
* 15          | 364kHz               | 22
* </pre>
*
* @返回当前I2C 主时钟速度值
* @请参见MPU6050_RA_I2C_MST_CTRL字段
*/
uint8_t MPU6050::getMasterClockSpeed() {
    I2Cdev::readBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, buffer);
    return buffer;
}
/** 设定I2C 主时钟速度值
* @返回当前I2C 主时钟速度值
* @请参见MPU6050_RA_I2C_MST_CTRL字段
*/
void MPU6050::setMasterClockSpeed(uint8_t speed) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_MST_CTRL, MPU6050_I2C_MST_CLK_BIT, MPU6050_I2C_MST_CLK_LENGTH, speed);
}

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

/** 获取指定slave (0-3)的I2C地址
* 注意Bit 7 (MSB)控制了读/写模式。如果设置了Bit 7,那么这是一个读取操作,如果将其清除,那么这是一个编写操作。其余位(6-0)是slave设备的7-bit设备地址。
*
* 在读取模式中,读取结果是存储于最低可用的EXT_SENS_DATA寄存器中。更多读取结果分布信息,请参阅EXT_SENS_DATA寄存器的描述(寄存器 73 - 96)。
*
* MPU-6050支持全5个slave,但Slave 4有其特殊功能(getSlave4* 和setSlave4*)。
*
* 如寄存器25中所述,I2C数据转换通过采样率体现。用户负责确保I2C数据转换能够在一个采样率周期内完成。
*
* I2C slave数据传输速率可根据采样率来减小。减小的传输速率是由I2C_MST_DLY(寄存器52)所决定的。slave数据传输速率是否根据采样率来减小是由I2C_MST_DELAY_CTRL (寄存器103)所决定的。
*
* slave的处理指令是固定的。Slave的处理顺序是Slave 1, Slave 2, Slave 3 和 Slave 4。如果某一个Slave被禁用了,那么它会被自动忽略。
*
* 每个slave可按采样率或降低的采样率来读取。在有些slave以采样率读取有些以减小的采样率读取的情况下,slave的读取顺序依旧不变。然而,如果一些slave的读取速率不能在特定循环中进行读取,那么它们会被自动忽略。更多降低的读取速率相关信息,请参阅寄存器52。Slave是否按采样率或降低的采样率来读取由寄存器103得Delay Enable位来决定。
*
* @Slave 数 (0-3)参数
* @返回当前指定slave地址
* @请参见MPU6050_RA_I2C_SLV0_ADDR字段
*/
uint8_t MPU6050::getSlaveAddress(uint8_t num) {
    if (num > 3) return 0;
    I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num*3, buffer);
    return buffer;
}
/** 设定指定slave (0-3)的I2C 地址
* @Slave 数 (0-3)参数
* @指定slave的新地址参数
* @请参见getSlaveAddress()字段
* @请参见MPU6050_RA_I2C_SLV0_ADDR字段
*/
void MPU6050::setSlaveAddress(uint8_t num, uint8_t address) {
    if (num > 3) return;
    I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_ADDR + num*3, address);
}
/** 获取指定slave (0-3)的当前内部寄存器
* Slave的读/写操作适用于这个MPU寄存器,不管寄存器存储了什么地址。
*
* MPU-6050支持全5个slave,但Slave 4有其特殊功能。
*
* @Slave 数 (0-3)参数
* @返回指定slave的当前寄存器
* @请参见MPU6050_RA_I2C_SLV0_REG字段
*/
uint8_t MPU6050::getSlaveRegister(uint8_t num) {
    if (num > 3) return 0;
    I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num*3, buffer);
    return buffer;
}
/** 设定指定slave(0-3)的当前内部寄存器.
* @Slave 数 (0-3)参数
* @指定slave的新当前寄存器参数
* @请参见getSlaveRegister()字段
* @请参见 MPU6050_RA_I2C_SLV0_REG字段
*/
void MPU6050::setSlaveRegister(uint8_t num, uint8_t reg) {
    if (num > 3) return;
    I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_REG + num*3, reg);
}
/** 获取指定slave(0-3)的启用值
* 当设置为1时,这个位启用Slave 0数据传输操作。当设置为0时,这个位禁用了Slave 0数据传输操作。
* @ Slave 数 (0-3)参数
* @返回当前指定slave的启用值
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
bool MPU6050::getSlaveEnabled(uint8_t num) {
    if (num > 3) return 0;
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_EN_BIT, buffer);
    return buffer;
}
/** 设定指定slave(0-3)的启用值
* @ Slave 数 (0-3)参数
* @指定slave的启用参数
* 参见getSlaveEnabled()
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
void MPU6050::setSlaveEnabled(uint8_t num, bool enabled) {
    if (num > 3) return;
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_EN_BIT, enabled);
}
/** 启用指定slave的词对字节交换
* 当设置为1时,字节交换启用。当启用字节交换时,词对的高低字节即可交换。词对配对规律,请参考I2C_SLV0_GRP。为了进行字节交换,当设置为0时,由slave0交换而来的字节将被存储于EXT_SENS_DATA寄存器中。
*
* @ Slave 数 (0-3)参数
* @返回当前指定slave的词对字节交换启用值
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
bool MPU6050::getSlaveWordByteSwap(uint8_t num) {
    if (num > 3) return 0;
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_BYTE_SW_BIT, buffer);
    return buffer;
}
/** 设定指定slave(0-3)的词对字节交换.
*@ Slave 数 (0-3)参数
* @当前指定slave的词对字节交换启用参数
* @请参见getSlaveWordByteSwap()字段
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
void MPU6050::setSlaveWordByteSwap(uint8_t num, bool enabled) {
    if (num > 3) return;
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_BYTE_SW_BIT, enabled);
}
/**获取指定slave(0-3)的编写模式.
* 当设置为1时,只进行数据的读或写操作。当设置为0时,在读写数据之前将编写一个寄存器地址。当指定寄存器地址在slave设备中时,这应该等于0,而在该寄存器中会进行数据处理。
*
* @ Slave 数 (0-3)参数 (0-3)
* @返回当前指定slave的编写模式(0 = register address + data, 1 = data only)
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
bool MPU6050::getSlaveWriteMode(uint8_t num) {
    if (num > 3) return 0;
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_REG_DIS_BIT, buffer);
    return buffer;
}
/** 设定指定slave(0-3)的编写模式
* @ Slave 数 (0-3)参数
* @指定slave的新编写模式参数
* @请参见getSlaveWriteMode()字段
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
void MPU6050::setSlaveWriteMode(uint8_t num, bool mode) {
    if (num > 3) return;
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_REG_DIS_BIT, mode);
}
/** 获取指定slave(0-3)的词对分组顺序函数.
* 这确定了从寄存器接收到的指定词对分组顺序。当设置为0时,寄存器地址为0和1、2和3等(甚至是不成对的寄存器地址)的字节组成词对。当设置为1时,寄存器地址为1和2、3和4等(甚至是不成对的寄存器地址)的字节组成词对。
*
* @Slave 数 (0-3)参数
* @返回当前指定slave的词对分组顺序
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
bool MPU6050::getSlaveWordGroupOffset(uint8_t num) {
    if (num > 3) return 0;
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_GRP_BIT, buffer);
    return buffer;
}
/** 设定指定slave(0-3)的词对分组顺序函数.
* @Slave 数 (0-3)参数
* @指定slave新词对分组顺序的启用参数。
* @请参见getSlaveWordGroupOffset()字段
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
void MPU6050::setSlaveWordGroupOffset(uint8_t num, bool enabled) {
    if (num > 3) return;
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_GRP_BIT, enabled);
}
/**获取指定slave(0-3)读取的字节数
* 确定由Slave 0转换而来和转换至Slave 0的字节数。将此位清楚为0就相当于通过在I2C_SLV0_EN上编写0来禁用该寄存器。
* @Slave 数 (0-3)参数
* @返回指定slave读取的字节数
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
uint8_t MPU6050::getSlaveDataLength(uint8_t num) {
    if (num > 3) return 0;
    I2Cdev::readBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, buffer);
    return buffer;
}
/** 设定指定slave(0-3)读取的字节数
* @Slave 数 (0-3)参数
* @指定slave的字节数长度参数
* @请参见getSlaveDataLength()字段
* @请参见MPU6050_RA_I2C_SLV0_CTRL字段
*/
void MPU6050::setSlaveDataLength(uint8_t num, uint8_t length) {
    if (num > 3) return;
    I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_SLV0_CTRL + num*3, MPU6050_I2C_SLV_LEN_BIT, MPU6050_I2C_SLV_LEN_LENGTH, length);
}

// I2C_SLV*寄存器(Slave 4)

/** 获取指定slave4的I2C地址
* 注意Bit 7 (MSB)控制了读/写模式。如果设置了Bit 7,那么这是一个读取操作,如果将其清除,那么这是一个编写操作。其余位(6-0)是slave设备的7-bit设备地址。
*
* @返回当前slave4的地址
* @请参见getSlaveAddress()字段
* @ 请参见MPU6050_RA_I2C_SLV4_ADDR字段
*/
uint8_t MPU6050::getSlave4Address() {
    I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, buffer);
    return buffer;
}
/** 设定指定slave4的I2C地址
* @ slave4的新地址参数
* @请参见getSlave4Address()字段
* @请参见MPU6050_RA_I2C_SLV4_ADDR字段
*/
void MPU6050::setSlave4Address(uint8_t address) {
    I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_ADDR, address);
}
/** 获取slave4的当前内部寄存器
* Slave的读/写操作适用于这个MPU寄存器,不管寄存器存储了什么地址。
*
* @返回slave4的当前寄存器
* @请参见MPU6050_RA_I2C_SLV4_REG字段
*/
uint8_t MPU6050::getSlave4Register() {
    I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_REG, buffer);
    return buffer;
}
/** 设定slave4的当前内部寄存器
* @slave4当前寄存器的寄存参数
* @请参见getSlave4Register()字段
* @请参见MPU6050_RA_I2C_SLV4_REG字段
*/
void MPU6050::setSlave4Register(uint8_t reg) {
    I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_REG, reg);
}
/** 设定写于slave4的新字节
* 这一寄存器可储存写于slave4的数据。如果I2C_SLV4_RW设置为1(设置为读取模式),那么该寄存器无法执行操作。
* @写于slave4的新字节数据参数
* @ 请参见MPU6050_RA_I2C_SLV4_DO字段
*/
void MPU6050::setSlave4OutputByte(uint8_t data) {
    I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV4_DO, data);
}
/** 获取slave4的启用值
* 当设置为1时,此位启用了slave4的转换操作。当设置为0时,则禁用该操作。
* @返回当前slave4的启用值
* @请参见MPU6050_RA_I2C_SLV4_CTRL字段
*/
bool MPU6050::getSlave4Enabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, buffer);
    return buffer;
}
/** 设定slave4的启用值
* @slave4新启用参数
* @请参见getSlave4Enabled()字段
* @请参见MPU6050_RA_I2C_SLV4_CTRL字段
*/
void MPU6050::setSlave4Enabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_EN_BIT, enabled);
}
/** 获取slave4事务中断的启用值
* 当设置为1时,此位启用了slave4事务完成的中断信号的生成。当清除为0时,则禁用了该信号的生成。这一中断状态可在寄存器54中看到。
*
* @返回当前slave4事务中断的启用值
* @请参见MPU6050_RA_I2C_SLV4_CTRL字段
*/
bool MPU6050::getSlave4InterruptEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, buffer);
    return buffer;
}

tgyfish 发表于 2013-5-10 23:21:39

赞一个表示没看懂;P

pww999 发表于 2013-5-10 23:34:02

得闲及及 {:soso__10169062262133571330_1:}

烟鬼 发表于 2013-5-20 12:19:00

版主继续啊,等着看下文呢

oditszapc 发表于 2013-5-20 15:51:35

这个好。可以好好学习了

firewise 发表于 2013-5-20 18:12:33

支持支持。。。。加油

弘毅 发表于 2013-5-20 18:14:44

这个。。。这周把全部都整理好发出来。。。。

弘毅 发表于 2013-5-21 08:49:55

{:soso_e154:}本帖已经更新到600行。。。后面再开个新帖。。。一次发的太多后面写其他的也写不下了。。预计。。5贴发完。。

ranqingfa 发表于 2013-5-21 08:59:27

太好了,一直感觉没有把6050的性能充分放出来,就差这些库文件了,不过好像大陆版本的不支持融合吧,所以现在才这么便宜

yoyo383 发表于 2013-5-22 09:36:55

:D好,感谢分享

龙翔竞天 发表于 2013-5-22 11:30:45

好东西啊~这两天被这玩意折磨的死去活来

wunanyx 发表于 2013-5-23 08:36:47

汉化的60X0寄存器中文版介绍,那个pdf为啥链接指向有问题呢?:o

弘毅 发表于 2013-5-23 09:28:25

wunanyx 发表于 2013-5-23 08:36 static/image/common/back.gif
汉化的60X0寄存器中文版介绍,那个pdf为啥链接指向有问题呢?

额。。。。谢谢提醒。。。。现在已经修复。。

wunanyx 发表于 2013-5-23 10:42:08

弘毅 发表于 2013-5-23 09:28 static/image/common/back.gif
额。。。。谢谢提醒。。。。现在已经修复。。

老大真牛呀!!!!!!!!!!!

cyq456 发表于 2013-5-23 15:04:24

第67行是不是翻译错了?
页: [1] 2 3 4
查看完整版本: MPU6050.CPP核心代码注释翻译--01