7048|17

1291

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

LPC54102的硬件I2C读取MPU6050 [复制链接]

 
         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模块的管脚的位置和怎样配置,如下图:
代码如下:
         /*Connect the 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 */
然后要使能I2C0模块的时钟和复位:
         Chip_Clock_EnablePeriphClock(LPC_I2CM_CLOCK);
         Chip_SYSCON_PeriphReset(LPC_I2CM_RESET);
接下来就是I2C0参数的初始化:
         /*Get needed size for driver context memory */
         memSize= ROM_I2CM_GetMemSize();
         if(memSize > sizeof(drvData)) {
                   errorOut("Can'tallocate memory for I2C driver context\r\n");
         }
         devMem= drvData;         /* Or just usemalloc(memSize) */
         /*Initialize driver */
         i2cmInit.pUserData= NULL;
         i2cmInit.base= (uint32_t) LPC_I2C_PORT;
         i2cmHandle= ROM_I2CM_Init(devMem, &i2cmInit);
         if(i2cmHandle == NULL) {
                   /*Error initializing I2C */
                   errorOut("Errorinitializing ROM\r\n");
         }
         /*Set I2C clock rate */
         actualRate= ROM_I2CM_SetClockRate(i2cmHandle,
                                                                                       Chip_Clock_GetAsyncSyscon_ClockRate(),I2C_BITRATE);
         DEBUGOUT("ActualI2C master rate = %dHz\r\n", actualRate);
接着就是MPU6050的初始化:
void MPU6050_Init(void)
{
         I2C_ByteWrite(MPU6050_SlaveAddress,PWR_MGMT_1,0x00);//½a3yDYÃß×′ì¬
         //delay_ms(20);      
         I2C_ByteWrite(MPU6050_SlaveAddress,SMPLRT_DIV,0x07);
         //delay_ms(20);      
         I2C_ByteWrite(MPU6050_SlaveAddress,MPU6050_CONFIG,0x06);
         //delay_ms(20);      
         I2C_ByteWrite(MPU6050_SlaveAddress,GYRO_CONFIG,0x08);//+-500¶è/Ãë
         //delay_ms(20);      
         I2C_ByteWrite(MPU6050_SlaveAddress,ACCEL_CONFIG,0x08);//+-4G
}

这是我用板子上自带的串口通过仿真模块的虚拟串口把MPU6050读取到的6轴的数据打印到电脑的超级终端上:
通过串口打印出6个轴的数据和四元数合成的X,Y的角度。
这是用逻辑仪抓取的波形:

MPU6050的初始化波形:
MPU6050的读取数据的波形:
详细的源代码可以下载附件,我已经把I2C的驱动封装好,可以移植到到其他的器件上。
附上源代码:
LPC54102的硬件I2C.zip (7.08 MB, 下载次数: 58, 售价: 2 分芯积分)

附件2个芯币,想赚点芯币
此帖出自NXP MCU论坛

最新回复

学习了  详情 回复 发表于 2019-10-9 09:53
点赞 关注
 

回复
举报

1403

帖子

1

TA的资源

纯净的硅(中级)

沙发
 
不错哈,我的也是用6050,顶一个~~
此帖出自NXP MCU论坛
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
shinykongcn 发表于 2015-3-2 12:05
不错哈,我的也是用6050,顶一个~~
我还要看看其他加速度的,选个功耗较低的



此帖出自NXP MCU论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
你好厉害
此帖出自NXP MCU论坛
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

5
 

多谢夸奖,我也就是根据自己所要实现的功能,调用了LPC的库而已
此帖出自NXP MCU论坛
 
 
 

回复

116

帖子

2

TA的资源

一粒金砂(中级)

6
 
请教
LPC54102的  P0_23~28是用于I2C或GPIO, 我的板子不需要I2C,想用它们作GPIO,调试发现这6个脚一直是0, 输入输出无效。
这是怎么回事?
默认状态应该是GPIO模式,怎么读写不了呢??
多谢指教!!
此帖出自NXP MCU论坛
 
个人签名熙熙攘攘的世界,我们不懈前行......
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

7
 
okwh 发表于 2015-11-4 12:14
请教
LPC54102的  P0_23~28是用于I2C或GPIO, 我的板子不需要I2C,想用它们作GPIO,调试发现这6个脚一直是 ...

GPIO要配置的,一般都是先根据你的需求配置成输入或者输出,然后也有设置上拉和下拉或者有的可以设置悬空,再就是你要要不要使用IO口中断。官方历程有的
此帖出自NXP MCU论坛
 
 
 

回复

116

帖子

2

TA的资源

一粒金砂(中级)

8
 
P0_23~28 无法设置上拉,需要外部上拉才能做IO
此帖出自NXP MCU论坛
 
个人签名熙熙攘攘的世界,我们不懈前行......
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

9
 
okwh 发表于 2016-1-13 10:37
P0_23~28 无法设置上拉,需要外部上拉才能做IO

这么坑,难道这是芯片的bug
此帖出自NXP MCU论坛
 
 
 

回复

116

帖子

2

TA的资源

一粒金砂(中级)

10
 
唉,这几个脚原设计用于I2C的,没有上拉,如果配置用于IO,就需外接上拉,说明书上倒是说了, 可谁注意说明书这几个脚特殊,以为不用其他,缺省自然就是DIO了。   只好改设计
此帖出自NXP MCU论坛
 
个人签名熙熙攘攘的世界,我们不懈前行......
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

11
 
okwh 发表于 2016-1-23 11:16
唉,这几个脚原设计用于I2C的,没有上拉,如果配置用于IO,就需外接上拉,说明书上倒是说了, 可谁注意说明 ...

这也是,这个很多人就很容易会认为带上拉的,有时候还要仔细看说明书
此帖出自NXP MCU论坛
 
 
 

回复

3

帖子

1

TA的资源

一粒金砂(初级)

12
 
你的驱动是一个字节一个字节读写么 如果数据量大  会不会效率不够
此帖出自NXP MCU论坛
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(初级)

13
 
谢谢分享。学习了。辛苦楼主了。
此帖出自NXP MCU论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
学习了
此帖出自NXP MCU论坛
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

15
 
1238 发表于 2019-5-17 07:43 谢谢分享。学习了。辛苦楼主了。

谢谢支持

此帖出自NXP MCU论坛
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

16
 

谢谢支持

此帖出自NXP MCU论坛
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

17
 

谢谢夸奖

此帖出自NXP MCU论坛
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

18
 
SHASHAsha 发表于 2019-5-16 11:03 你的驱动是一个字节一个字节读写么 如果数据量大 会不会效率不够

就读一个传感器还好,可以连续都几个字节,这样处理就快了

此帖出自NXP MCU论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表