极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 41774|回复: 18

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

[复制链接]
发表于 2013-5-22 21:54:06 | 显示全部楼层 |阅读模式
本帖最后由 弘毅 于 2013-5-22 22:02 编辑

这个是MPU6050.CPP核心代码翻译的第二部分,第一部分代码贴出来1003行,第二篇从1004行开始~~

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

[pre lang="arduino" line="1004"]/** 设定slave4事务中断的启用值
* @slave4事务中断的新启用值参数
* @ 请参见getSlave4InterruptEnabled()字段
* @ 请参见MPU6050_RA_I2C_SLV4_CTRL字段
*/
void MPU6050::setSlave4InterruptEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_INT_EN_BIT, enabled);
}
/** 获取指定slave4的编写模式
* 当设置为1时,只进行数据的读或写操作。当设置为0时,在读写数据之前将编写一个寄存器地址。当指定寄存器地址在slave设备中时,这应该等于0,而在该寄存器中会进行数据处理。
*
* @返回当前slave4的编写模式(0 = register address + data, 1 = data only)
* @请参见MPU6050_RA_I2C_SLV4_CTRL字段
*/
bool MPU6050::getSlave4WriteMode() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, buffer);
    return buffer[0];
}
/** 设定指定slave4的编写模式
* @Slave 4新编写模式参数 (0 = register address + data, 1 = data only)
* @请参见getSlave4WriteMode()字段
* @请参见 MPU6050_RA_I2C_SLV4_CTRL字段
*/
void MPU6050::setSlave4WriteMode(bool mode) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_REG_DIS_BIT, mode);
}
/** 获取slave4的主延迟值
* 这为根据采样率减小的I2C slaves传输速率进行了配置。当一个slave的传输速率是根据采样率而降低的,那么该slave是以每1 / (1 + I2C_MST_DLY) 个样本进行传输。
*
* 这一基本的采样率也是由SMPLRT_DIV (寄存器 25)和DLPF_CFG (寄存器26)所决定的的。slave传输速率是否根据采样率来减小是由I2C_MST_DELAY_CTRL (寄存器103)所决定的。更多采样率相关信息,请参阅寄存器25.
*
* @返回当前slave4的主延迟值
* @请参见MPU6050_RA_I2C_SLV4_CTRL
*/
uint8_t MPU6050::getSlave4MasterDelay() {
    I2Cdev::readBits(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT, MPU6050_I2C_SLV4_MST_DLY_LENGTH, buffer);
    return buffer[0];
}
/**设定slave4的主延迟值
* @slave4主延迟值参数
* @请参见getSlave4MasterDelay()字段
* @请参见MPU6050_RA_I2C_SLV4_CTRL字段
*/
void MPU6050::setSlave4MasterDelay(uint8_t delay) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_I2C_SLV4_CTRL, MPU6050_I2C_SLV4_MST_DLY_BIT, MPU6050_I2C_SLV4_MST_DLY_LENGTH, delay);
}
/** 获取slave4中可读取的最后可用字节。
* 这一寄存器储存了slave4中读取的数据。读取事务完成后即填充了该字段。
* @return Last available byte read from to Slave 4
* @请参见MPU6050_RA_I2C_SLV4_DI字段
*/
uint8_t MPU6050::getSlate4InputByte() {
    I2Cdev::readByte(devAddr, MPU6050_RA_I2C_SLV4_DI, buffer);
    return buffer[0];
}

// I2C_MST_STATUS寄存器

/**获取FSYNC中断状态
* 此位反映了一个与MPU-60X0相连的外部设备的FSYNC中断状态。这一方法用于通过MPU-60X0对主机应用程序处理器进行外部中断的传输。当设置为1且在INT_PIN_CFG(寄存器55)中断言FSYNC_INT_EN时,中断产生。.
* @return FSYNC interrupt status
* @请参见 MPU6050_RA_I2C_MST_STATUS字段
*/
bool MPU6050::getPassthroughStatus() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_PASS_THROUGH_BIT, buffer);
    return buffer[0];
}
/** 获取slave4事务完成状态
* 当slave4事务完成时,设备会自动设置为1.如果断言了INT_ENABLE 寄存器(寄存器56) 中的I2C_MST_INT_EN或在I2C_SLV4_CTRL寄存器(寄存器52)中断言SLV_4_DONE_INT,则中断产生。.
* @return Slave 4 transaction done status
* @请参见 MPU6050_RA_I2C_MST_STATUS字段
*/
bool MPU6050::getSlave4IsDone() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_DONE_BIT, buffer);
    return buffer[0];
}
/** 获取失去主仲裁状态
* 当I2C主机失去辅助I2C总线(一个错误状态)的仲裁,此位自动设置为1.如果断言了INT_ENABLE寄存器(寄存器56)中的I2C_MST_INT_EN位,则中断产生
* @返回主机失去仲裁状态
* @请参见MPU6050_RA_I2C_MST_STATUS字段
*/
bool MPU6050::getLostArbitration() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_LOST_ARB_BIT, buffer);
    return buffer[0];
}
/** 获取slave4的NACK状态
* 当I2C主机接受了Slave 4的一个NACK事务,此位自动设置为1.如果断言了INT_ENABLE寄存器(寄存器56)中的I2C_MST_INT_EN位,中断产生。
* @返回Slave 4 NACK中断状态
* @请参见MPU6050_RA_I2C_MST_STATUS字段
*/
bool MPU6050::getSlave4Nack() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV4_NACK_BIT, buffer);
    return buffer[0];
}
/** 获取slave3的NACK状态
* 当I2C主机接受了Slave 3的一个NACK事务,此位自动设置为1.如果断言了INT_ENABLE寄存器(寄存器56)中的I2C_MST_INT_EN位,中断产生。
* @返回Slave3 NACK中断状态
* @请参见MPU6050_RA_I2C_MST_STATUS字段
*/
bool MPU6050::getSlave3Nack() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV3_NACK_BIT, buffer);
    return buffer[0];
}
/**获取slave2的NACK状态
* 当I2C主机接受了Slave 2的一个NACK事务,此位自动设置为1.如果断言了INT_ENABLE寄存器(寄存器56)中的I2C_MST_INT_EN位,中断产生。
* @返回Slave 2 NACK中断状态
* @请参见MPU6050_RA_I2C_MST_STATUS字段
*/
bool MPU6050::getSlave2Nack() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV2_NACK_BIT, buffer);
    return buffer[0];
}
/** 获取slave1的NACK状态
* 当I2C主机接受了Slave 1的一个NACK事务,此位自动设置为1.如果断言了INT_ENABLE寄存器(寄存器56)中的I2C_MST_INT_EN位,中断产生。
* @返回Slave 1 NACK中断状态
* @请参见MPU6050_RA_I2C_MST_STATUS字段
*/
bool MPU6050::getSlave1Nack() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV1_NACK_BIT, buffer);
    return buffer[0];
}
/** 获取slave0的NACK状态
* 当I2C主机接受了Slave 0的一个NACK事务,此位自动设置为1.如果断言了INT_ENABLE寄存器(寄存器56)中的I2C_MST_INT_EN位,中断产生。
* @返回Slave0 NACK中断状态
* @请参见MPU6050_RA_I2C_MST_STATUS字段
*/
bool MPU6050::getSlave0Nack() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_STATUS, MPU6050_MST_I2C_SLV0_NACK_BIT, buffer);
    return buffer[0];
}

