找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20815|回复: 2
打印 上一主题 下一主题
收起左侧

基于51的SPI通讯原理及协议详解

[复制链接]
跳转到指定楼层
楼主
ID:94349 发表于 2015-11-10 02:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在51系列的MCU中,STC12C5410AD系列提供了一种高速串行通讯接口,其全双工,高速,同步,两种操作模式:主模式和从模式。主模式支持高达3Mbps的速率。

SPI接口寄存器如下:


SPI控制寄存器SPCTL

SSIG:引脚忽略控制位
SSIG=1;MSTR(第四位)确定硬件作为主机还是从机
SSIG=0;SS~用于确定其间作为主机还是从机


SPEN;SPI使能位
SPEN=1;SPI使能,SPEN=0;
SPI禁止,此时可作为通用IO使用


DORD:设定SPI数据发送和接收的位顺序
DPRD=1;数据最低位LSB最先发送
DPRD=0;数据最高位MSB最先发送

MSTR;主从位选择

CPOL;SPI时钟极性
CPOL=1;SPICLK空闲时为高电平,SPICLK的前时钟沿为下降沿而后沿为上升沿。
CPOL=0;SPICLK空闲时为低电平,SPICLK的前时钟沿为上升沿而后沿为下降沿。

CPHA;SPI时钟相位选择
CPHA=1;数据在SPICLK的前时钟沿驱动,并在后时钟沿采样。
CPHA=0;数据在(SS~)为低(SSIG=00)时被驱动,在SPICLK的后时钟沿被改变,并在前时钟沿被采样。(SSIG为1时的动作未定义);

SPR1,SPR0;SPI时钟速率选择控制位,时钟选择如下:

其中,CPU_CLK为CPU的时钟。

SPI状态寄存器SPSTAT

SPIF;SPI传输完成标志
当一次传输完成,SPIF置位,此时,如果SPi中断被打开(即ESPI(IE2.1)和EA(IE.7)都置位),则产生中断。当SPI处于主模式且SSIG=0时,如果SSIG~为输入并被驱动为低电平,SPIF也将置位,,表示模式改变,SPIF通过软件向其写入“1”,清零。

WCOL;SPI写冲突标志
在数据传输的过程中,如果对SPi数据寄存器SPDAT执行写操作,WCOL将置位,WCOL标志通过软件向其写入“1”清零。

SPI数据寄存器SPIDAT

SPDAT.7-SPDAT.0: 数据的传输位Bit7-Bit0

SPI的核心是一个8位的移位寄存器和数据缓冲器,数据可以同时接受或者发送,在SPI数据的传输过程中,发送和接受的数据都存储在数据缓冲寄存器中

对于主模式,若想发送一字节数据,只需将这个数据写道SPIDAT寄存器中,
主模式下SS~不是必须的,
从模式下,必须在SS~信号变为有效并接受到合适的时钟信号后,方可进行数据传输。此模式下,如果一个字节传输完成后,SS~信号变为高电平,这个字节立即被硬件逻辑标志为接收完成,SPI接口准备接受下一个数据。


