OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3798|回复: 0

嵌入式面试必备知识点-SPI

[复制链接]

1107

主题

1118

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4615
金钱
4615
注册时间
2019-5-8
在线时间
1218 小时
发表于 2021-11-9 16:49:06 | 显示全部楼层 |阅读模式
以下文章摘自微信#公众号开源电子网《嵌入式面试必备知识点-SPI》
更多技术文章,请扫下方二维码关注

开源电子网,扫码2222222.png




一、SPI概述

    SPI (Serial Peripheralinterface),顾名思义就是串行外围设备接口。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在EEPROM,FLASH,实时时钟,AD转换器。

    打开STM32F103手册,找到SPI的结构框图,了解它的大致功能,如以下图所示:


1.png

    关于SPI协议,那么我们理解一句话即可。SPI的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

    主机与从机连接关系图:

2.jpg

    一个GIF描述关于SPI传输过程:SPI可以指定数据传输从MSB位还是LSB位开始:例如数据传输从MSB位开始:

3.gif
                     (动态图演示)

    上述GIF可知:当一个上升沿来临时,MOSI发送主机的最高位MSB为1,而MISO是由从机发出为1,然后等价交换。注意:上述SPI的GIF使用的是SPI模式1,SPI不一定是由上升沿为数据采样,是由SPI模式决定,上述GIF的MSB代表移位寄存器的最高位,由此类推,我们得到以下表格:

4.jpg

    注意:上述图中的颜色以及MSB为串行缓冲区的最高位

二、SPI引脚信息


    MISO:主设备数据输入,从设备数据输出,简单来讲:从机发数据到串行总线上或者主机接收总线的数据。

    MOSI :主设备数据输出,从设备数据输入,简单来讲:主机发数据到串行总线上或者从机接收总线的数据。

    SCLK :时钟信号,由主设备产生,数据发送时,必须有方波输出,没有数据时,不会有方波输出。

    CS:从设备片选信号,由主设备控制。简单来讲:主机发送数据到那个从机,如果CS为低电平就是使能该从机,否则除能该从机。

三、SPI工作模式


    SPI的工作模式:是由CPOL(时钟极性)和CPHA(时钟相位)相关。


    时钟极性(CPOL):指通讯设备处于空闲状态(SPI开始通讯前、nSS线无效)时,SCK的状态。

    CPOL = 0:SCK在空闲时为低电平。

    CPOL = 1:SCK在空闲时为高电平。

    前面小编说了,如果从机没有数据发送或者主机没有数据发送,那么SCK不会有方波输出,SCK在空闲状态为低电平或者高电平是由时钟极性(CPOL)决定。

    时钟相位(CPHA):指数据的采样时刻位于SCK的偶数边沿采样还是奇数边沿采样。

    CPHA = 0:在SCK的奇数边沿采样。

    CPHA = 1:在SCK的偶数边沿采样。

    由上述CPOL(时钟极性)和CPHA(时钟相位)可知:SPI模式一共分为四种,如以下图所示:
5.jpg

    注意:上述图片红色部分:SPI模式0时,空闲状态时候SCLK为低电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是奇数边沿时刻,采样边沿为上升沿。

    SPI模式1时,空闲状态时候SCLK为低电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是偶数边沿时刻,采样边沿为下降沿。

    SPI模式2时,空闲状态时候SCLK为高电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是奇数边沿时刻,采样边沿为下降沿。

    SPI模式3时,空闲状态时候SCLK为高电平,如果需要数据采样那么SCLK输出一个方波,那么该方波是偶数边沿时刻,采样边沿为上升沿。

6.png

四、SPI实验

    例如:CPOL =0 和CPHA =0为例,其他模式一样的原理,SCL空闲时候为低电平,奇数边沿上升沿采样,那么下降沿接收数据,如果两块STM32的SPI1相连,如以下图所示:

7.jpg

    主机和从机都有一个串行移位寄存器,主机通过想它的SPI串行寄存器写入一个字节来发起一次传输。

    主机的串行移位寄存器通过MOSI线将字节传输给从机,同时从机也将自己的串行移位寄存器中的内容通过MISO线传输给主机。这样两个移位寄存器的内容就被交换了。

    外设的写操作和读操作是同步完成的。如果只想进行写操作,主机只需忽略接收的字节。如果只想进行读操作,也必须发送一个字节(可以是空字节)来引发从机传输。

    那么它们都具有一个串行移位寄存器,例如主机串行缓冲区数据为0xAA,那么发送从机的数据为0xaa就是10101010二进制,如果从机的串行缓冲区数据的数据为0x9F,转成二进制为10011111,所以我们得到下图所示:


8.jpg


总结

前面我们已经说了CPOL设置为0,所以SCLK空闲状态为低电平,如果没有数据发送,那么SCLK一直为低电平。

当主机发送数据时,SCLK一直为低电平转为输出一个方波,注意是八个脉冲,由于CPHA 设置为 0,所以奇数边沿,上升沿有效,所以数据采样在上升沿,当发送完成时,MOSI转成高电平。

NSS为低电平有效,主要使能从机。

主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输

串行移位寄存器通过MOSI信号线将字节传送给从机,同时从机也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换;

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-4 00:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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