// INT_PIN_CFG寄存器

/** 获取中断的逻辑电平模式
* 高电平时,设置为0;低电平时,设置为1
* @返回当前中断模式(0=active-high, 1=active-low)
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_INT_LEVEL_BIT字段
*/
bool MPU6050::getInterruptMode() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, buffer);
    return buffer[0];
}
/** 设置中断的逻辑电平模式
* @新中断模式参数(0=active-high, 1=active-low)
* @请参见getInterruptMode()字段
*@请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_INT_LEVEL_BIT字段
*/
void MPU6050::setInterruptMode(bool mode) {
   I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, mode);
}
/**获取中断驱动模式
* 推拉模式设置为0,开漏模式设置为1.
* @返回当前中断驱动模式(0=push-pull, 1=open-drain)
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_INT_OPEN_BIT字段
*/
bool MPU6050::getInterruptDrive() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, buffer);
    return buffer[0];
}
/** 设置中断驱动模式
* @新中断驱动参数(0=push-pull, 1=open-drain)
* @请参见getInterruptDrive()字段
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_INT_OPEN_BIT字段
*/
void MPU6050::setInterruptDrive(bool drive) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, drive);
}
/** 获取中断锁存模式.
* 50us-pulse模式设置为0,latch-until-int-cleared模式设置为1.
* @返回当前锁存模式(0=50us-pulse, 1=latch-until-int-cleared)
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_LATCH_INT_EN_BIT字段
*/
bool MPU6050::getInterruptLatch() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, buffer);
    return buffer[0];
}
/** 设定中断锁存模式
* @新锁存模式锁存参数(0=50us-pulse, 1=latch-until-int-cleared)
* @请参见getInterruptLatch()字段
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_LATCH_INT_EN_BIT字段
*/
void MPU6050::setInterruptLatch(bool latch) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, latch);
}
/**获取中断锁存清除模式
* status-read-only状态设置为0,any-register-read状态设置为1.
* @返回当前锁存清除模式(0=status-read-only, 1=any-register-read)
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_INT_RD_CLEAR_BIT字段
*/
bool MPU6050::getInterruptLatchClear() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, buffer);
    return buffer[0];
}
/** 设定中断锁存清除模式
* @新中断锁存清除参数
* @请参见getInterruptLatchClear()字段
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_INT_RD_CLEAR_BIT字段
*/
void MPU6050::setInterruptLatchClear(bool clear) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, clear);
}
/** 获取FSYNC中断逻辑电平模式
* @返回当前FSYNC中断模式(0=active-high, 1=active-low)
* @请参见getFSyncInterruptMode()字段
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT字段
*/
bool MPU6050::getFSyncInterruptLevel() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, buffer);
    return buffer[0];
}
/** 设定FSYNC中断逻辑电平模式
* @新FSYNC中断模式参数(0=active-high, 1=active-low)
* @请参见getFSyncInterruptMode()字段
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT字段
*/
void MPU6050::setFSyncInterruptLevel(bool level) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT, level);
}
/** 获取FSYNC端口中断启用设置
* 设置为0时禁用,设置为1时启用。
* @返回当前中断启用设置
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_FSYNC_INT_EN_BIT字段 */
bool MPU6050::getFSyncInterruptEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, buffer);
    return buffer[0];
}
/** 设定FSYNC端口中断启用设置
* @FSYNC端口中断启用设置参数
* @请参见getFSyncInterruptEnabled()字段
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_FSYNC_INT_EN_BIT字段 */
void MPU6050::setFSyncInterruptEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_FSYNC_INT_EN_BIT, enabled);
}
/** 获取I2C支路启用状态
* 当此位等于1且I2C_MST_EN (寄存器 106 位[5])等于0时,主机应用程序处理器能够直接访问MPU-60X0的辅助I2C总线。当此位等于0时,不管I2C_MST_EN (寄存器 106 位[5])状态如何,主机应用程序处理器都不能直接访问MPU-60X0的辅助I2C总线。
* @返回当前I2C支路启用状态
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_I2C_BYPASS_EN_BIT字段
*/
bool MPU6050::getI2CBypassEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, buffer);
    return buffer[0];
}
/** 设定I2C支路启用状态
* 当此位等于1且I2C_MST_EN (寄存器 106 位[5])等于0时,主机应用程序处理器能够直接访问MPU-60X0的辅助I2C总线。当此位等于0时,不管I2C_MST_EN (寄存器 106 位[5])状态如何,主机应用程序处理器都不能直接访问MPU-60X0的辅助I2C总线。
* @新I2C支路启用状态参数
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_I2C_BYPASS_EN_BIT字段
*/
void MPU6050::setI2CBypassEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
}
/** 获取参考时钟输出启用状态
* 当此位为1时,CLKOUT端口可以输出参考时钟。当此位为0时,输出禁用。更多CLKOUT端口相关信息,请参阅MPU-60X0产品规格文件。
* @返回当前参考时钟输出启用状态
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_CLKOUT_EN_BIT字段
*/
bool MPU6050::getClockOutputEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, buffer);
    return buffer[0];
}
/** 设定参考时钟输出启用状态
* 当此位为1时,CLKOUT端口可以输出参考时钟。当此位为0时,输出禁用。更多CLKOUT端口相关信息,请参阅MPU-60X0产品规格文件。
* @新参考时钟输出状态启用参数
* @请参见MPU6050_RA_INT_PIN_CFG字段
* @请参见MPU6050_INTCFG_CLKOUT_EN_BIT字段
*/
void MPU6050::setClockOutputEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_CLKOUT_EN_BIT, enabled);
}

