教学材料《AVR单片机》-第八章_第1页
教学材料《AVR单片机》-第八章_第2页
教学材料《AVR单片机》-第八章_第3页
教学材料《AVR单片机》-第八章_第4页
教学材料《AVR单片机》-第八章_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一节

串行接口与

串行通信基础知识一、并行传输

为了在两个系统A,B之间传送数据,我们用多条线路将二者连接起来,使得构成要传送的数据的各个二进制位在多条线路上同时传送,这样的传输方式就是并行传输。它的特点是,比如要传送一个字节,那么这一个字节的8个二进制位一次性的就通过8条数据线路传送到接收端。这有点像军训时,若干个人排成一排并肩向前走。并行传输的一个缺点就是硬件线路连接复杂,不利于系统的微型化,并行传输的另一个缺点是抗干扰能力差下一页返回第一节

串行接口与

串行通信基础知识二、串行传输

串行数据接口是数据传输的另一种接口方式。串行传输是将构成字符的二进制位序列在一条信道上以位(码元)为单位,按时间顺序先后依次传输的一种方式。采用串行传输通常只用2根线就行了,所以能够大大降低传输线路的成本,比起并行传输需要的十几、几十根线具有明显优势,也使得系统的微型化成为可能。上一页下一页返回第一节

串行接口与

串行通信基础知识下面我们以发送端A要发送一个字节0x5B给接收端B为例,对串行传输的工作方式和其中可能遇到的问题简要描述如下。串行通信通常是在一个时钟信号的控制下进行,发送端A参考时钟信号,每一个时钟通过将数据信号线设置为相应的高低电平来发送一个二进制位,接收端也参考某一个时钟信号检测数据信号线的电平状态来依次接收每一个二进制位,整个过程可用图8一1描述上一页下一页返回第一节

串行接口与

串行通信基础知识三、与通信有关的一些基本概念一般情况下,我们称采用专门的信号线用于通信同步的通信方式为同步通信方式;省略该信号线而采用其他方式完成通信同步的通信方式为异步通信方式。本章要讨论的串行外设接口SPI(SerialPeripheralInterface)就是同步通信的一个典型例子。习惯上,我们将只能从A给B发送数据的通信方式,称为单工通信;在某一时刻A可以给B发送数据,而在另外一个时刻又能够从B给A发送数据(但A,B不能同时给对方发送数据)的通信方式,称为半双工通信;能够在任意时刻同时实现A和B双向通信的方式,称为全双工通信。上一页下一页返回第一节

串行接口与

串行通信基础知识四、常见的串行传输和通信接口

根据实际应用的需要,人们设计出了多种串行通信接口,不同的接口在数据传输的线路、数据的格式、通信过程等方面有不同的规范和协议。在使用这些串行传输和通信接口时,必须首先了解和熟悉这些接口的规范和协议,才能正确掌握这些接口的应用。表8一1列出了在单片机系统设计中常用的一些串行传输和通信接口上一页返回第二节

SPI串行总线介绍一、SPI总线的组成一个典型的SPI总线系统如图8-2所示,它包括一个主机(通常是处理器)和一个从机(通常是一个外围设备芯片),双方之间通过4跟信号线相连,分别是:

(1)主机输出/从机输入(MOSI)。

(2)主机输入/从机输出(MISO)。(3)串行时钟(SC

LK或SCK)。

(4)从机选择(SS)。下一页返回第二节

SPI串行总线介绍主机和从机都包含一个串行移位寄存器,SPI的通信过程实际上是一个串行移位过程,如图8-3所示。从图中我们可以看出,两个移位寄存器通过MOSI和MISO两条信号线首尾相连,形成了一个大的“串行移位环形链”。主机通过MOSI信号线将移位寄存器的数据移入从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机,这样8次移位两个寄存器的内容就被交换了、上一页下一页返回第二节

