基于STM32详解SPI-上
本篇基于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根。
如何能做到“全双工”呢?依靠上面的MOSI和MISO通过通信即可。
二、常见SPI的设置(以STM32CubeMX讲解)
SPI可以分为软件SPI和硬件SPI。
先来说一说软件SPI,是通过代码控制SPI需要的3/4条线的高低电平变换,模拟出来SPI协议并进行通讯,这个方法常用于没有搭载SPI外设的单片机,或者是使用了一些不支持复用SPI功能的引脚。
硬件SPI是直接使用单片机的引脚复用SPI外设,引脚电平无需我们关心,只需要设置为复用输出,并向特定的寄存器中写入/读取需要传输的数据即可,我们可以通过查阅STM32的数据手册/使用STM32CubeMX知道有3个SPI外设可用(部分只有两个)以及可复用的引脚(这是复用没有重映射的引脚),如下图:
这里以SPI1外设配合STM32CubeMX软件向大家讲解:
SPI模式:
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模式。
下图为这块LCD芯片的数据手册的部分时序图片,这是一个读取ID信息的时序图,采用半双工,首先STM32作为master,给其发送一个读命令,对应图中Interface-I SDA的前8位数据(D7-D0,D/C位是一个引脚的电平,对应原理图中的WR_RS,低电平时,代表接下来的数据为命令数据;高电平时,代表接下来的数据为显存数据),发送完毕之后将MOSI引脚上拉,在SCK引脚的上升沿将MOSI引脚的电平读取,8位一组,这就对应图中Interface-I SDA的后8位数据(D7到D0),部分读者可能看不懂我这里说的,不要紧,先后看,全部看完在回过头来看你就懂了。
Receive/Transmit Only Master/Salve:只接收/只发送主/从模式,这两个模式为单向通信,只发或者只接收,一般很少用。
下面来说一说SPI外设的参数配置,这里以Half-Duplex Master模式,根据上面LCD的例子来配置,配置参数如下图:
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设置为推挽,等需要选中时,手动去设置该引脚的电平状态)。
- 点赞
- 收藏
- 关注作者
评论(0)