// INT_ENABLE寄存器

/** 获取完全中断启用状态
* 寄存器的所有字节都中断,利于快速读取。禁用时每一位都设为0,启用则为1.
* @返回当前中断启用状态
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_FF_BIT 字段
  **/
uint8_t MPU6050::getIntEnabled() {
    I2Cdev::readByte(devAddr, MPU6050_RA_INT_ENABLE, buffer);
    return buffer[0];
}
/** 设定完全中断启用状态
* 寄存器的所有字节都中断,利于快速读取。禁用时每一位都设为0,启用则为1.
* @新中断状态启用参数
* @请参见getIntFreefallEnabled()字段
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_FF_BIT 字段
**/
void MPU6050::setIntEnabled(uint8_t enabled) {
    I2Cdev::writeByte(devAddr, MPU6050_RA_INT_ENABLE, enabled);
}
/** 获取自由落体中断启用状态。
* 禁用时设为0,启用则为1
* @返回当前中断启用状态
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_FF_BIT字段
**/
bool MPU6050::getIntFreefallEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, buffer);
    return buffer[0];
}
/** 设定自由落体中断启用状态。
* @新中断状态启用参数
* @请参见getIntFreefallEnabled()字段
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_FF_BIT字段
**/
void MPU6050::setIntFreefallEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FF_BIT, enabled);
}
/** 获取运动检测中断启用状态
* 禁用时设为0,启用则为1
* @返回当前中断启用状态
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_MOT_BIT字段
**/
bool MPU6050::getIntMotionEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, buffer);
    return buffer[0];
}
/** 设定运动检测中断启用状态
* @新中断状态启用参数
* @请参见getIntMotionEnabled()字段
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_MOT_BIT字段
**/
void MPU6050::setIntMotionEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_MOT_BIT, enabled);
}
/** 获取零运动检测中断启用状态
* 禁用时设为0,启用则为1
* @返回当前中断启用状态
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_ZMOT_BIT字段
**/
bool MPU6050::getIntZeroMotionEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, buffer);
    return buffer[0];
}
/** 设定零运动检测中断启用状态
* @新中断状态启用参数
* @请参见getIntZeroMotionEnabled()字段
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_ZMOT_BIT字段
**/
void MPU6050::setIntZeroMotionEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_ZMOT_BIT, enabled);
}
/** 获取FIFO缓冲区溢出中断启用状态
* 禁用时设为0,启用则为1
* @返回当前中断启用状态
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_FIFO_OFLOW_BIT字段
**/
bool MPU6050::getIntFIFOBufferOverflowEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer);
    return buffer[0];
}
/** 设定FIFO缓冲区溢出中断启用状态
* @新中断状态启用参数
* @请参见getIntFIFOBufferOverflowEnabled()字段
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_FIFO_OFLOW_BIT字段
**/
void MPU6050::setIntFIFOBufferOverflowEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, enabled);
}
/** 获取I2C主机中断启用状态
* 这使得任一I2C主机的中断源产生中断。禁用时设为0,启用则为1
* @返回当前中断启用状态
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_I2C_MST_INT_BIT字段
**/
bool MPU6050::getIntI2CMasterEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer);
    return buffer[0];
}
/** 设定I2C主机中断启用状态
* @新中断状态启用参数
* @请参见getIntI2CMasterEnabled()字段
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_I2C_MST_INT_BIT字段
**/
void MPU6050::setIntI2CMasterEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_I2C_MST_INT_BIT, enabled);
}
/** 获取数据准备中断启用设置。
* 当所有传感器寄存器的编写操作完成时即可产生中断。禁用时设为0,启用则为1
* @返回当前中断启用状态
* @请参见MPU6050_RA_INT_ENABLE字段
* @请参见MPU6050_INTERRUPT_DATA_RDY_BIT字段
*/
bool MPU6050::getIntDataReadyEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer);
    return buffer[0];
}
/** 设定数据准备中断启用状态
* @新中断启用状态参数
* @请参见getIntDataReadyEnabled()字段
* @请参见MPU6050_RA_INT_CFG字段
* @请参见MPU6050_INTERRUPT_DATA_RDY_BIT字段
*/
void MPU6050::setIntDataReadyEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, enabled);
}

// INT_STATUS寄存器

/** 获取全套中断状态位
* 寄存器读取之后,这些位都清除为0。为了读取所有字节,每一个单独的位都清楚地读取所有状态位,因此这对获取多个INT状态非常有用。
* @return Current interrupt status
* @请参见MPU6050_RA_INT_STATUS字段
*/
uint8_t MPU6050::getIntStatus() {
    I2Cdev::readByte(devAddr, MPU6050_RA_INT_STATUS, buffer);
    return buffer[0];
}
/** 获取自由落体中断状态
* 当自由落体中断产生时,此位自动设为1.存储器读取之后则清除为0.
* @返回当前中断状态
* @请参见MPU6050_RA_INT_STATUS字段
* @请参见MPU6050_INTERRUPT_FF_BIT字段
*/
bool MPU6050::getIntFreefallStatus() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FF_BIT, buffer);
    return buffer[0];
}
/** 获取运动检测中断状态
* 当运动检测中断产生时,此位自动设为1.存储器读取之后则清除为0..
* @返回当前中断状态
* @请参见MPU6050_RA_INT_STATUS字段
* @请参见MPU6050_INTERRUPT_MOT_BIT字段
*/
bool MPU6050::getIntMotionStatus() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_MOT_BIT, buffer);
    return buffer[0];
}
/** 获取零运动检测中断状态
* 当零运动检测中断产生时,此位自动设为1.存储器读取之后则清除为0.
* @返回当前中断状态
* @请参见MPU6050_RA_INT_STATUS字段
* @请参见MPU6050_INTERRUPT_ZMOT_BIT字段
*/
bool MPU6050::getIntZeroMotionStatus() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_ZMOT_BIT, buffer);
    return buffer[0];
}
/** 获取FIFO缓冲区溢出中断启用状态
* 当自由落体中断产生时,此位自动设为1.存储器读取之后则清除为0.
* @返回当前中断状态
* @请参见MPU6050_RA_INT_STATUS字段
* @请参见MPU6050_INTERRUPT_FIFO_OFLOW_BIT字段
*/
bool MPU6050::getIntFIFOBufferOverflowStatus() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_FIFO_OFLOW_BIT, buffer);
    return buffer[0];
}
/** 获取I2C主机中断状态
* 当I2C主机中断产生时,此位自动设为1.存储器读取之后则清除为0. I2C主机中断列表,请参阅寄存器54.
*@返回当前中断状态
* @请参见MPU6050_RA_INT_STATUS字段
* @请参见MPU6050_INTERRUPT_I2C_MST_INT_BIT字段
*/
bool MPU6050::getIntI2CMasterStatus() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_I2C_MST_INT_BIT, buffer);
    return buffer[0];
}
/** 获取数据准备中断状态
* 当数据准备中断产生时,此位自动设为1.存储器读取之后则清除为0.
* @返回当前中断状态
* @请参见MPU6050_RA_INT_STATUS字段
* @请参见MPU6050_INTERRUPT_DATA_RDY_BIT字段
*/
bool MPU6050::getIntDataReadyStatus() {
    I2Cdev::readBit(devAddr, MPU6050_RA_INT_STATUS, MPU6050_INTERRUPT_DATA_RDY_BIT, buffer);
    return buffer[0];
}

