[原创] 【LPC54100】+MPU6050 IIC程序设计和调试结果

youzizhile   2015-5-15 14:24 楼主
     自从上次发布mpu6050iic总线模拟程序设计已经有很长时间了,期间总是杂七杂八的事情,忙的一塌糊涂。眼看着lpc54102开发板活动要结束了,赶紧抓紧时间来分享这款优秀开发板的使用心得。
1      MPU6050介绍:
      MPU-6050为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了大量的包装空间。MPU-6050的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的IIC。MPU-6050可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VVDIO供电为1.8V± 5%(MPU6000仅用VDD)。MPU-6050的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。
       mpu6050器件框图.png


MPU6050器件框图
mpu6050做iic控制器件框图.png
MPU6050控制第三方的器件
2      LPC54102官方iic驱动说明:2.1  HW_I2CMD_ROM_API.H》文件
/** @brief I2C master ROM indirect function structure */
typedef PRE_PACK struct POST_PACK {
       uint32_t(*GetMemSize)(void); /*!< Returnsneeded memory size required for run-time context of I2C master driver */
       ROM_I2CM_HANDLE_T(*Init)(void *mem, const ROM_I2CM_INIT_T *pInit);      /*!< Initializes the I2C master driver and peripheral */
       uint32_t (*SetClockRate)(ROM_I2CM_HANDLE_TpHandle, uint32_t inRate, uint32_t i2cRate);        /*!
       void(*RegisterCallback)(ROM_I2CM_HANDLE_T pHandle, uint32_t cbIndex, void *pCB);    /*!< Registers an I2C master callback */
       ErrorCode_t(*Transfer)(ROM_I2CM_HANDLE_T pHandle, ROM_I2CM_XFER_T *pXfer);            /*!< Perform or start and I2Cmaster transfer */
       void(*TransferHandler)(ROM_I2CM_HANDLE_T pHandle);        /*!
       uint32_t(*GetDriverVersion)(void);
} ROM_I2CMD_API_T;
2.1.1  定义的ROM_I2CM_XFER_T
typedef PRE_PACK struct POST_PACK {
       constvoid              *txBuff;    /*!< Pointer to array of bytes to betransmitted */
       void                    *rxBuff;  /*!< Pointer memory where bytes receivedfrom I2C be stored */
       volatileErrorCode_t    status;        /*!< Packed status of the current I2Ctransfer (ErrorCode_t), must be 32-bits */
       uint32_t                flags;              /*!< Optional transfer flags */
       uint16_t                txSz;              /*!< Number of bytes in transmit array, if 0 only receivetransfer will be performed */
       uint16_t                rxSz;              /*!< Number of bytes to receive, if 0 onlytransmission we be performed */
       uint16_t                slaveAddr;      /*!< 7-bit I2C Slave address */
       uint16_t                reserved; /*!< Reserved for alignment */
} ROM_I2CM_XFER_T;
/** I2C master callback IDs */
typedef enum {
       ROM_I2CM_DATACOMPLETE_CB= 0,            /*!< Callback ID forI2C master data transfer complete */
       ROM_I2CM_DATATRANSMITSTART_CB,        /*!< Callback ID for I2C mastertransmit start */
       ROM_I2CM_DATATRECEIVESTART_CB          /*!< Callback ID for I2C masterreceive start */
} ROM_I2CM_CALLBACK_T;
2.2  ROMAPI_I2CM.H》文件说明:
/**
* @brief   Get memory size in bytes needed for I2Cmaster driver context
* @return Size in bytes needed for the ROM driver
*/
uint32_t ROM_I2CM_GetMemSize(void);
/**
* @brief   InitializeI2C master peripheral
* @param mem          : Pointer to memory area used todriver context
* @param pInit    : Pointer to I2C master init data
* @return NULLon error, or a pointer to the device context handle
*/
ROM_I2CM_HANDLE_T ROM_I2CM_Init(void *mem, constROM_I2CM_INIT_T *pInit);
/**
* @brief   SetI2C master clock rate
* @param pHandle     : Pointer to driver context handle
* @param inRate  : Base clock rate for the I2C peripheral in Hz
* @param i2cRate : Desired I2C master clock rate
* @return ActualI2C master clock rate
*/
uint32_t ROM_I2CM_SetClockRate(ROM_I2CM_HANDLE_TpHandle, uint32_t inRate, uint32_t i2cRate);
/**
* @brief   Registera I2C master callback
* @param pHandle     : Pointer to driver context handle
* @param cbIndex      : Callback to register
* @param pCB           : Pointer to callback function
* @return Nothing
*/
void ROM_I2CM_RegisterCallback(ROM_I2CM_HANDLE_TpHandle, ROM_I2CM_CALLBACK_T cbIndex, void *pCB);
/**
* @brief   Starta I2C master transfer
* @param pHandle     : Pointer to driver context handle
* @param pXfer    : Pointer to master transfer configuration
* @return Errorcode
* @note   Thisfunction starts the transfer and returns immediately.
*/
ErrorCode_t ROM_I2CM_Transfer(ROM_I2CM_HANDLE_TpHandle, ROM_I2CM_XFER_T *pXfer);
/**
* @brief   I2Cmaster transfer (interrupt) handler
* @param pHandle     : Pointer to driver context handle
* @return Nothing
* @note   Thisfunction should be called from the I2C interrupt handler and
* is used in interrupt and DMA modes.
*/
void ROM_I2CM_TransferHandler(ROM_I2CM_HANDLE_TpHandle);
/**
* @brief   Returnthe I2C master ROM driver version
* @return Driverversion number
* @note   Thereturned driver version number consists of a major and minor
* number, with the minor number in the lower 8bits and the major number in
* the upper 8 bits.
*/
uint16_t ROM_I2CM_GetDriverVersion(void);
2.3  其他程序说明:2.3.1  PIN脚设置:
/* Initializes pin muxing for I2C interface - notethat SystemInit() may
   already setupyour pin muxing at system startup */
