基于STM32详解SPI-上

举报
樊心昊 发表于 2020/07/27 15:58:57 2020/07/27
【摘要】 本篇基于ST公司最经典的产品(STM32F103)向大家讲解SPI协议。一、SPI的诞生SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用三/四根线,这种接口首先由摩托罗拉公司于20世纪80年代中期开发,后发展成了行业规范,它的典型应用有SD卡与液晶显示器。SPI总线规定了4个保留逻辑信号接口:...

本篇基于ST公司最经典的产品(STM32F103)向大家讲解SPI协议。

一、SPI的诞生

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用三/四根线,这种接口首先由摩托罗拉公司于20世纪80年代中期开发,后发展成了行业规范,它的典型应用有SD卡与液晶显示器。

SPI总线规定了4个保留逻辑信号接口:

SCLK(Serial Clock):串列时脉,由主机发出

MOSI(Master Output, Slave Input):主机输出从机输入信号(数据由主机发出)

MISO(Master Input, Slave Output):主机输入从机输出信号(数据由从机发出)

SS(Slave Select):片选信号,由主机发出,一般是低电位有效

以上接口不一定全部都需要使用,例如有的器件直接将SS接地或者接VCC,就只用使用3根。

image.png

如何能做到“全双工”呢?依靠上面的MOSI和MISO通过通信即可。

二、常见SPI的设置(以STM32CubeMX讲解)

SPI可以分为软件SPI和硬件SPI。

先来说一说软件SPI,是通过代码控制SPI需要的3/4条线的高低电平变换,模拟出来SPI协议并进行通讯,这个方法常用于没有搭载SPI外设的单片机,或者是使用了一些不支持复用SPI功能的引脚。

硬件SPI是直接使用单片机的引脚复用SPI外设,引脚电平无需我们关心,只需要设置为复用输出,并向特定的寄存器中写入/读取需要传输的数据即可,我们可以通过查阅STM32的数据手册/使用STM32CubeMX知道有3个SPI外设可用(部分只有两个)以及可复用的引脚(这是复用没有重映射的引脚),如下图:

image.png

       这里以SPI1外设配合STM32CubeMX软件向大家讲解:

SPI模式:

       image.png

Full-Duplex Master/Slave:全双工模式,同时使用MISO和MOSI两条线传输数据,如果是Master,STM32在这个通信系统中扮演主机的角色,如果是Slave,STM32在这个通信系统中扮演从机的角色。

Half-Duplex Master/Slave:半工模式,只使用MISO和MOSI中的一条线传输数据,使用哪一条取决于STM32在这个通信系统中扮演的角色,如果是Master,使用MOSI,反之,使用MISO,主机和从机共用一条线进行数据传输,所以主机和从机不能发送数据,虽然比全双工节省一条线,但是速率低于全双工

如下图,这是一块spi协议的LCD接口图,采用的是Half-Duplex Master模式。

image.png

下图为这块LCD芯片的数据手册的部分时序图片,这是一个读取ID信息的时序图,采用半双工,首先STM32作为master,给其发送一个读命令,对应图中Interface-I SDA的前8位数据(D7-D0,D/C位是一个引脚的电平,对应原理图中的WR_RS,低电平时,代表接下来的数据为命令数据;高电平时,代表接下来的数据为显存数据),发送完毕之后将MOSI引脚上拉,在SCK引脚的上升沿将MOSI引脚的电平读取,8位一组,这就对应图中Interface-I SDA的后8位数据(D7到D0),部分读者可能看不懂我这里说的,不要紧,先后看,全部看完在回过头来看你就懂了。

image.png

       Receive/Transmit Only Master/Salve:只接收/只发送主/从模式,这两个模式为单向通信,只发或者只接收,一般很少用。

       下面来说一说SPI外设的参数配置,这里以Half-Duplex Master模式,根据上面LCD的例子来配置,配置参数如下图:

image.png

Frame Format:数据帧格式默认为Motorola。

Data Size:可以选择8bit/16bit,这里就以8bit为例,一帧数据大小为1字节。

First Bit:根据前面的时序图,可以知道是先传输高位,所以选择MSB;LSB是先传输低位。

Prescaler:预分频系数,可以调节传送的速率,每个时钟周期可以传输1Bit,由于目前分到SPI1的时钟为8MHz,所以2分频的传输速率为4Mbit/s。

Baud Rate:取决于预分频系数。

Clock Polarity:时钟极性,如果是Low,SPI在不传输数据的时候保持低电平;如果是High,SPI在不传输数据的时候保持高电平。

Clock Phase:采样沿设置,取决于芯片手册和时钟极性,例如前面所说的LCD设备是在上升沿采样,但是我们时钟极性设置为High,所以这里要设置为第二个时钟沿采样(上升沿)。

CRC:CRC校验,这里不需要。

NSS Signal Type:片选信号控制,不需要硬件自动控制,我们通过软件控制(将连接片选脚的GPIO设置为推挽,等需要选中时,手动去设置该引脚的电平状态)。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。