// ACCEL_*OUT_*寄存器

/** 获取未经处理的运动传感器的9轴读数(加速度传感器 /陀螺仪/罗盘)。
* 功能还未完全实现
* @加速度传感器X 轴的16位带符号整数容器的ax参数
* @加速度传感器Y 轴的16位带符号整数容器的ay参数
* @加速度传感器Z 轴的16位带符号整数容器的az参数
* @陀螺仪X 轴的16位带符号整数容器的gx参数
* @陀螺仪Y 轴的16位带符号整数容器的gy参数
* @陀螺仪Z 轴的16位带符号整数容器的gz参数
* @地磁仪X 轴的16位带符号整数容器的mx参数
* @地磁仪Y轴的16位带符号整数容器的my参数
* @地磁仪Z 轴的16位带符号整数容器的mz参数
* @请参见getMotion6()字段
* @请参见getAcceleration()字段
* @请参见getRotation()字段
* @请参见MPU6050_RA_ACCEL_XOUT_H字段
*/
void MPU6050::getMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* mx, int16_t* my, int16_t* mz) {
    getMotion6(ax, ay, az, gx, gy, gz);
    // TODO: magnetometer integration
}
/** 获取未经处理的运动传感器的6轴读数(加速度传感器 /陀螺仪6)。
* 获取所有当前可用的运动传感器的值。
* @加速度传感器X 轴的16位带符号整数容器的ax参数
* @加速度传感器Y 轴的16位带符号整数容器的ay参数
* @加速度传感器Z 轴的16位带符号整数容器的az参数
* @陀螺仪X 轴的16位带符号整数容器的gx参数
* @陀螺仪Y 轴的16位带符号整数容器的gy参数
* @陀螺仪Z 轴的16位带符号整数容器的gz参数
* @see getAcceleration()
* @see getRotation()
* @see MPU6050_RA_ACCEL_XOUT_H
*/
void MPU6050::getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz) {
    I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 14, buffer);
    *ax = (((int16_t)buffer[0]) << 8) | buffer[1];
    *ay = (((int16_t)buffer[2]) << 8) | buffer[3];
    *az = (((int16_t)buffer[4]) << 8) | buffer[5];
    *gx = (((int16_t)buffer[8]) << 8) | buffer[9];
    *gy = (((int16_t)buffer[10]) << 8) | buffer[11];
    *gz = (((int16_t)buffer[12]) << 8) | buffer[13];
}
/**获取加速度传感器的3轴读数
* 这些寄存器存储了最近的加速度测量。加速度测量将被写入寄存器25中所定义的采样率中。
*
* 加速度测量寄存器、温度测量寄存器、陀螺仪测量寄存器、和外部传感器数据寄存器都是由由两组寄存器组成的,即一个内部寄存器组和一个面向用户的读取寄存器组。
*
* 加速度传感器的内部寄存器组经常进行采样率的数据更新。与此同时, 只要串行接口是空闲的,面向用户的读取寄存器组就会复制内部寄存器组的数据值。这可以保证多个传感器寄存器会读取同一采样时刻的测量值。注意,如果不使用资料组的读取,用户负责检查数据准备中断来确保一组单个字节的读取对应于一个采样时刻。
*
* ACCEL_FS (寄存器 28)中定义,每一16位的加速度测量都有一个全量程范围。每一个全量程的设置,即在ACCEL_xOUT中每LSB的加速度传感器的灵敏度如下表所示:
*
* <pre>
* AFS_SEL |     全量程范围   | LSB 灵敏度
* --------+------------------+----------------
* 0       | +/- 2g           | 8192 LSB/mg
* 1       | +/- 4g           | 4096 LSB/mg
* 2       | +/- 8g           | 2048 LSB/mg
* 3       | +/- 16g          | 1024 LSB/mg
* </pre>
*
* @加速度传感器X 轴的16位带符号整数容器的ax参数
* @加速度传感器Y 轴的16位带符号整数容器的ay参数
* @加速度传感器Z 轴的16位带符号整数容器的az参数
* @请参见MPU6050_RA_GYRO_XOUT_H字段
*/
void MPU6050::getAcceleration(int16_t* x, int16_t* y, int16_t* z) {
    I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 6, buffer);
    *x = (((int16_t)buffer[0]) << 8) | buffer[1];
    *y = (((int16_t)buffer[2]) << 8) | buffer[3];
    *z = (((int16_t)buffer[4]) << 8) | buffer[5];
}
/** 获取加速度传感器X轴的读数
* @返回x轴加速度测量在16位2的补码格式
* @请参见getMotion6()字段
* @请参见MPU6050_RA_ACCEL_XOUT_H字段
*/
int16_t MPU6050::getAccelerationX() {
    I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 2, buffer);
    return (((int16_t)buffer[0]) << 8) | buffer[1];
}
/** 获取加速度传感器Y轴的读数
* @返回Y轴加速度测量在16位2的补码格式
* @请参见getMotion6()字段
* @请参见MPU6050_RA_ACCEL_YOUT_H字段
*/
int16_t MPU6050::getAccelerationY() {
    I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_YOUT_H, 2, buffer);
    return (((int16_t)buffer[0]) << 8) | buffer[1];
}
/** 获取加速度传感器Z轴的读数
* @返回Z轴加速度测量在16位2的补码格式
* @请参见getMotion6()字段
* @请参见MPU6050_RA_ACCEL_ZOUT_H字段
*/
int16_t MPU6050::getAccelerationZ() {
    I2Cdev::readBytes(devAddr, MPU6050_RA_ACCEL_ZOUT_H, 2, buffer);
    return (((int16_t)buffer[0]) << 8) | buffer[1];
}