static void Init_I2C_PinMux(void)
{
#if defined(BOARD_NXP_LPCXPRESSO_54102)
      /* Connectthe I2C_SDA and I2C_SCL signals to port pins */
      Chip_IOCON_PinMuxSet(LPC_IOCON,0, 23, (IOCON_FUNC1 | IOCON_DIGITAL_EN)); /*I2C0 */
      Chip_IOCON_PinMuxSet(LPC_IOCON,0, 24, (IOCON_FUNC1 | IOCON_DIGITAL_EN)); /*I2C0 */
#else
      /*Configure your own I2C pin muxing here if needed */
#warning "No I2C pin muxing defined"
#endif
}
2.3.2  定义数据类型
/* Made global so data can be seen in the debuuger */
uint8_t rx[10], tx[4];
ROM_I2CM_XFER_T mXfer;
volatile bool done;
uint32_t actualRate;
2.3.3  数据传输:
      /* Writeaddress (2), read 8 bytes back, no flags */
           mXfer.slaveAddr= I2C_ADDR_7BIT;
           tx[0]= 2;
           mXfer.txBuff= tx;
           mXfer.rxBuff= rx;
           mXfer.txSz= 1;
           mXfer.rxSz= 8;
           mXfer.flags= 0;
           /*Start transfer */
           done =false;
           ROM_I2CM_Transfer(i2cmHandle,&mXfer);
2.4  MPU6050程序设计:
//****************************************
//定义mpu6050内部地址
//****************************************
#define     SMPLRT_DIV             0x19 //陀螺仪采样率,典型值0x07(125Hz)
#define     CONFIG                      0x1A         //低通滤波频率,典型值0x06(5Hz)
#define     GYRO_CONFIG                  0x1B//陀螺仪自检及测量范围,典型值:0x18
#define     ACCEL_CONFIG        0x1C         //
#define     ACCEL_XOUT_H       0x3B
#define     ACCEL_XOUT_L        0x3C
#define     ACCEL_YOUT_H       0x3D
#define     ACCEL_YOUT_L        0x3E
#define     ACCEL_ZOUT_H       0x3F
#define     ACCEL_ZOUT_L        0x40
#define     TEMP_OUT_H          0x41
#define     TEMP_OUT_L           0x42
#define     GYRO_XOUT_H        0x43
#define     GYRO_XOUT_L                  0x44
#define     GYRO_YOUT_H        0x45
#define     GYRO_YOUT_L                  0x46
#define     GYRO_ZOUT_H        0x47
#define     GYRO_ZOUT_L                  0x48
#define     PWR_MGMT_1        0x6B         //电源管理
#define     WHO_AM_I                        0x75 //IIC寄存器地址,默认参数0x75
#define     SlaveAddress   0x68 //IIC地址
2.4.1  I2C_ByteWrite
void I2C_ByteWrite(uint8_tSlaveAddress,uint8_t REG_Address,uint8_t REG_data)
{
     /* Write address, write 1 btye, read 8 bytes back */
                   mXfer.slaveAddr= SlaveAddress;
                   tx[0]= REG_Address;
                   tx[1]= REG_data;
                   mXfer.txBuff= tx;
                   mXfer.rxBuff= rx;
                   mXfer.txSz= 2;
                   mXfer.rxSz= 0;
                   /*I2C master driver will block if blocking flag is used */
         mXfer.flags= ROM_I2CM_FLAG_BLOCKING;
         /*Start transfer and wait for completion */
ROM_I2CM_Transfer(i2cmHandle,&mXfer);  
}
2.4.2  I2C_ByteRead
uint8_t I2C_ByteRead(uint8_tSlaveAddress,uint8_t REG_Address)
{
         uint8_tREG_data;
/* Write address, write 1 btye, read 8bytes back */
mXfer.slaveAddr = SlaveAddress;
tx[0] = REG_Address;
mXfer.txBuff = tx;
mXfer.rxBuff = rx;
mXfer.txSz = 1;
mXfer.rxSz = 1;
/* I2C master driver will block if blockingflag is used */
         mXfer.flags= ROM_I2CM_FLAG_BLOCKING;
/* Start transfer and wait for completion*/
ROM_I2CM_Transfer(i2cmHandle, &mXfer);
REG_data = rx[0];
return REG_data ;
}
算法程序参考@强子00001的分享,在此就不在多说了。谢谢@强子00001的分享。

以下是四元结算的资料:

基于四元数方法的姿态解算.doc (179 KB)
(下载次数: 6, 2015-5-15 13:54 上传)

最后的调试结果:
mpu6050结果.png
我的其他心得贴:
5.【LPC54100】+MPU6050 IIC总线模拟程序设计 https://bbs.eeworld.com.cn/thread-458842-1-4.html
4.【LPC54100】+步进电机+lCD1602+MPU6050接口电路图 https://bbs.eeworld.com.cn/thread-458066-1-2.html
3. LPC54100】+LCD1602驱动程序设计 https://bbs.eeworld.com.cn/thread-458026-1-1.html
2.【LPC54100】+LPC54102的电流消耗测量电路分析  https://bbs.eeworld.com.cn/thread-458024-1-1.html
1.【LPC54100】+LPC54102开发板初试用  https://bbs.eeworld.com.cn/thread-457205-1-2.html

每一刻都是崭新的,加油!

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复