SPI接口的数据通信
SPI接口对应管脚SCLK/P1.7,MOSI/P1.5,MISO/P1.6mSS~/P1.4
MOSI(Master Out Sleavein--主出从入);多个从机共享一根MOSI信号线,在时钟边沿的前半周期,主机将数据放在MOSI信号线上,丛机在该边界处获取数据。
MISO(Master in Sleaver out--主入从出;一个主机可以连接多个从机,,因此MISO的信号线会连接到多个从机上,当主机与一个从机通讯时,其他从机应将其MISO引脚驱动置位高阻状态。

SCLK(SPIClock);从主机到从机,用于同步不MOSI或者MISO的数据传输,当主器件启动一次数据传输时,自动产生8个SCLK时钟周期信号给从机,在SCLK的每个跳变处(上升沿或者下降沿)移出一位数据,所以一次数据的传输可以穿出一个字节。
SS~(Sleave Select从机信号选择);主从模式下的SS~使用不同。
主模式下,SPI接口只能有一个主机,不存在主机选择问题,该模式下,SS~不是必须的,主模式下,通常将主机的SS~管脚通过10K电阻上啦至高电平。每一个从机的SS~接主机的IO口,由主机控制电平高低,以便主机选择从机。
从模式下;不管发送还是接收,SS~信号必须有效,因此在一次数据开始传输之前,必须将SS~置为低电平。在典型配置中,SPI主机使用IO口选择一个SPI器件作为当前的从机。

SPI从期间通过SS~管脚以确定是否被选择,如果满足下面的条件之一,SS~就被忽略:
如果SPI系统被禁止,即SPEN(SPCTL.6)=0。
如果SPI配置为主机,即MSTR(SPCTL.4)=1,并且P1.4配置为输出(通过P1M0.4和P1M1.4)
如果SS~管脚被忽略,即SSIG1(SPCTL.7)=1;该脚配置用于IO口功能。
注意:及时SPI被配置为主机(MSTR=1),他仍然可以通过拉低SS~配置为从机(如果P1.4配置为输入且SSIG=0),要是能改特性,应当置位SPIF(SPSTAT.7)。


SPI接口的数据通信方式
三种分别是:
单主机-----从机方式
双器件方式(器件可互为主机和从机)
单主机----多主机方式

单主机----=单从机连接方式:



双器件方式(器件可互为主机和从机)

当没有发声SPI操作时,两个期间度可以配置为主机(MSTR=1),将SSIG清零并将P1.4(SS~)配置为准双向模式,当其中一个期间启动传输时,它可将P1.4配置为输出并驱动为低电平,这样就强制另一个器件变为从机。
双方初始化时,将自己设置成忽略SS~脚的SPI从模式,当一方要主动发送数据时,先检测SS~脚的电平,如果SS~是高电平,及将自己设置成忽略SS~的SPI主模式。

通讯双方平时将SPi设置成没有被选中的从模式,在该模式下,MISO,MOSI,SCLK均为输入,当多个MCU的SPI接口以此模式并联时,不会分发生总线冲突,这种特性在互为主/从,一主多从等应用中很有用。
注意:互为主从时,双方的SPI速率必须相同,如果使用外部晶体振荡器,双方的晶体频率也要相同。

单主机----多主机方式:

在上图中,从机的SSIG(SPCTL.7)为0,从机通过对应的SS~信号被选中,SPI主机可使用任何端口(包括P1.4/SS~)来驱动SS~引脚。

SPI主从模式配置:


作为主机或者从机时的额外注意事项:
作为从机时,额外注意事项:
当CPHA=0时,SSIG必须为0(也就是i不能忽略SS~),SS~引脚必须置低并且在每个连续的串行字节发送完成后,需重新设置为高电平。如果SPDAT寄存器在SS~有效(低电平)时执行写操作,那么将导致一个写冲突错误。
当CPHA=1时,SSIG可以置1(即可以忽略SS~引脚),入伏哦SSIG=0,SS~引脚可在连续传输之间保持低有效。这种方式有时适用于具有单固定主机和单从机驱动MISO的数据线的系统。

作为主机时的额外注意事项:
在SPI中,传输总是由主机启动.如果SPI使能(SPEN=1)并选择作为主机,主机对SPI数据寄存器的写操作将启动SPI时钟发声器和数据的传输,在数据写入SPDAT之后的半个到一个SPI位时间后,数据将出现在MOSI脚。
需要注意的是:主机可以通过将对应器件SS~驱动为低电平与之通信,写入主机SPDAT寄存器的数据从MOSI移出发送到从机的MOSI。同时主机SPDAT寄存器的数据从MISO移出发送到主机的MISO。
传送玩一个字节后,SPI时钟发声器停止,传输完成标志SPIF置位,并产生一个中断。主机和从机CPU的两个移位寄存器可以看做是一个16位循环移位寄存器,当数据从主机移到从机时,数据也可以以相反的方向移入,这意味着一个移位周期中,主机和从机的数据相互交换。

通过SS~改变模式
如果SPEN=1,SSIG=0且MSTR=1,SPI使能位主机模式。SS~可配置为输入或者准双向模式。这种情况下,另外一个主机可将该脚驱动为低电平,从而将该器件选择为SPI从机并向其发送数据。

为了避免争夺总线,SPI系统执行以下操作:
1.MSTR清零并且CPU变成从机。这样SPi就变成从机。MOSI和SCLK强制变为输入模式,而MISO则变为输出模式
2.SPATAT的SPIF的标志位置位,如果SPI中断已被使能,则产生SPI中断。
用户软件必须一直对MSTR位进行检测,如果改为被一个从机选择所清零而用户想继续讲SPI作为主机,这是就必须重新职位MSTR,否则就进入从机模式。


写冲突:
SPi在发送时为单缓冲,在接受时为双缓冲,这样在前一次发送行为完成之前,不能将新的数据写入移位寄存器。当发送过程中,对数据寄存器进行写操作时,WCOL(SPSTAT.6)将置位以指示数据冲突,在这种情况下,当前发送的数据继续发送,而新写入的数据则丢失。

当对主机或者从机进行写冲突检测时,主机发生写冲突的情况是很罕见的,因为主机拥有数据传输的完全控制权,但从机有可能发生写冲突。因为当主机启动传输时,从机无法尽心控制。
接收数据时,接收到的数据传送到一个并行读数据缓冲区,这样将释放移位寄存器以继续下一个数据的接收。但必须在下个字符完全移入之前,从数据寄存器中读出接收到的数据,否则前一个接收数据将丢失。
WCOl可通过软件向其写入“1”清零。

数据模式
时钟相位位(CPHA)允许用户设置采样和改变数据的时钟边沿;时钟极性位(CPOL)允许用户摄者始终极性,
SPI从机传输格式(CPHA=0),如下:

SPI从机传输格式(CPHA=1),如下:

SPI主机传输格式(CPHA=0),如下:

SPI主机传输格式(CPHA=1),如下:




SPI的相关缩写:
SPI的极性Polarity和相位Phase,最常见的写法是CPOLCPHA
CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性
CKPHA (Clock Phase)   = CPHA =PHA = Phase = (时钟)相位
SCK=SCLK=SPI的时钟
Edge=边沿,即时钟电平变化的时刻,即上升沿(rising edge)或者下降沿(falling edge)

在一个周期内,关于边沿的问题:
Leadingedge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候;
Trailingedge=后一个边沿=第二个边沿,对于开始电压是1,那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1),对于开始电压是0,那么就是1变成0的时候