SPI串行总线介绍二、SPI通信的工作模式和时序根据同步时钟极性(ClockPolarity)和同步时钟相位(ClockPhase)的不同,SPI有四种工作模式。同步时钟极性CPOL是指SPI总线处在传输空闲时SCLK信号线的状态,有“0”和"1”两种

(1)CPOL=0时,表示当SPI传输空闲时,SCLK信号线的状态保持在低电平“0"(2)CPOL=1时,表示当SPI传输空闲时,SCLK信号线的状态保持在低电平“1"

上一页下一页返回第二节

SPI串行总线介绍时钟相位CPHA是指进行SPI传输时对数据线进行采样/锁存点(主机对MISO采样,从机对MOSI采样)相对于SCLK上时钟信号的位置,也有“0”和“1”两种

(1)CPHA=0时,表示同步时钟的前沿对信号采样锁存,后沿串行移出数据

(2)CPHA=1时,表示同步时钟的前沿串行移出数据,后沿对信号采样锁存

上一页下一页返回第二节

SPI串行总线介绍在这里,同步时钟的前沿是指通信开始时,SCLK信号脱离空闲态的第一个电平跳变为同步时钟的前沿,随后的第2个跳变为同步时钟的后沿。由于SCLK信号在空闲态有两种情况,所以当CPOL=0时,前沿就是SCLK的上升沿,后沿为时钟的下降沿;CPOL=1时,前沿就是SCLK的下降沿,后沿就是SCLK的上升沿不同的时钟极性CPOL和时钟相位CPHA组合后,共产生了SPI的4种工作模式,如表8一2所列。图8一4、图8一5、图8一6和图8一7是与表8一2所对应的4种SPI工作模式的时序图上一页下一页返回第二节

SPI串行总线介绍三、多机SPI通信在SPI总线上可以挂接多个SPI器件,实现多机SPI通信。在多机SPI通信系统中,所有器件的MISO,MOSI和SCLK引脚是并接在一起的这也是一种主/从结构的通信系统,系统中的每个器件都可以作为主机,并且由主机控制SPI总线,但任一时刻SPI总线上只能有一个主机,其他都作为从机,通信只能发生在主机与某一个从机之间,在这期间其他的从机应处于未选通状态,器件本身的MISO,MOSI,SCLK引脚为三态高阻上一页下一页返回第二节

SPI串行总线介绍

图8-8示出的是通常使用的典型SPI多机通信系统,这是一种最简单的利用SPI总线实现多机通信的结构。图中微控制器AVR作为永久固定的主机使用,由它全权控制SPI总线,S一51作为从机,不同从机需要的照信号由AVR的通用I/)口产生。在多机SPI通信系统中,当主机需要与某一个从机通信时,它通过I/0口产生“信号,选通某一个从机,被选通的从机响应SCLK上的信号,与主机进行环形串行移位的传输;未被选通的从机,引脚MISO,MOSI,SCLK为三态高阻,不参与通信,就好像它们没有接到SPI总线上一样,以避免对正在进行的SPI通信造成冲突上一页下一页返回第二节

SPI串行总线介绍通过以上的方法,可以很容易的实现多机通信系统,但是也存在一个很明显的问题:整个通信系统中,用于“片选”的SS控制线数量会随着从机数量的增加而无节制地增长,这对于只有有限的端口数量的主机而言,往往是无法承受的,而且最后用于片选的SS控制线数量可能会远远多于真正用于数据传输的信号线数量。很难想象你拿着一个比电脑IDE数据线还要宽的电缆对别人说“这是一个串行通信的连接线”时,对方是一种怎样的惊讶表情。为此,SPI还可用菊花链的方式来支持连接多个SPI设备如图8-9所示,即为使用菊花链链接三台SPI设备的示意图。上一页返回第三节AVR的SPI接口原理

图8一10为AVR内SPI分由数据寄存器、控制逻辑、接口的结构方框图,从图中可以看出,AVR的SPI接口硬件部引肚p逻辑、时钟逻辑几部分组成。一、数据寄存器

