打印
[8/16-bit MCU]

【LPC54100】 I2C 读写MPU6050

[复制链接]
1046|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
史迪威将军|  楼主 | 2015-12-22 20:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
时间过的好快的说~~转眼距离上个帖子都快一个月了!哎,惭愧啊,给力的论坛,终于拿到官方版的板子,可以跨平台使用LPCXpresso了,之前由于LPCXpresso不支持Jlink调试,所有万坑板只能在windows下面玩,终于从坑里跳出来了!
I2C(Inter-Integrated Circuit)总线是两线式串行总线,由philips公司开发,(nxp出自philips,自家技术)仅有两根线就可以通信,一根时钟SCL,用于同步,一根数据SDA,用于传输数据。

从机地址分为7位和10位,平时使用较多的位7bit的地址。I2C通信是双向的,由主机控制,数据传输采用高位在前(MSB)的方式,即先传送高位地址数据。

I2C通信分为读和写,读写控制由地址位后的1bit控制,为0时表示发送(写),1时表示接收(读)。以MPU6050的7bit地址0x68为例(MPU6050可以设置两种地址,由pin9控制,低为0x68;高为0x69)。
0x68 = 110 1000
如果加1bit读写位可以组成8bit刚好一个字节(byte)的数据,有人因此使用一个8位的地址来进行数据传送,这样的好处时只需写一个数据传输方法即可,通过不同的地址来实现读写操作。

相关帖子

沙发
史迪威将军|  楼主 | 2015-12-22 20:24 | 只看该作者
接下来连接mpu6050,这里有一点小风波,我直接使用两端都是母口的杜邦线,所有就使用FTDI口的VCC给mpu6050供电(对了,前几天感谢@nmg和另外一位坛友,我换到来官方板子,哈哈~~各位表打我,小得瑟。。)结果发现mpu6050的指示灯只亮了一点点,感觉电压不够,以为mpu模块坏了,后来换到之前买的ble开发板上面,发现好的,才怀疑时电压问题,于是重新找vcc,最后选了J7插座的+5.0接口,就好了!MPU6050的SCL ,SDA分别接LPC54102的J3口的9,10。
MPU的读写寄存器操作步骤为:寄存器地址->读写数据,这里我们需要做的就是通过I2C发送一个自己数据117,然后读取一个字节数据,再验证读取回来的数据是否正确即可。

然后就是Lu代码了,虽然有坛友已经使用硬件I2C完成了MPU6050的操作,但还是决定按自己的路子来一遍,不然就只能做“大自然的搬运工了”。开发环境使用LPCXpresso,挺好用的,跨平台,还有Free版本可以用,我喜欢~~

使用特权

评论回复
板凳
史迪威将军|  楼主 | 2015-12-22 20:25 | 只看该作者
直接简单复制rom_i2cm_polling工程,使用同步阻塞方式操作I2C,刚开始,就不讲究了,怎么简单怎么来。。

看MPU手册,MPU6050使用400kbit/s的速率,跟例程中一致,无需更改,重新 #define MPU_ADDR 0x68 一个i2c从机地址。

开始验证I2C通信是否正常,方法为读取MPU6050的WHO_AM_I寄存器(117),默认应返回0x68.

例程只需做少许修改即可
/* Write address, write 1 btye, read 8 bytes back */
                mXfer.slaveAddr = I2C_ADDR_7BIT; // 0x68
#define MPUADDR_WHO_AM_I 117
                tx[0] = MPUADDR_WHO_AM_I;
                mXfer.txBuff = tx;
                mXfer.rxBuff = rx;
                mXfer.txSz = 1;
                mXfer.rxSz = 1; //  1 byte!!!

                /* 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);

使用特权

评论回复
地板
史迪威将军|  楼主 | 2015-12-22 20:25 | 只看该作者
            /* Check status of the transfer */
                DEBUGOUT("I2C transfer completed: status = %x\r\n", mXfer.status);
                if (mXfer.status != LPC_OK) {
                        errorOut("Error during I2CM transfer\r\n");
                }

手头没用串口,打算直接用debug看结果,于是在if (mXfer.status != LPC_OK)  处放置一个断点,方法为在该行左侧双击边框。然后build->debug,激动人心的时刻到了。

LPCXpresso调试还真方便,只需鼠标移上去,就可以现实变量。由于之前做开发使用eclipse比较多,所以这个环境用起来也比较顺手。duang~~ 代码停在断点处,赶紧查看状态,发现出现的不是该有的LPC_OK,而是ERR_I2C_SLAVE_NOT_ADDRESSED!!! Damn!大半夜的,惊吓我。

使用特权

评论回复
5
史迪威将军|  楼主 | 2015-12-22 20:26 | 只看该作者
找不到从机地址,好伤心~~是不是插针没接好呢,找出万用表,测了发现没问题,奇怪了,找了好久,期间还猜测这个错误代码是什么情况。。。代码检查也没发现问题,最后眼睛落在gpio初始化上,是不是我接错线了,代码里面使用的是P0_23、P0_24, 翻出原题图,一对照,发现我接J3的 9、10脚是I2C2的,汗。。。赶紧找I2C0的引脚,发现连在了J1的1、2脚,粗心出大乱子。。。重新接好,调试,OK!!!!!!

返回LPC_OK:



验证MPU6050返回数据,I2C读取的数据保存在rx中,这里注意我们只读取了1个字节的数据,因为MPU6050的WHO_AM_I返回的只有一个字节,详情看数据手册,rx[0]的值确实为0x68,可以收工了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

291

帖子

0

粉丝