// TEMP_OUT_*寄存器

/** 获取当前内部温度
* @返回温度读数在16位2的补码格式
* @请参见MPU6050_RA_TEMP_OUT_H字段
*/
int16_t MPU6050::getTemperature() {
    I2Cdev::readBytes(devAddr, MPU6050_RA_TEMP_OUT_H, 2, buffer);
    return (((int16_t)buffer[0]) << 8) | buffer[1];
}

// GYRO_*OUT_*寄存器

/** 获取陀螺仪的3轴读数
* 陀螺仪测量寄存器、加速度测量寄存器、温度测量寄存器、和外部传感器数据寄存器都是由由两组寄存器组成的,即一个内部寄存器组和一个面向用户的读取寄存器组。.
* 陀螺仪的内部寄存器组经常进行采样率的数据更新。与此同时, 只要串行接口是空闲的,面向用户的读取寄存器组就会复制内部寄存器组的数据值。这可以保证多个传感器寄存器会读取同一采样时刻的测量值。注意,如果不使用资料组的读取,用户负责检查数据准备中断来确保一组单个字节的读取对应于一个采样时刻。.
*
* FS_SEL (寄存器 27)中定义,每一16位的陀螺仪测量都有一个全量程范围。每一个全量程的设置,即在GYRO_xOUT中每LSB的加陀螺仪灵敏度如下表所示:
*
* <pre>
* FS_SEL |      全量程范围    | LSB灵敏度
* -------+--------------------+----------------
* 0      | +/- 250 度/秒      | 131 LSB/度/秒
* 1      | +/- 500 度/秒      | 65.5 LSB/度/秒
* 2      | +/- 1000 度/秒     | 32.8 LSB/度/秒
* 3      | +/- 2000 度/秒     | 16.4 LSB/度/秒
* </pre>
*
* @ X 轴旋转的16位带符号整数容器的X 轴参数
* @ Y 轴旋转的16位带符号整数容器的Y 轴参数
* @ Z 轴旋转的16位带符号整数容器的Z 轴参数
* @请参见getMotion6()字段
*@请参见MPU6050_RA_GYRO_XOUT_H字段
*/
void MPU6050::getRotation(int16_t* x, int16_t* y, int16_t* z) {
    I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_XOUT_H, 6, buffer);
    *x = (((int16_t)buffer[0]) << 8) | buffer[1];
    *y = (((int16_t)buffer[2]) << 8) | buffer[3];
    *z = (((int16_t)buffer[4]) << 8) | buffer[5];
}
/** 获取陀螺仪X轴的读数
* @返回X轴旋转测量在16位2的补码格式
* @请参见getMotion6()字段
* @请参见MPU6050_RA_GYRO_XOUT_H字段
*/
int16_t MPU6050::getRotationX() {
    I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_XOUT_H, 2, buffer);
    return (((int16_t)buffer[0]) << 8) | buffer[1];
}
/** 获取陀螺仪Y轴的读数
* @返回Y轴旋转测量在16位2的补码格式
* @请参见getMotion6()字段
* @请参见MPU6050_RA_GYRO_YOUT_H字段
*/
int16_t MPU6050::getRotationY() {
    I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_YOUT_H, 2, buffer);
    return (((int16_t)buffer[0]) << 8) | buffer[1];
}
/** 获取陀螺仪Z轴的读数
* @返回Z轴旋转测量在16位2的补码格式
* @请参见getMotion6()字段
* @请参见MPU6050_RA_GYRO_ZOUT_H字段
*/
int16_t MPU6050::getRotationZ() {
    I2Cdev::readBytes(devAddr, MPU6050_RA_GYRO_ZOUT_H, 2, buffer);
    return (((int16_t)buffer[0]) << 8) | buffer[1];
}

//EXT_SENS_DATA_*寄存器

