原创 【LPC54100】 I2C 读写MPU6050

2019-10-11 13:38 1481 7 2 分类: MCU/ 嵌入式 文集: 程序设计
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.

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

  9.                 /* I2C master driver will block if blocking flag is used */
  10.                 mXfer.flags = ROM_I2CM_FLAG_BLOCKING;

  11.                 /* Start transfer and wait for completion */
  12.                 ROM_I2CM_Transfer(i2cmHandle, &mXfer);

    1.             /* Check status of the transfer */
    2.                 DEBUGOUT("I2C transfer completed: status = %x\r\n", mXfer.status);
    3.                 if (mXfer.status != LPC_OK) {
    4.                         errorOut("Error during I2CM transfer\r\n");
    5.                 }
    复制代码

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

    LPCXpresso调试还真方便,只需鼠标移上去,就可以现实变量。由于之前做开发使用eclipse比较多,所以这个环境用起来也比较顺手。duang~~ 代码停在断点处,赶紧查

  13. 看状态,发现出现的不是该有的LPC_OK,而是ERR_I2C_SLAVE_NOT_ADDRESSED!!! Damn!大半夜的,惊吓我。
  14. 找不到从机地址,好伤心~~是不是插针没接好呢,找出万用表,测了发现没问题,奇怪了,找了好久,期间还猜测这个错误代码是什么情况。。。代码检查也没发现问题,最后眼睛落在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,可以收工了!

  
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

curton 2019-10-12 21:44

学习了
相关推荐阅读
minicaihong 2020-10-22 16:44
场效应管放大电路的直流偏置电路详解
什么是偏置电路晶体管构成的放大器要做到不失真地将信号电压放大,就必须保证晶体管的发射结正偏、集电结反偏。即应该设置它的工作点。所谓工作点就是通过外部电路的设置使晶体管的基极、发射极和集电极处于所要求的...
minicaihong 2020-10-22 16:37
场效应管偏置电路-场效应管偏置电路的工作原理及作用分析
什么是偏置电路晶体管构成的放大器要做到不失真地将信号电压放大,就必须保证晶体管的发射结正偏、集电结反偏。即应该设置它的工作点。所谓工作点就是通过外部电路的设置使晶体管的基极、发射极和集电极处于所要求的...
minicaihong 2020-10-22 16:27
MOS管偏置电路-MOS管直流、恒流等偏置电路图文及方程详解
MOS管偏置电路MOS管直流偏置电路MOS管的单电源直流偏置电路有两种:1、只能用于结型和耗尽型MOS管的自给偏置电路。2、可用于各种MOS管的分压式偏置电路自给MOS管偏置电路(1)图解法根据图中电...
minicaihong 2020-05-27 09:50
sprintf 格式化字符串
sprintf 格式化字符串好久没写博客了,又遇到自己觉得很傻的问题,格式化字符串还要找下定义和用法sprintf() 函数把格式化的字符串写入变量中。arg1、arg2、++ 参数将被插入...
minicaihong 2020-05-25 15:07
12T和1T的单片机
标准51是12T的,就是说12个时钟周期(晶振周期,例如12M的,周期是1/12M,单位秒),机器做一个指令度周期,刚好就是1/12M*12=1uS,常见指令例如nop就是一个周期,刚好1uS,其他的...
minicaihong 2020-05-23 16:22
4HC595驱动8*8点阵屏
74HC595驱动8*8点阵屏置顶 菜袅1号 2020-05-19 10:00:03   52   收藏展开该项目使用国产M0核单片机,驱动方式类似于stm32平台;点阵驱动芯片:...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条