SPI接口的核心是一个8位移位寄存器,这个寄存器在时钟信号的作用下,实现数据从低位移入,高位移出。一旦程序将需要发送的字节写入该寄存器后,硬件就自动启动SPI时钟,开始一次SPI通信过程。通信结束后,该寄存器中的内容就被更新为收到的从机串出的字节,供程序读取下一页返回第三节AVR的SPI接口原理二、时钟逻辑时钟逻辑单元用来为移位寄存器提供同步时钟信号。根据SPI配置的不同,被送到移位寄存器的时钟源是不同的:(1)当配置为SPI主机时,时钟信号由内部分频器对系统时钟分频产生。这个时钟信号一方面被引入到移位寄存器,作为本机的移位时钟;另一方面,还被输出到SCK引脚,以提供给从机使用分频器有SPI控制寄存器定义分频比,最高可以产生fosc/2的时钟频率,也就是说,作为主机使用时,AVR能够支持的最高位传输速率为fosc/2

上一页下一页返回第三节AVR的SPI接口原理

(2)当配置为SPI从机时,时钟信号由外部SCK引脚引入到移位寄存器,与内部时钟无关,此时对SPI时钟配置无效。由于控制逻辑对SCK引脚的输入信号进行采样。为了保证对时钟信号的正确采样,SPI时钟不能超过fosc/4,也就是作为从机使用时,最高的位传输率为fosc

/4。上一页下一页返回第三节AVR的SPI接口原理三、引脚逻辑

ATmega48/88/168的SPI模块用到的外部引脚有4个:SCK(与PBS复用)、MISO(与PB4复用)、MOSI(与PB3复用)、SS(与PB2复用)。由于很多具有兼容SPI接口的芯片,并不完全按照第二节介绍的方式使用所有的SPI信号线(如图8-8)。为了与这些器件方便地相连,同时节省I/0口的使用,AVR的SPI模块没有强制定义所有的4个引脚的功能方向。在不同模式下,它们的功能和方向由表8-3定义上一页下一页返回第三节AVR的SPI接口原理四、控制逻辑控制逻辑单元主要完成SPI接口各参数的设定、传输过程的控制、SPI状态标志的设置等功能。其中参数的设定包括主从模式、通信速率、SPI工作模式、数据格式的选择,状态标志包括SPI中断标志、写冲突标志等上一页下一页返回第三节AVR的SPI接口原理AVR的SPI接口传输过程分为主机和从机两种模式。在主机模式下,通过将需要的从机的SS引脚拉低,主机启动一次通信过程。用户向SPDR寄存器写入数据后,硬件自动启动时钟发生器,将SPDR的数据逐位移出至MOSI引脚,同时对MISO引脚采样,并逐位将采样结果移入SPDR。当1字节数据传输完成后,SPI时钟发生器停止,并置位中断标志SPIF。若还有数据需要传输,此时可以继续写入SPDR,启动新一轮传输过程上一页返回第四节

与SPI相关的寄存器一、SPI控制寄存器SPCRSPCR寄存器各位定义如下:1)位7一SPIE:SPI中断使能置位后,只要SPSR寄存器的SPIF和SRE寄存器的全局中断使能位置位,就会引发SPI中断。

2)位6一SPE:SPI使能

SPE置位将使能SPI。进行任何SPI操作之前必须置位SPE3)位5一DORD:数据次序

DORD置位时数据的LSB首先发送;否则数据的MSB首先发送下一页返回第四节

与SPI相关的寄存器

4)位4一MSTR:主/从选择

MSTR置位时选择主机模式,否则为从机。如果MSTR为“1",“配置为输入,但被拉低,则MSTR被清零,寄存器SPSR的SPIF置位。用户必须重新设置MSTR进入主机模式。

5)位3一CPOL:时钟极性

CPOL置位表示空闲时SCK为高电平;否则空闲时SCK为低电平上一页下一页返回第四节

与SPI相关的寄存器6)位2一CPHA:时钟相位

