原创
【LPC54100】 I2C 读写MPU6050
http://bbs.21ic.com/icview-1246406-1-1.html
时间过的好快的说~~转眼距离上个帖子都快一个月了!哎,惭愧啊,给力的论坛,终于拿到官方版的板子,可以跨平台使用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位的地址来进行数据传送,这样的好处时只需写一个数据传输方法即可,通过不同的地址来实现读写操作 接下来连接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版本可以用,我喜欢~~ |
直接简单复制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);
- /* 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!大半夜的,惊吓我。
找不到从机地址,好伤心~~是不是插针没接好呢,找出万用表,测了发现没问题,奇怪了,找了好久,期间还猜测这个错误代码是什么情况。。。代码检查也没发现问题,最后眼睛落在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,可以收工了!
|
curton 2019-10-12 21:44