AVR SPI的 设置于应用

  • 格式:docx
  • 大小:19.07 KB
  • 文档页数:3

AVR SPI的设置与应用
特点
SPI 引脚功能
多从机系统
SPI时序
SPI发送冲突
模仿SPI
轮询例程
中断控制例程
1 介绍
本应用描述了如何设置和应用AVR单片机的片上串行外设接口(SPI),大多数的AVR器件拥有spi接口,并且可以根据本文来配置。

了解一定理论背景后,本文将阐述如何配置SPI 的主、从模式。

2 SPI 概述
SPI允许AVR单片机和外设或单片机之间进行高速同步数据传输。

大多数SPI接口有复用功能作为在系统编程(ISP)。

具体细节参考AVR910
通常SPI连接主从设备之间。

而有些外设,例如传感器只能运行在从机模式,AVR单片机可以配置成主机或从机模式。

通过设置AVR单片机SPI控制寄存器(SPCR)中得MSTR来选择主或从模式。

SS#引脚的特殊情况应该被考虑。

将会在下文“多从机系统----SS引脚功能”的第三页进一步阐述。

在系统中主机是主动部分提供时钟信号和串行数据。

从机不能产生时钟信号因此不能成为主动部分。

当主机产生必要的时钟信号时从机才能接受和发送数据。

主机只有在发送数据时才产生时钟信号。

这就意味着主机不得不通过发送数据给从机来读取从机数据。

PS:当外设是被动的传感器之类的情况会更复杂,当需要读取数据时就发送一个随机不确定的数给传感器。

2.1 主机和从机间的数据传送
主机与从机间的相互作用如图第一页一图所示。

两个确定的SPI单元,左边的配置为主机,右边的配置为从机。

MISO,MOSI和SCK分别两道另一部分的相应引脚上。

通过模式的配置来决定信号线是作为输入还是输出。

因为一个时钟周期内一位从主机移出到从机,一位从从机移位到主机,因此两个八位的移位寄存器可以看做一个十六位的循环移位寄存器。

这也就是说当八个时钟脉冲后主机的数据和从机的数据相互交换。

系统为单缓存发送双缓存接受。

在下面的步骤中影响数据的处理:
1,在移位寄存器将数据完全移出之前新的字节不可以被写入数据寄存器(SPDR)。

2,当接受完成后,接受的数据立即被写入接受缓存中。

3,在下一个传输过程完成之前,接受缓存必须被读取。

否则数据将丢失
4,读SPDR将返回接受缓存的数据。

在完成一次传输后SPI状态寄存器(SPSR)中得中断标志位(SPIF)被置1,如果全局中断和SPI 中断使能,相应的中断将会执行。

2.2 SPI引脚
SPI由四个信号线组成。

移位时钟SCK,主输出从输入MOSI,主输入从输出MISO和从机激活SS#.当SPI使能,MOSI,MISO,SCK和SS#的数据方向如下表所示
表格表明只有输入是自动配置的。

输出引脚由软件初始化。

原因是避免驱动竞争引起的
损坏。