CPHA决定数据是在SCK的前沿采样还是在SCK的后沿采样。CPOL和CPHA决定了SPI的工作模式,参见表8一27)位1,0一SPR1,SPRO;SPI时钟速率选择确定主机的SCK速率。这两个标志位与寄存器SPSR中的SPI2X位一起,用于设置主机模式下产生的串行时钟SCK速率。SPR1和SPRO对从机没有影响。

上一页下一页返回第四节

与SPI相关的寄存器二、SPI状态寄存器SPSRSPSR寄存器各位定义如下:1)位7一SPIF;SPI中断标志串行发送结束后,SPIF置位。若此时寄存器SPCR的SPIE和全局中断使能位置位,SPI中断即产生。如果SPI为主机,SS配置为输入,且被拉低,SPIF也将置位。进入中断服务程序后SPIF自动清零。或者可以通过先读SPSR,紧接着访问SPDR来对SPIF清零。(读取SPSR的操作将会自动清除SPIF位)。上一页下一页返回第四节

与SPI相关的寄存器

2)位6一WCOL:写碰撞标志在SPI接口的数据传输过程中,对SPI数据寄存器SPDR写数据将置位WCOL/WOOL可以通过先读SPSR,紧接着访问SPDR来清零

3)位5..一Res:保留位

ATmega48/88/168的保留位,读操作返回值为。

4)位0一SPI2X/SPI倍速选择置位后SPI的速度加倍(见表8-4)。若为主机,则SCK频率可达CPU频率的一半若为从机,必须保证此时钟不大于fOSf/4以保证正常工作。上一页下一页返回第四节

与SPI相关的寄存器三、SPI数据寄存其SPDRSPDR寄存器各位定义如下:SPI数据寄存器为读/写寄存器,用来在寄存器文件和SPI移位寄存器之间传输数据。写寄存器将启动数据传输,读寄存器将读取寄存器的接收缓冲器上一页返回第五节

SPI接口设计的应用要点一、初始化与使用AVR的其他模块一样,使用SPI接口之前也要进行初始化设置。SPI接口的初始化操作主要是完成以下工作:(1)选择SPI的主从机模式。

(2)设置通信速率。

(3)设置SPI接口工作模式,这主要是选择正确的时钟相位和时钟极性,做到保证通信各方一致

(4)设置数据的串出顺序,按照通信各方的要求,选择LSB先发送或MSB先发送,方便数据处理。

(5)配置SPI引脚的数据方向,按照工作于主机或从机,正确的初始化MOSI,MISO,SCLK,SS引脚的数据方向。下一页返回第五节

SPI接口设计的应用要点二、ss引脚的处理初始化SPI接口时注意:(1)在主机模式下需要正确配置SPI的引脚.其中对于SS引脚的处理尤其需要特别照引肚p方向的设置为影响SPI接口的工作方式,尽量设置成输出方式(2)尽管ss引脚归属于SPI总线的信号线之一,但在AVR的SPI工作于主机模式时SPI接口硬件本身并不对SS实行任何操作,对从机的选择必须通过用户程序来完成,也就是在与从机进行数据通信之前,要先由软件来拉低SS引脚上一页下一页返回第五节

SPI接口设计的应用要点

(3)在主机模式下,若将SS引脚设置为输入,应保证该引脚始终为高电平。这种情况下,如果“被外部拉低,SPI接口会认为总线上出现了另一个主机,并正拉低照准备与自己通信。为防止一个SPI通信系统出现两个主机的冲突,本机的SPI接口将自动清除SPCR寄存器的MSTR位,将自己设置为从机,MOSI,SCLK引脚自动设置为输入,同时置位SPSR寄存器的SPIF位,申请中断上一页下一页返回第五节

SPI接口设计的应用要点三、查询方式使用SPI接口通信流程在对SPI接口进行正确初始化后,就可以使用SPI接口通信了。主机模式下,使用查询方式典型通信流程如下:(1)初始化SPI接口。

(2)初始化SPI引脚

(3)拉低引脚,通知从机准备进行数据交换

