2016.12.02_SPI通信方式的使用总结

来源:互联网 发布:内网远程桌面控制软件 编辑:程序博客网 时间:2024/04/29 08:06

1 SPI的简介及基本特点


1 SPI的简单介绍

最近工作中使用了SPI通信方式来做TM4C129和STM32之间的通信,为了更好地解决问题就学习了SPI原理的相关内容,完成了项目之后,也对这种通信方式有了较为深入的了解,现在来对SPI的使用方法进行详细的总结。
SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO; SPI 接口主要应用在 EEPROM, FLASH,实时时钟, AD 转换器,还有数字信号处理器和数字信号解码器之间。 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议. 下图为SPI 的内部简明图:
SPI内部结构图

SPI全双工的特点:一边发送一边接收,硬件上只有一个SPI_DR寄存器和两个缓冲器(发送缓冲器和接收缓冲器),主模式:SPI_DR会先从发送缓冲器读出数据,然后通过MOSI引脚一位一位地将数据发出去,在发送的过程中,SPI_DR的数据会左移(如果是高位先发送),并且会从MISO引脚读入数据填补SPI_DR左移后的空缺。传输8比特数据后,SPI_DR再把数据并行写入接收缓冲寄存器。


2 SPI的通信接口

MISO :主设备数据输入,从设备数据输出。MOSI :主设备数据输出,从设备数据输入。SCLK : 时钟信号,由主设备产生。CS   : 从设备片选信号,由主设备控制。当从设备的片选被拉低的时候,才能从SPI总线上获取数据信息。这里需要知道的地方是,根据SPI被配置成主或者从模式,MIMO和MOSI引脚的功能会自动改变,实现发送和接收的切换。 

3 SPI 主要特点:

 - 1.可以同时发出和接收串行数据;  - 2.可以当作主机或从机工作;主机发送时钟频率可编程控制;  - 3.有发送结束中断标志;  - 4.写冲突保护;  - 5.总线竞争保护;

2 SPI的四种工作方式

SPI 总线根据时钟极性和时钟相位的不同有四种工作方式 ,根据我们所需要通信的外设工作要求的不同,给SPI控制器配置为不同的工作模式,以满足
1. 时钟极性( CPOL) :
如果 CPOL=0,串行同步时钟的空闲状态为低电平。
如果 CPOL=1,串行同步时钟的空闲状态为高电平。
时钟极性对传输协议没有重大影响,只是规定了串行同步时钟在空闲时的电平为高还是为低。
2. 时钟相位( CPHA) :
如果 CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样。
如果 CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。
时钟相位主要是在设置数据在什么时候改变和什么时候被采样。

注意:在配置SPI模块时,SPI 主机和与之通信的外设备时钟相位和极性应该一致。
SPI的工作方式

注意:
1. 如果时钟相位为0,则主从都需要在第一个时钟沿跳边之前将需要发送的数据准备好并上线。在第一个时钟沿来临的时候进行数据采样。
2. 如果时钟相位为1,则主从都在第一个时钟沿到来的时候开始准备数据并上线,等待第二个时钟沿来临的时候对数据进行采样。
3. 如果主从双方的时钟极性和相位不同,则会出现数据移位错误的问题。SPI通信方式中要求从器件先工作,然后主器件才开始发送数据,否则可能发生数据传输错误,而且之后的数据都会出错。


SPI的参数设置

GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|
RCC_APB2Periph_SPI1, ENABLE ); //GPIO,SPI 时钟使能

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
//①初始化 GPIO
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//设置 SPI 全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
//设置 SPI 工作模式:设置为主 SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 8 位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
//选择了串行时钟的稳态:时钟悬空高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号由软件管理
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
//预分频 256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure);
//②根据指定的参数初始化外设 SPIx 寄存器
SPI_Cmd(SPI1, ENABLE); / /③使能 SPI 外设
SPI1_ReadWriteByte(0xff); / /④启动传输

连续和非连续传输:当在主模式下发送数据时,如果软件足够快,能够在检测到每次TXE的上升沿(或者TXE中断),并立即在正在进行的传输结束之前写入SPI_DR寄存器,则能够实现连续的通信;此时,在每个数据项的传输之间的SPI时钟保持连续,同时BSY位不会被清除。如果软件不够快,则会导致不连续的通信,这时状态位在每个数据传输之间会被清除。
为了达到最大通信速度,需要及时的往SPI发送缓冲器填充数据,同样接收缓冲器中的数据也必须及时读走以防止溢出。为了方便高速率的数据传输,SPI实现了一种采用简单的请求、应答的DMA机制。
直接存储器存取,DMA是计算机科学中的一种内存访问技术。他允许某些电脑内部的硬件子系统,可以独立的直接读写系统存储器,而不需要绕道CPU,在同等程度的CPU负担下,DMA是一种快速的数据传送方式。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU的大量中断请求。

SPI的状态标志

状态标志:
应用程序可以通过三个状态标志可以完全监控SPI总线的状态。
发送缓冲器空闲标志(TXE)
此标志为1时表明发送缓冲器为空,可以写入下一个待发送的数据进入缓冲器。当写入发送寄存器SPI_DR时,TXE被清除。
接收缓冲器为非空(RXNE)
此标志为1时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。
忙(BUSY)标志
BSY标志由硬件设置与清除(写入此位无效果),此标志表明SPI通信层的状态,当被设置为1时,说明SPI正在忙于通信,但有一个例外:在主模式的双线接收模式下,(MSTR=1),BDM=1,并且BDOE=0,在接收期间BSY标志保持为低。
在软件要关闭SPI模式并进入停机模式之前,可以使用BSY标志检测传输是否结束,这样可以避免破坏最后一次传输,因此需要严格按照下述过程执行。
BSY标志还可以用于在多主系统中避免写冲突。

SPI的应用总结

使用总结:
1.在使用SPI通信的时候首先要确定引脚对接正确;主器件和从器件的MISO,MOSI,CLK连在一起。CS引脚根据采用软件和硬件NSS来确定。如果有多个器件公用一个SPI则必须采用分时复用的方法,通过片选控制。
2.注意SPI通信主从机的时钟极性和时钟相位须一致。
3.使用合适的SPI通信速率,不要超过从设备的最大通信速率。
4.NSS引脚一定要接,保证被硬件或者软件控制,否则可能会出现误码。
5.建议在主设备发送时钟之前使能SPI从设备,否则可能会发生意外的数据传输。在通信时钟的第一个边沿到来之前或者正在进行的通信结束之前,从设备IDE数据寄存器必须就绪。在使能从设备和主设备之前,通信时钟的极性必须处于稳定的数值。
6.使用STM32向SPI总线写数据时要注意检查:1.发送缓冲器是否空闲。2.SPI总线是否忙,否则可能会发送乱码。关闭SPI之前也要检查总线是否为忙,否则会破坏最后一次SPI传输。

SPI的常见错误以及解决办法

这里写图片描述
这里写图片描述
这里写图片描述

还有溢出错误和移位错误和其它的一些错误可以在下面的网页中找到。

http://www.dzsc.com/data/html/2011-3-25/89304.html

里面介绍的很详细。

1 0
原创粉丝点击