[其他MCU] LPC54102的硬件I2C读取MPU6050

[复制链接]
 楼主| IversonCar 发表于 2015-12-16 20:04 | 显示全部楼层 |阅读模式
I2CInterIntegratedCircuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。
         对于早期的有些不支持硬件I2CMCU,那是采用软件的I2C,就是用软件模拟来实现I2C协议,关于I2C协议我这里就不多说了,这个网上有资料很多,大家自行搜索吧。现在几乎所有的MCU都带了硬件的I2C,也可以实现I2C中断或者I2C+DMA,可以看出硬件的I2C功能很强大。这样大大提高了效率。
         LPC541023I2C模块,分别是I2C0I2C1I2C2,今天我就用LPC54102提供的固件库实现硬件I2C0模块读取MPU6050,通过串口打印到超级终端上。

         首先我们要把管脚复用为I2CSCLSDAI2C0模块对应的管脚是PIO0_23PIO0_24。我使用固件库提供的Chip_IOCON_PinMuxSet函数进行配置,通过手册可以知道I2C0模块的管脚的位置和怎样配置,如下图:
代码如下:

 楼主| IversonCar 发表于 2015-12-16 20:05 | 显示全部楼层
  1. /*Connect the I2C_SDA and I2C_SCL signals to port pins */
  2.          Chip_IOCON_PinMuxSet(LPC_IOCON,0, 23, (IOCON_FUNC1 | IOCON_DIGITAL_EN));        /*I2C0 */
  3.          Chip_IOCON_PinMuxSet(LPC_IOCON,0, 24, (IOCON_FUNC1 | IOCON_DIGITAL_EN));        /*I2C0 */
  4. 然后要使能I2C0模块的时钟和复位:
  5.          Chip_Clock_EnablePeriphClock(LPC_I2CM_CLOCK);
  6.          Chip_SYSCON_PeriphReset(LPC_I2CM_RESET);
  7. 接下来就是I2C0参数的初始化:
  8.          /*Get needed size for driver context memory */
  9.          memSize= ROM_I2CM_GetMemSize();
  10.          if(memSize > sizeof(drvData)) {
  11.                    errorOut("Can'tallocate memory for I2C driver context\r\n");
  12.          }
  13.          devMem= drvData;         /* Or just usemalloc(memSize) */
  14.          /*Initialize driver */
  15.          i2cmInit.pUserData= NULL;
  16.          i2cmInit.base= (uint32_t) LPC_I2C_PORT;
  17.          i2cmHandle= ROM_I2CM_Init(devMem, &i2cmInit);
  18.          if(i2cmHandle == NULL) {
  19.                    /*Error initializing I2C */
  20.                    errorOut("Errorinitializing ROM\r\n");
  21.          }
  22.          /*Set I2C clock rate */
  23.          actualRate= ROM_I2CM_SetClockRate(i2cmHandle,
  24.                                                                                        Chip_Clock_GetAsyncSyscon_ClockRate(),I2C_BITRATE);
  25.          DEBUGOUT("ActualI2C master rate = %dHz\r\n", actualRate);
 楼主| IversonCar 发表于 2015-12-16 20:05 | 显示全部楼层
接着就是MPU6050的初始化:
  1. void MPU6050_Init(void)
  2. {
  3.          I2C_ByteWrite(MPU6050_SlaveAddress,PWR_MGMT_1,0x00);//½a3yDYÃß×′ì¬
  4.          //delay_ms(20);      
  5.          I2C_ByteWrite(MPU6050_SlaveAddress,SMPLRT_DIV,0x07);
  6.          //delay_ms(20);      
  7.          I2C_ByteWrite(MPU6050_SlaveAddress,MPU6050_CONFIG,0x06);
  8.          //delay_ms(20);      
  9.          I2C_ByteWrite(MPU6050_SlaveAddress,GYRO_CONFIG,0x08);//+-500¶è/Ãë
  10.          //delay_ms(20);      
  11.          I2C_ByteWrite(MPU6050_SlaveAddress,ACCEL_CONFIG,0x08);//+-4G
  12. }

这是我用板子上自带的串口通过仿真模块的虚拟串口把MPU6050读取到的6轴的数据打印到电脑的超级终端上:
通过串口打印出6个轴的数据和四元数合成的X,Y的角度。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

344

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

50

主题

344

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部