(4)将要发送的数据写入数据寄存器SPDR,触发一次通信

(5)不停的检查SPSR寄存器的SPIF标志位,等待通信完成;读取SPIF标志位的操作将自动清除SPIF标志位。

(6)从SPDR中读取从机发送过来的数据

上一页下一页返回第五节

SPI接口设计的应用要点

(7)若还有需要发送的数据,回到第4步,否则拉高,迫使从机进入通信复位状态,等待下一次传输。从机模式下,使用查询方式典型通信流程为:(1)初始化SPI接口。

(2)初始化SPI引脚

(3)将要发送的数据写入数据寄存器SPDR,等待主机SCLK时钟

上一页下一页返回第五节

SPI接口设计的应用要点(4)不停的检查SPSR寄存器的SPIF标志位,等待通信完成;读取SPIF标志位的操作将自动清除SPIF标志位。

(5)从SPDR中读取主机发送过来的数据

(6)如果还有需要发送的数据,直接从第3步开始,否则不做任何处理上一页返回第六节编写SPI基木操作函数SPI的基本操作函数主要由完成初始化、读写操作功能的函数组成)下面的代码说明了如何将SPI初始化为主机、从机,以及如何进行数据的发送和数据的接收。下一页返回第六节编写SPI基木操作函数上一页下一页返回第六节编写SPI基木操作函数上一页下一页返回第六节编写SPI基木操作函数上一页下一页返回第六节编写SPI基木操作函数上一页返回第七节实例12端口扩展1.需求分析随着应用规模的加大,我们会越来越觉得ATmeGa48/88/168的端口数量实在是不够用—没有PA端口,PB6,PB7端口被晶体占用,PC端口上包括了复位、串口和ADC。如果这些资源都要使用的话,我们连一个完整的端口都没有了!更糟糕的是,有的应用必须使用多个端口,例如在数码管驱动的实例中,驱动一个7段数码管就需要使用8跟I/O口线当然,为了解决这样的问题,可以选择有更多I/O端口的高端单片机,比如ATmegal6,ATmega64等,但如果单单为了获得更多的I/0端口而选择高端单片机,会大大增加产品的成本,这可能并不划算,我们还有其他的方法解决这个问题下一页返回第七节实例12端口扩展2.硬件电路端口扩展实验的电路如图8一11所示,其中与本实验不相关的部分未画出。首先来分析用于输出的虚拟端口VPA,该部分使用了带锁存功能、三态输出的8位串行输入/串行或并行输出的移位寄存器74HC595。表8一5是74HC595的逻辑功能表。从逻辑功能表中可以得出,数据的串入和内部数据的移位操作由SCLK控制。SCLK的上升沿使移位寄存器中的数据由SR、向5RH依次移动一位,同时将数据线上的电平移入5R1,而最高位5RH从SSH移出。上一页下一页返回第七节实例12端口扩展其次,我们再来分析用于实现用于输入的虚拟端口VPE,该部分使用了8位串行输入或并行输入/串行输出的移位寄存器74HC165。表8一6是74HC165的逻辑功能表。从逻辑功能表中可以得出,只要SH/PL端为低电平状态,端口数据就始终在更新移位寄存器;在时钟信号CLK或CLKINH的上升沿,移位寄存器的数据从YH端依次输出。可见YH和CLK分别相当于SPI接口的MISO和SCLK,但由于74HC165在移位输出时SH/PL必须保持为高电平,这与标准的SPI总线时序不符,所以在程序设计时需要注意SS输出高电平,以选中“从机”74HC165芯片上一页下一页返回第七节实例12端口扩展根据上述介绍,我们现在可编写一个简单的测试程序验证74HC595部分是否能正常下作。为了简化,在测试中用软件来模拟SPI总线时序。(程序见后页)这个程序能够驱动74HC595的8个输出端以1S为周期交替输出高低电平,实现扩展端口上发光二极管亮、灭交替)如果看到了预期的效果,就表明74HC595部分已经能够正常工作了。上一页下一页返回第七节实例12端口扩展上一页下一页返回第七节实例12端口扩展上一页下一页返回第七节实例12端口扩展3.软件设计在这个实例中,我们计划实现“追逐闪烁”的效果,按键用于控制发光二极管的“追逐闪烁方向”,每按下按键一次,闪烁方向就随之改变一次其效果如图8-12所示软件设计中有两个问题需要解决:SPI总线四种工作模式中的哪一种,在什么时候与端口扩展板进行通信。我们先来看看第一个问题,在前述对74HC595,74HC164芯片的逻辑功能介绍中,可以看到它们都是时钟的上升沿锁存数据,为此我们选择SPI的模式3,CPOL=1,CPHA=1,即空闲状态下时钟线为高电平,数据在时钟的前沿(下降沿)移出,后沿(上升沿)采样锁存上一页下一页返回第七节实例12端口扩展再分析第二个问题,由SPI接口的工作特性,和我们采用的硬件连接方法可知,数据的输出和读回是同时进行的,也即输出LED显示数据和读取按键状态是同时进行的。于是我们可设计出至少三种刷新LED显示和读回键值(简称端口通信)的方案(1)在每次需要刷新LED显示时进行端口通信(2)在每次需要获取按键值时进行端口通信。(3)端口通信与端口应用功能分开(LED显示和按键识别),在主循环中不停地刷新端口。(4)使用时标的控制思想,每隔一段时间进行一次通信,端口通信仍然与端口应用功能分开上一页下一页返回第七节实例12端口扩展对于方案一,我们实现的是LED灯追逐闪烁,可能需要100ms一1s的刷新周期,这时只需每100ms进行一次端口通信,刷新LED显示,同时获取按键状态,但是这种方案对于按键来说刷新时间太长,而且如果加入传统的消抖处理,通信时间非常不容易把握。采用方案二,如果每10ms获取一次按键状态,那就需要10ms一次的端口通信,但同时LED的显示数据也10ms刷新了一次,如果每刷新一次显示就更改一次显示数据,显然10ms的追逐速度太快.人眼无法分辨上一页下一页返回第七节实例12端口扩展第一、第二方案的根本问题在于没有将端口扩展和端口应用功能分开。第三种方案主循环不断刷新端口,有点浪费CPU资源,为此我们选择方案四,采用第匕章介绍的方法用模块化的方法解决这个问题将我们需要的通用模块:队列模块、消息模块、时间管理模块、通用按键扫描模块的实现复制到本实例的项日中来。为了让通过74HC595,74HC165扩展出的虚拟端口用起来更像是“真”的端口,我们编写一个专门的模块处理端口扩展其接口就是两个全局变量VPortA和VPinE,向VPortA上一页下一页返回第七节实例12端口扩展赋值即通过虚拟端口A输出,读取VPinE变量,即获取虚拟端口E的输入。该模块核心代码如下:(1)初始化代码,主要任务是初始化始化,由于我们每次只需要传输1个字节,功能。变量,即获取虚拟端口E的输入该模块核心代SPI接口需要用到的端口方向和SPI接口本身的初始化,由于我们每次只需要传输1个字节,因此我们选择使用查询模式,关掉了SPI的中断。上一页下一页返回第七节实例12端口扩展上一页下一页返回第七节实例12端口扩展(2)端口通信,这部分代码将全局变量VPortA数据通过SPI输出,SPI输入数据送人VPinE全局变量。这样只要定期调用本函数,写VPortA和读VPinE就启动访问虚拟端口的目的,这使得用户代码对虚拟端口的操作和操作实际的端口操作方法一样。例如,向VPA端口赋值只需写下VPortA=Oxab;其他的工作用户代码完全不需要关心,这实在是非常方便上一页下一页返回第七节实例12端口扩展上一页下一页返回第七节实例12端口扩展(3)虚拟端口模块主循环函数,该函数在SysTickFlag标志位为1时,调用端口更新函数,而系统时间管理模块会每20

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论