/** 从外部传感器数据寄存器中读取单个字节。
* 这些寄存器存储由外部传感器在辅助I2C接口上通过Slave 0、1、2和3读取而来的数据,。由Slave 4读取而来的数据存储在I2C_SLV4_DI (寄存器53)中。
*
* 外部传感器数据将被写入寄存器25定义的采样率中。通过使用Slave Delay Enable寄存器 (寄存器 103)将传输速率减小。
*
* 外部传感器数据寄存器、陀螺仪测量寄存器、加速度测量寄存器和温度测量寄存器都是由由两组寄存器组成的,即一个内部寄存器组和一个面向用户的读取寄存器组。
*
* 只要串行接口是空闲的,外部传感器数据寄存器的内部寄存器组就会经常进行采样率(或减小的传输速率)的数据更新。这可以保证多个传感器寄存器会读取同一采样时刻的测量值。注意,如果不使用资料组的读取,用户负责检查数据准备中断来确保一组单个字节的读取对应于一个采样时刻。.
*
* 根据I2C_SLV0_CTRL, I2C_SLV1_CTRL, I2C_SLV2_CTRL, 和 I2C_SLV3_CTRL (传感器 39, 42, 45, 和 48),数据储存于外部传感器数据寄存器中。当启用的slave (I2C_SLVx_EN = 1)读取到多于零个的字节(I2C_SLVx_LEN > 0),slave就能在采样率(寄存器25所定义的)或延迟率(可能在寄存器52和103中提及)中读取。在每一个采样周期中,slave读取都是在slave数量的指令下进行。如果所有的slave都能读取到多于零个的字节,那么指令将是Slave 0, 接着是 Slave 1, Slave 2, 和 Slave 3.
*
* 以EXT_SENS_DATA_00为开始,在slave数量的指令下,通过读取到的字节数(I2C_SLVx_LEN),每个启用的slave都会有EXT_SENS_DATA寄存器与其相连。注意,这意味着启用或禁用一个slave会改变与较高编号相连的寄存器。此外,如果由于这样的一个改变导致从外部传感器中读取到更少的字节总数,那么寄存器中保留的数据将不会再有原分配的与其相连的寄存器设备,除非将系统重置。
*
* 如果所有SLVx事务的长度和超过可用的EXT_SENS_DATA寄存器,多余的字节将被撤销。EXT_SENS_DATA寄存器有24个,因此所有slave之间的读取总长度不能超过24,否则一些字节将会丢失。
*
* 注意:slave4的特性与Slaves 0-3不同,更多slave4的相关特性,请参阅寄存器49至53.
*
* 例如:
* 假设,为了使I2C_SLV1_EN = 1且 I2C_SLV1_LEN = 2,通过读取4个字节可启用Slave 0 (I2C_SLV0_EN = 1且 I2C_SLV0_LEN = 4),那么只需读取2个字节即可启用slave1。在这一情况下, EXT_SENS_DATA _00和_03 将与 Slave 0相连,而EXT_SENS_DATA _04 和 05将与 Slave 1相连。如果slave2也被启用,那么从EXT_SENS_DATA_06开始的寄存器将会被分配给slave2.
*
* 如果在同样的情况下,Slave 2禁用而Slave 3启用了,那么从EXT_SENS_DATA_06开始的寄存器会被分配给Slave 3。
*
* 动态禁用的寄存器分配与正常禁用的比较:
* 如果在任意时刻禁用slave, EXT_SENS_DATA寄存器中最初分配给这个slave的空间依旧会与此slave相连。这是为了避免寄存器分配的动态变化。
*
* 只有当(1)所有slave都禁用或者(2) 设置了I2C_MST_RST 位(寄存器106)时,才会重新计算EXT_SENS_DATA寄存器的分配情况。
*
* 如果其中一个slave收到否定回答或停止运行,上述情况也正确。
*
* @初始位置参数(0-23)
* @返回从寄存器上读取的字节
*/
uint8_t MPU6050::getExternalSensorByte(int position) {
    I2Cdev::readByte(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, buffer);
    return buffer[0];
}
/** 从外部传感器数据寄存器中读取子(2字节)。
* @初始位置参数(0-21)
* @返回从寄存器上读取的字
* @请参见getExternalSensorByte()字段
*/
uint16_t MPU6050::getExternalSensorWord(int position) {
    I2Cdev::readBytes(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 2, buffer);
    return (((uint16_t)buffer[0]) << 8) | buffer[1];
}
/** 从外部传感器数据寄存器中读取双子(4字节)。
* @初始位置参数(0-20)
* @返回从寄存器上读取的双字
* @请参见getExternalSensorByte()字段
*/
uint32_t MPU6050::getExternalSensorDWord(int position) {
    I2Cdev::readBytes(devAddr, MPU6050_RA_EXT_SENS_DATA_00 + position, 4, buffer);
    return (((uint32_t)buffer[0]) << 24) | (((uint32_t)buffer[1]) << 16) | (((uint16_t)buffer[2]) << 8) | buffer[3];
}

// MOT_DETECT_STATUS寄存器

/** 获取x轴反向运动检测中断状态
* @返回运动检测状态
* @请参见MPU6050_RA_MOT_DETECT_STATUS字段
* @请参见MPU6050_MOTION_MOT_XNEG_BIT字段
*/
bool MPU6050::getXNegMotionDetected() {
    I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XNEG_BIT, buffer);
    return buffer[0];
}
/** 获取x轴正向运动检测中断状态
* @返回运动检测状态
* @请参见MPU6050_RA_MOT_DETECT_STATUS字段
* @请参见MPU6050_MOTION_MOT_XPOS_BIT字段
*/
bool MPU6050::getXPosMotionDetected() {
    I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_XPOS_BIT, buffer);
    return buffer[0];
}
/** 获取Y轴反向运动检测中断状态
* @返回运动检测状态
* @请参见MPU6050_RA_MOT_DETECT_STATUS字段
* @请参见MPU6050_MOTION_MOT_YNEG_BIT字段
*/
bool MPU6050::getYNegMotionDetected() {
    I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YNEG_BIT, buffer);
    return buffer[0];
}
/** 获取Y轴正向运动检测中断状态
* @返回运动检测状态
*@请参见MPU6050_RA_MOT_DETECT_STATUS字段
* @请参见MPU6050_MOTION_MOT_YPOS_BIT字段

*/
bool MPU6050::getYPosMotionDetected() {
    I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_YPOS_BIT, buffer);
    return buffer[0];
}
/** 获取Z轴反向运动检测中断状态
* @返回运动检测状态
* @请参见MPU6050_RA_MOT_DETECT_STATUS字段
* @请参见MPU6050_MOTION_MOT_ZNEG_BIT字段
*/
bool MPU6050::getZNegMotionDetected() {
    I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZNEG_BIT, buffer);
    return buffer[0];
}
/** 获取Z轴正向运动检测中断状态
* @返回运动检测状态
*@请参见MPU6050_RA_MOT_DETECT_STATUS字段
* @请参见MPU6050_MOTION_MOT_ZPOS_BIT字段
*/
bool MPU6050::getZPosMotionDetected() {
    I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZPOS_BIT, buffer);
    return buffer[0];
}
/** 获取零运动检测中断状态
* @返回运动检测状态
* @请参见MPU6050_RA_MOT_DETECT_STATUS字段
* @请参见MPU6050_MOTION_MOT_ZRMOT_BIT字段
*/
bool MPU6050::getZeroMotionDetected() {
    I2Cdev::readBit(devAddr, MPU6050_RA_MOT_DETECT_STATUS, MPU6050_MOTION_MOT_ZRMOT_BIT, buffer);
    return buffer[0];
}

// I2C_SLV*_DO寄存器

/** 为指定slave的数据输出容器编写字节。
* 当slave设置为编写模式时,这一寄存器将输出的数据写入slave中。更多slave控制的相关信息,请参阅寄存器37至39。
* @ Slave 数量参数 (0-3)
* @编写字节的数据参数
* @请参见MPU6050_RA_I2C_SLV0_DO字段
*/
void MPU6050::setSlaveOutputByte(uint8_t num, uint8_t data) {
    if (num > 3) return;
    I2Cdev::writeByte(devAddr, MPU6050_RA_I2C_SLV0_DO + num, data);
}