2.3 多从系统---SS#引脚的功能
从机选择(SS#)引脚在SPI配置中起到中心角色。

取决于模式的选择和引脚的配置。

他可以激活或者注销器件。

相对于片选信号SS#引脚有额外的特点。

在主机模式下,如果SS#引脚被配置为输入,这个引脚必须保持高电平以此保证主机SPI的操作。

低电平将使SPI转换为从机模式,硬件SPI有如下特征
1,SPCR 控制寄存器的主机选择位(MSTR)被清零,SPI系统变为从机。

引脚方向如图表2-1
2,SPI状态寄存器(SPCR)中得中断标志位(SPIF)被置1,如果全局中断和SPI中断使能则相应的中断程序将被执行。

这就有效的避免了多主机系统中两个主机同时接入SPI总线,如果SS#引脚被配置为输出,他将可以被应用为通用目的I/O口,这不影响SPI系统。

PS:防止AVR单片机配置为主机模式并且不能保证数据传输过程中SS#时钟保持高电平,在新的数据写入前需要检测MSTR的状态。

一旦MSTR位因为SS#被拉低而被清零,必须从新设置应用为主机模式。

从机SS引脚总是作为输入。

当SS#拉低时,SPI被激活MISO成为输出。

其他引脚为输入。

当SS#为高电平时,所有引脚为输入。

SPI不可用,也就是说SS#为高电平是,从机不接收数据。

表2-2展示了SS#的功能。

PS 在从机模式中,一旦SS#引脚变高SPI逻辑将重置。

如果在传输过程中SS#变高电平,SPI发送和接受立即停止,并且数据被认为丢失。

如表2-2所示,SS#引脚在从机模式下总是作为输入引脚。

低电平激活,高电平注销。

在AVR单片机单主机多从机系统中,主机配置SS#为输出,从机的数量由主机可以用作从机选择信号的I/O口数量决定。

若干个设备接到SPI总线时只允许一个主机和一个从机处于激活状态。

其他设备的MISO,MOSI和SCK线处于三态(配置为高阻抗输入没有上拉电阻),一种错误应用(两个从机同时被激活)可能引起总线上得驱动竞争,导致CMOS锁存,这样的情况必须避免,串联一个1到10k的电阻在SPI可以防止锁存。

但这样会影响最大数据率,由SPI上的负载电容决定。

单像SPI设备只需要时钟和数据两根线,数据线选择为MISO还是MOSI主要看应用目的。

例如简单的传感器只是发数据,(参照S2表2-1),外部DAC只接收数据(参照S3表2-1)。

2.4 SPI 时序
SPI有从0到3四种操作模式。

这些模式用来控制数据的传送方式。

模式选择由SPI控制寄存器(SPCR)中的两位来决定。

时钟极性由CPOL位来控制,决定高时钟还是低时钟。

时钟脉冲(CPHA)位控制选择两总不同的传输格式。

为了保证主机和从机的通讯正常。

主从机的时钟模式必须一样。

主机需要根据外设的情况来设置时钟模式。

不同的CPOL和CPHA设置参考表2-3.因为没有具体的标准模式,因此配置SPI时一定要小心。

时钟的极性对于传输格式来说并不是非常重要。

改变这个位将引起时钟信号的反转(高变低,低变高)。

时钟脉冲位用来选择两种不同的传输时序,这将在下一章具体说明。

主从MOSI 和MISO互连,图标展示了主从两种设备的时序。

SS#线是从机的从机选择输入引脚。

主机的SS#主机没有标明。

在注销状态,如果SS#配置成输入必须被拉高,或者将其配置成输出2.5A.) CPHA=0和CPOL=0(模式0) CPHA=0和CPOL=1(模式1)
当CPHA为零时SPI的时序如图2-2所示,图中分别展示了CPOL等于零和一时的两总SCK 信号不同波形。

作为从机时SPI信号传输开始于SS#线的下降沿。

这将激活从机,数据寄存器中储存的最高位MSB输出到数据线MISO上。

实际的传输开始于主机写数据到SPDR.写数据到SPDR将产
生时钟信号。

在CPHA等于零的情况,SCK第一个中期的前半周SCK信号保持为0.目的是稳定主从机的输入数据。

当SCK线状态改变时数据输入线的数据被读入(如果CPOL为0上升沿,CPOL为1 下降沿)。

当SCK线从活跃到不活跃状态时(如果CPOL=0 下降沿,如果CPOL=1 上升沿)数据寄存器移位准备为下一次数据输出。

八个时钟脉冲后数据传输完成。

接受或发送完成后都会使SPI得中断标志位置1,出发中断。

2.6B.)CPHA=1,CPOL=0(模式2)和CPHA=1,CPOL=1(模式3)
当CPHA为1时SPI的传送时序如图2-3所示。

展示了CPOL=1和CPOL=0时的两种SCK波形。

如前边的例子一样SS#的下降沿激活从机。

不同的是当CPHA=0时这一步从机传送没有开始MSB也没有输出。

主机中软件写SPDR时产生时钟信号这时传输才开始。

SCK的第一个边缘从不活动到活动状态(如果CPOL=0上升沿,如果CPOL=1下降沿)引起主从机的SPDR最高位(MSB)移出。

如图2-3所示,这种情况下没有像模式1和模式2那样有半个SCK周期的延时。

在第一个SCK周期开始时SCK线立即变化。

输入线读取数据在SCK跳变时读取(下降沿CPOL=0,上升沿CPOL=1).
八个时钟周期后,主从机发送接收完数据出发中。

2.6.1高速传输
在高系统时钟频率下,SPI模块有能力在1/2系统时钟下运行。

这样的情况下就需要更加详细的匹配发送和接受的时序。

下图展示了在模式0和模式1下得主从时序表。

具体指根据不同的设备而改变,本文不作具体说明。

但基本功能是相似的所以接下来所展示的可以应用到所有设备中。

最小时钟信号时序由1和2表示。

1代表一个时钟周期,2代表一个周期的高低电平。

3表示最小SCK上升下降沿。

如果与从机匹配这将是AVR设备的第一个时序图。

设置时间4和5的保持时间是很重要的,这时将决定通信是否正常。

这些参数决定了读取有效数据的时间。

如果设置和保持时间足够长,从机可以满足主机的要求,但主机不一定能满足从机的要求。