打印

MSP430之IIC的使用

[复制链接]
1110|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Ryze|  楼主 | 2016-8-28 17:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MSP430教程之十一
     上次和大家说了软硬件的SPI,那么这次我们要说的IIC总线的通信方式,他有什么好处呢!最直接的就是说他可以节约更多的连接线!他只需要两根数据线进行通信就可以了。

    (不知道前面的一些东西够不够清楚,如果不清楚的话也请大家帮忙留言,我会尽力给大家解答的。好像慢慢的失去趣味性是不是,但是当你看到上次我们讲的OLED可以显示了会不会觉得很神奇,后面我们也尽量结合实际的例子提高教程的趣味性哈!)

    本次的IIC学习我们将来驱动一个好玩的东西,就是角度传感器,为什么说好玩呢?因为你可以利用它来做一些体感的设计,可以做一个跟体感或者和角度控制相关的好玩的东西,我们这次驱动的是ADXL345这个模块,不是很贵的一个模块。     当然和这个类似有MPU6050这个模块,这个模块一般是用来做飞控那边,当然会有其他的应用。我当时用这个做的飞控。这个模块相对就比较复杂了,同样的也是运用IIC的方式读取数据。这次我们就先入门一个简单的ADXL345。

    首先我们需要先知道IIC总线的东西是什么?
    全名为(Inter-Integrated Circuit(集成电路总线),是有飞利浦公司提出来的,好了,背景我们知道这么多就可以了。
    我们看下它有哪些特点:
一根信号线:SCL
一根时钟线:SDA
    至于具体的时钟传输协议图如下:
    暂时我们不说这个,后面我们会在详细说到。
    但是我们来考虑一个问题,对于IIC来说我们是可以实现多个总线上面对应传输多个器件的,并且每个器件都可以给对方发数据或者是接收数据,这里面就会牵扯一个问题,假设这两条总线中连接了多个器件,那我总线发一个数据,那么是发给哪个器件呢?这里就会引出一个新的东西,就是地址,这个是比较重要的,我们是根据每个器件对应不同的地址来实现数据之间的传输的。
    这里大家先记住一个概念:IIC的通信地址

    同样的还是那两份文档,数据手册和库函数的两份参考文档。这里就不在说明具体是那两个了哈!
    同样这次我们还是会讲解两个方法,一个软件模拟,一个硬件方式的数据传输。

    开干吧!!建立工程。
    听取了一位网友的建议@数码小叶,我们可以这样快速的建立工程,选择图中的工程选项,可以快速建立一个包含官方库的工程,非常方便,不用自己添加库函数和添加路径,如果你不可以的话就老老实实的按照我们之前的方法也是OK的。

    我们在另外一份文档中,MSP430FR5969 LaunchPad Development Kit (MSP-EXP430FR5969) User's Guide.pdf
    在文档中我们看到这样子的说明,也就是说板子上面标注的SCL和SDA两个引脚只能使用软件模拟的方式来实现IIC的功能。
    当然我们从具体的引脚说明中也可以找到这个论据,这两个引脚没有IIC的功能
    在这里是为什么这样呢?通过仔细的查看手册,通过搜索SCL这个字眼,我们只得到一个引脚可以有这个功能,而这个引脚又可以作为SPI通信的引脚,这样子就很相互矛盾,所以这里如果要使用SPI和IIC的方式,我们只能舍弃一个,在一般情况下我们使用软件仿真就可以达到我们的要求了,硬件的通信方式更加的稳定,速度会比软件快一点。但是到目前为止,我使用软件模拟还没有出错过,速度也基本够用。
    所以要根据自己的需要选择软件和硬件的方式。软件的话会更加可控,因为整个协议的生成是我们自己写出来的。
    我们将在代码中先给出IIC的模拟方式来读取ADXL的值,在此我们注明我们的尚且只是讲到方法,对于实际应用我们将在后续中给出,注重给大家讲一下方法,希望能够掌握一个学习的方法,这样子在你之后接触到一个新的东西,就不会觉得无从下手,有了自己的方法,那么学习新的东西就非常快乐。
    我们来看下如果拿到一个新的芯片该怎么做?
    对于拿到芯片的人一般分两类,简单来说就是做硬件的和做软件的,对硬件开发的就需要关注芯片的参考电路,一般情况下芯片都会给出芯片的参考设计电路,一般情况下我们也会采用芯片的数据手册中的电路,毕竟这个东西是经过厂家验证过的东西。比如我们这次试用的ADXL345我们看下他的数据手册(它有中文版的和英文版的,是因为这款芯片用的人比较多了,一般比较新的,比较前沿的芯片,或者是用的人少一点的一般情况下都是英文版的数据手册,所以希望大家能够适应阅读英文的数据手册,说白了不会特别复杂,我们只需要掌握几个点,那么以后拿到一份数据手册,你就懂得该如何去阅读了。所以这里我们以英文版的进行说明)
    这款芯片集成度比较高,基本外围没有什么器件,我们仔细找下来,我们在application information 这个章节中找到,右图中的figure43就是我们的应用电路,这里的话电路比较简单,在电路上面也给出了外围器件的一些选型,具体说电阻电容的取值等等。
    当然对于硬件设计来说不仅仅要关系这一点还有一点很重要的就是我们需要关注芯片的封装,这里的封装指的什么意思呢?就是我们电子线路板大家知道做出来的话是有焊接点的,如下面所示,我在黑色框中全出了一个贴片电阻(电容)的封装形式,也就是说我们画板子的时候需要画两个焊点像下面这个形状,但是具体的话大小我们需要根据芯片的大小以及芯片焊点的位置。
    那么关于芯片的封装要在哪里找呢?
    一般情况下芯片的封装都会放在数据手册的最后部分,我们也很容易找到。这里就是我们芯片的封装数据,给出了具体的大小以及焊点的位置,所以这里我们需要明白的就是要懂得看这些参数,一般情况参数的单位为毫米。具体的大小从哪里到哪里是多长,相信大家一看就明白了,这里不再多说了。同时芯片手册还给出了芯片的参考封装大小供设计者参考。

    说完硬件我们就需要来讲讲软件部分,对于一款芯片,软件上面我们该怎么去看,其实我们一直在说的430就是一款比较复杂的芯片,我们也一直在做关于软件的工作。那么对于一款传感器芯片我们该如何看他的软件部分呢?
1.芯片的通信协议
2.芯片的数据读取方式
    关于芯片的通信协议我们都明白了,这里我们选择的是ADXL345的IIC方式,ADXL也可以采取SPI的方式进行读取,这需要在硬件上面发生改变,所以在一个板子的制作时,软件工程师是需要和硬件工程师密切交流的。
    那么我们知道是IIC,我们就需要找到芯片的地址,在芯片的通信协议说明中我们找到了地址的说明,ADXL345的地址是通过ALT ADDRESS这个引脚确定的,就是芯片的第12个引脚。我们可以从上述说明知道,当我们在硬件上面或者是软件上面设置ALT ADDRESS引脚为高电平的时候我们得到的器件地址是0x1D,读和写的地址分别为0x3A和0x3B,如果设置为地点平的时候我们的器件地址为0x53,相应的读写地址为0xA6和0xA7。

    关于芯片的引脚说明,我们也可以在手册中找到,12脚的描述中我们看到它是作为IIC通信的地址选择引脚,或者是SPI通信的串行端口数据输出。

    至此,我们知道了芯片的地址该如何确定了,所以大家在使用IIC的时候要明白一个点就是关于芯片的地址在芯片手册中都会给出,结合相关的硬件电路就可以得到我们实际的芯片或者是读取的数据地址。
    下面我们看下该如何正确读取该芯片的数据呢?
    首先是通信协议IIC的初始化了,这个毫无疑问了。接下来就是芯片的初始化了,那么这个具体指什么呢,就是说我们需要对芯片进行一些设置,我们看一下代码:
    在这里我们都进行了注释,这里设置的就是一些芯片的数据输出格式和相关的数据范围,那么这里我们给的是现成的东西,那要是我们拿到一个新的芯片我们该如何做呢?
    很重要的一点就是需要认真看数据手册,其实厂家的芯片数据手册中包含了很多内容,像我们之前说的硬件设计参考,在软件方面同样也给出了很多的参考。那我们看下对于这部分在手册中的哪个位置。
(找了半天手册,没有看到有个章节集中介绍在芯片使用的时候需要做哪些初始化的工作,所以我们在芯片的内部寄存器定义中找)
    看到上面的寄存器定义,我们大家需要联系到我们430的寄存器编程,其实都是相通的,同样是对寄存器进行数据的读写而已,所以我们这里的话同样的对这些寄存器的相关的位进行配置和读取。
基本步骤就是我们程序中给出的那几个方面,但是我们有一点要注意,我们要学会看寄存器的各个位的功能,以及要懂得如何修改。
    在下面给出了各个寄存器的位的定义以及数据解释,写的很详细,这里截图的都是英文版的是因为我是希望大家要适应看英文的数据手册,当然当你拿到一个新的芯片的时候第一步想的就是能不能找到中文的参考资料,这无可厚非,但是如果没有你就要适应看英文的数据手册。
    下面我们看下如何读取一个数据,关于芯片的配置我们就不多说了,因为很复杂,我们讲的话要说很久才能说完,所以这里我们就不在说明了,希望大家通过这样的方法能够说自己去看下这份文档,或者是在自己尝试用一款新的芯片是有所启发吧。
    所先我们找到代码。
    在这里我们就看到了具体的读取数据的方式,我们看到所先是发送我们的数据地址,这里是0xA6,所以得到这里数据从哪里开始读取,然后我们从0x32这个地址开始读取,得到后面的6个字节的数据,因为我们在芯片的寄存器描述中我们看到了每两个字节的话组成一个轴向的数据,所以我们在函数实现的最后进行了一个数据的整合。
    至此大家应该可以明白一个芯片的具体操作流程了吧,可能有些细节还是没有讲好,但是就是希望大家记住几点:
1.对芯片的数据手册要有一定的理解,多看几遍会帮助你在出问题的时候很快找到解决方法。
2.对通信时序上面要比较熟悉,不是要求我们去记住这个时序图,是要我们掌握使用的方法,如果你是比较长时间用这款芯片,那你完全可以自己调好一个通信时序的代码,之后你都可以直接用这份代码,提高开发的效率
3.要懂得如何调试,这个很重要,大部分情况你都不能一下子程序一写好然后马上就可以用,这个是很难的,所以就需要一步一步去改正,去找到整个代码中的错误的地方,和需要改进的地方,所以调试这个步骤是十分重要的。因为这部分还是需要一定篇幅来讲的,所以这里我们就不在细说,我们下一讲会总结一下我们之前所学的三种时序,同时我们还将说明对一个程序而言具体的调试方法该如何去做。

相关帖子

沙发
dirtwillfly| | 2016-8-28 21:55 | 只看该作者

使用特权

评论回复
板凳
火山LF| | 2016-8-29 11:15 | 只看该作者
如果你是原作者的话,希望可以把已发表帖子的图片和说明加上。

如果是转载的话,希望可以把转载的格式也弄好一些,原帖子是有很多图片,清晰易懂很多的

谢谢

使用特权

评论回复
地板
dirtwillfly| | 2016-8-29 20:20 | 只看该作者
火山LF 发表于 2016-8-29 11:15
如果你是原作者的话,希望可以把已发表帖子的图片和说明加上。

如果是转载的话,希望可以把转载的格式也弄 ...

明显是转贴的

使用特权

评论回复
5
火山LF| | 2016-8-29 20:47 | 只看该作者

转帖子也得转的好一点嘛,这个系列的教程,我都看了的,觉得很好呀,适合小白的看

使用特权

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

本版积分规则

121

主题

714

帖子

1

粉丝