// I2C_MST_DELAY_CTRL寄存器

/** 获取外部数据影子延迟启用状态
* 这个寄存器用于指定外部传感器数据影子的时间。当DELAY_ES_SHADOW设置为1,跟随外部传感器数据影子将会延迟到所有的数据接收完毕。
* @返回当前外部数据影子延迟启用状态
* @请参见MPU6050_RA_I2C_MST_DELAY_CTRL字段
* @请参见MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT字段
*/
bool MPU6050::getExternalShadowDelayEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, buffer);
    return buffer[0];
}
/** 设定外部数据影子延迟启用状态
* @新外部数据影子延迟状态启用参数.
* @请参见getExternalShadowDelayEnabled()字段
* @请参见MPU6050_RA_I2C_MST_DELAY_CTRL字段
* @请参见MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT字段
*/
void MPU6050::setExternalShadowDelayEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT, enabled);
}
/** 获取slave延迟启用状态
* 当启用了某一特定的slave,其传输速率就会减小。当一个slave的传输速率是根据采样率而降低的,那么该slave是以每1 / (1 + I2C_MST_DLY) 个样本进行传输。
*
*     1 / (1 + I2C_MST_DLY) Samples
*
* 这一基本的采样率也是由SMPLRT_DIV (寄存器 25)和DLPF_CFG (寄存器26)所决定的的。
*
* 更多I2C_MST_DLY的相关信息,请参阅寄存器52.
* 更多采样率相关信息,请参阅寄存器25.
*
* @ Slave数量参数 (0-4)
* @返回当前slave延迟启用状态.
* @请参见MPU6050_RA_I2C_MST_DELAY_CTRL字段
* @请参见MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT字段
*/
bool MPU6050::getSlaveDelayEnabled(uint8_t num) {
    // MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT is 4, SLV3 is 3, etc.
    if (num > 4) return 0;
    I2Cdev::readBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, buffer);
    return buffer[0];
}
/** 设定slave延迟启用状态
* @ Slave数量参数 (0-4)
* @新slave延迟状态启用参数.
* @请参见MPU6050_RA_I2C_MST_DELAY_CTRL字段
* @请参见MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT字段
*/
void MPU6050::setSlaveDelayEnabled(uint8_t num, bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_I2C_MST_DELAY_CTRL, num, enabled);
}

// SIGNAL_PATH_RESET寄存器

/** 重置陀螺仪的信号路径
* 重置通过数字转换器和过滤器将模拟的信号路径恢复到他们启动时的配置。
* @请参见MPU6050_RA_SIGNAL_PATH_RESET字段
* @请参见MPU6050_PATHRESET_GYRO_RESET_BIT字段
*/
void MPU6050::resetGyroscopePath() {
    I2Cdev::writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_GYRO_RESET_BIT, true);
}
/** 重置加速度传感器的信号路径
* 重置通过数字转换器和过滤器将模拟的信号路径恢复到他们启动时的配置。
* @请参见MPU6050_RA_SIGNAL_PATH_RESET字段
* @请参见MPU6050_PATHRESET_ACCEL_RESET_BIT字段
*/
void MPU6050::resetAccelerometerPath() {
    I2Cdev::writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_ACCEL_RESET_BIT, true);
}
/** 重置温度传感器的信号路径
* 重置通过数字转换器和过滤器将模拟的信号路径恢复到他们启动时的配置。
* @请参见MPU6050_RA_SIGNAL_PATH_RESET字段
* @请参见MPU6050_PATHRESET_TEMP_RESET_BIT字段
*/
void MPU6050::resetTemperaturePath() {
    I2Cdev::writeBit(devAddr, MPU6050_RA_SIGNAL_PATH_RESET, MPU6050_PATHRESET_TEMP_RESET_BIT, true);
}

// MOT_DETECT_CTRL寄存器

/** 获取加速度传感器启动延迟
* 加速度传感器数据路径为传感器寄存器、运动检测、零运动检测和自由落体检测模块提供样本。在检测模块开始操作之前,包含过滤器的信号路径必须用新样本来启用。默认的4毫秒唤醒延迟时间可以加长3毫秒以上。在ACCEL_ON_DELAY中规定,这个延迟以1 LSB = 1 毫秒为单位。除非InvenSense另行指示,用户可以选择任何大于零的值。更多检测模块信息,请参阅MPU-6000/MPU-6050产品规格文的第8部分。
*/
uint8_t MPU6050::getAccelerometerPowerOnDelay() {
    I2Cdev::readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT, MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, buffer);
    return buffer[0];
}
/** 设定加速度传感器启动延迟
* @新加速度传感器延迟的启动参数
* @请参见getAccelerometerPowerOnDelay()字段
* @请参见MPU6050_RA_MOT_DETECT_CTRL字段
* @请参见MPU6050_DETECT_ACCEL_ON_DELAY_BIT字段
*/
void MPU6050::setAccelerometerPowerOnDelay(uint8_t delay) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_ACCEL_ON_DELAY_BIT, MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH, delay);
}
/** 获取自由落体检测计数器的减量配置。
* 当指定数量的样本的加速度测量都满足其各自的阈值条件时,检测结果存储于自由落体检测模块中。当满足阈值条件时,相应的检测计数器递增1。用户可通过FF_COUNT配置不满足阈值条件来减量。减量率可根据下表进行设置:
*
* <pre>
* FF_COUNT | 计数器减量
* ---------+------------------
* 0        | 重置
* 1        | 1
* 2        | 2
* 3        | 4
* </pre>
*
* 当FF_COUNT配置为0(复位)时,任何不合格的样品都将计数器重置为0。更多自由落体检测信息,请参阅寄存器29至32.
*
* @返回当前的减量配置
* @请参见MPU6050_RA_MOT_DETECT_CTRL字段
* @请参见MPU6050_DETECT_FF_COUNT_BIT字段
*/
uint8_t MPU6050::getFreefallDetectionCounterDecrement() {
    I2Cdev::readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT, MPU6050_DETECT_FF_COUNT_LENGTH, buffer);
    return buffer[0];
}
/** 设定自由落体检测计数器的减量配置。
* @新减量配置值的减量参数
* @请参见getFreefallDetectionCounterDecrement()字段
* @请参见MPU6050_RA_MOT_DETECT_CTRL字段
* @请参见MPU6050_DETECT_FF_COUNT_BIT字段
*/
void MPU6050::setFreefallDetectionCounterDecrement(uint8_t decrement) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_FF_COUNT_BIT, MPU6050_DETECT_FF_COUNT_LENGTH, decrement);
}
/** 获取运动检测计数器的减量配置。
* 当指定数量的样本的加速度测量都满足其各自的阈值条件时,检测结果存储于运动检测模块中。当满足阈值条件时,相应的检测计数器递增1。用户可通过MOT_COUNT配置不满足阈值条件来减量。减量率可根据下表进行设置:
*
* <pre>
* MOT_COUNT | 计数器减量
* ----------+------------------
* 0         | 重置
* 1         | 1
* 2         | 2
* 3         | 4
* </pre>
*
* 当MOT_COUNT配置为0(复位)时,任何不合格的样品都将计数器重置为0。更多运动检测信息,请参阅寄存器29至32.
*
*/
uint8_t MPU6050::getMotionDetectionCounterDecrement() {
    I2Cdev::readBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT, MPU6050_DETECT_MOT_COUNT_LENGTH, buffer);
    return buffer[0];
}
/** 设定运动检测计数器的减量配置。
* @新减量配置值的减量参数
* @请参见getMotionDetectionCounterDecrement()字段
* @请参见MPU6050_RA_MOT_DETECT_CTRL字段
* @请参见MPU6050_DETECT_MOT_COUNT_BIT字段
*/
void MPU6050::setMotionDetectionCounterDecrement(uint8_t decrement) {
    I2Cdev::writeBits(devAddr, MPU6050_RA_MOT_DETECT_CTRL, MPU6050_DETECT_MOT_COUNT_BIT, MPU6050_DETECT_MOT_COUNT_LENGTH, decrement);
}