关于极性和相位的解释:

CPOL极性:
先说什么是SCLK时钟的空闲时刻,其就是当SCLK在数发送8个bit比特数据之前和之后的状态,
于此对应的,SCLK在发送数据的时候,就是正常的工作的时候,有效active的时刻了。

先说英文,其精简解释为:Clock Polarity = IDLE state of SCK。

再用中文详解:
SPI的CPOL,表示当SCLK空闲idle的时候,其电平的值是低电平0还是高电平1:
CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high;
CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low;

CPHA相位:
首先说明一点,capture strobe = latch = read =sample,都是表示数据采样,数据有效的时刻。
相位,对应着数据采样是在第几个边沿(edge),是第一个边沿还是第二个边沿,0对应着第一个边沿,1对应着第二个边沿。

对于:
CPHA=0,表示第一个边沿:
对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;
对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;

CPHA=1,表示第二个边沿:
对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;
对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;

或者图文可以解释的更加的清晰:


判断SPI的CPOL和CPHA的方法:
CPOL是用来决定SCK时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1时,空闲电平为高电平。
CPHA是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟沿采样,CPHA=1,在每个周期的第二个时钟沿采样

图形可能会来得更加的直观:










分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:87193 发表于 2015-11-10 16:51 | 只看该作者
不错,值得好好看看
回复

使用道具 举报

板凳
ID:74145 发表于 2017-2-3 13:11 | 只看该作者
详细。谢谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表