// USER_CTRL寄存器

/** 获取FIFO启用状态
* 当此位设置为0,FIFO缓冲是禁用的。当禁用FIFO缓冲时,FIFO缓冲区的不能进行编写或读取操作。FIFO缓冲状态不会改变,除非重启MPU-60X0。
* @返回当前FIFO启用状态
* @请参见MPU6050_RA_USER_CTRL字段
* @请参见MPU6050_USERCTRL_FIFO_EN_BIT字段
*/
bool MPU6050::getFIFOEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, buffer);
    return buffer[0];
}
/** 设定FIFO启用状态
* @新FIFO启用状态参数
* @请参见getFIFOEnabled()字段
* @请参见MPU6050_RA_USER_CTRL字段
* @请参见MPU6050_USERCTRL_FIFO_EN_BIT字段
*/
void MPU6050::setFIFOEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_FIFO_EN_BIT, enabled);
}
/**获取I2C主模式启用状态
* 当这个模式被启用,MPU-60X0即成为辅助I2C总线上的外部传感器slave设备的I2C主机。当此位被清除为0时,辅助I2C总线线路(AUX_DA and AUX_CL)理论上是由I2C总线(SDA和SCL)驱动的。这是启用旁路模式的一个前提。更多旁路模式信息,请参阅寄存器55。
* @返回当前I2C主模式启用状态
* @请参见MPU6050_RA_USER_CTRL字段
* @请参见MPU6050_USERCTRL_I2C_MST_EN_BIT字段
*/
bool MPU6050::getI2CMasterModeEnabled() {
    I2Cdev::readBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, buffer);
    return buffer[0];
}
/** 设定I2C主模式启用状态
*@新I2C主模式状态启用参数
*@请参见getI2CMasterModeEnabled()字段
*@请参见MPU6050_RA_USER_CTRL字段
*@请参见MPU6050_USERCTRL_I2C_MST_EN_BIT字段
*/
void MPU6050::setI2CMasterModeEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled);
}
/** I2C转换至SPI模式(只允许MPU-6000)
* 如果设置成功,主SPI接口将被启用从而代替了禁用的主I2C接口.
*/
void MPU6050::switchSPIEnabled(bool enabled) {
    I2Cdev::writeBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_IF_DIS_BIT, enabled);
}[/code]
回复

使用道具 举报

发表于 2013-5-22 23:10:28 | 显示全部楼层
请问如何让arduino直接获得四元数啊??
回复 支持 反对

使用道具 举报

发表于 2013-5-23 11:15:49 | 显示全部楼层
让我怎么感谢你。。弘毅大哥。。每到关键时刻你就弄出我需要的东西
回复 支持 反对

使用道具 举报

发表于 2013-5-23 12:53:44 | 显示全部楼层
有用的资料,先点个位。。。。。
回复 支持 反对

使用道具 举报

发表于 2013-9-6 10:37:54 | 显示全部楼层
这么好的东西,不顶是禽兽
回复 支持 反对

使用道具 举报

发表于 2014-3-29 22:48:42 | 显示全部楼层
这是好的东西,应该点赞!!!
回复 支持 反对

使用道具 举报

发表于 2014-4-20 10:56:44 | 显示全部楼层
弘毅同志真是一个好同志!
回复 支持 反对

使用道具 举报

发表于 2014-7-11 19:03:59 | 显示全部楼层
代码这么长慢慢啃吧。
回复 支持 反对

使用道具 举报

发表于 2014-7-12 10:40:27 | 显示全部楼层
非常感谢弘毅大哥了
回复 支持 反对

使用道具 举报

发表于 2014-10-8 14:20:12 | 显示全部楼层
好资料呀!
回复 支持 反对

使用道具 举报

发表于 2014-12-5 16:24:45 | 显示全部楼层
超級頂
回复 支持 反对

使用道具 举报

发表于 2014-12-7 13:38:38 | 显示全部楼层
果断收!!!
回复 支持 反对

使用道具 举报

发表于 2015-2-1 11:24:58 | 显示全部楼层
頂,跟隨中.
回复 支持 反对

使用道具 举报

发表于 2015-4-2 20:27:40 | 显示全部楼层
感激
回复 支持 反对

使用道具 举报

发表于 2015-4-18 11:59:57 | 显示全部楼层
谢谢{:soso_e183:}
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 19:06 , Processed in 0.064646 second(s), 36 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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