一、SPI接口简介

SPI是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口,是Motoroal首先在其MC68HCXX系列处理器上定义的。

SPI是一种高速的、全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省了空间,提供方便,主要应用在EEPROM、FLASH、实时时钟、AD转换器还有数字信号处理器和数字信号解码器之间

SPI接口框图

SPI内部结构简明图

SPI接口一般使用4条线通信:

MISO主设备数据输入,从设备数据输出;MOSI主设备数据输出,从设备数据输入;

SCLK时钟信号,由主设备产生。CS从设备片选信号,由主设备控制。

SPI工作原理总结:

1、硬件上为4根线。

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

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

4、外设的写操作和读操作是同步完成的。如果只进行写操作,主机只忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

二、SPI特征

1、3线全双工同步传输。

2、8位或16位传输帧格式选择。

3、主或从操作。

4、支持多主模式。

5、8个主模式波特率预分频系数(最大为Fpclk/2)

6、从模式频率(最大为Fpclk/2)

7、主模式和从模式的快速通信。

8、主模式和从模式下均可由软件或硬件进行NSS管理:主/从操作模式的动态改变。

9、可编程的时钟极性和相位。

10、可编程的数据顺序,MSB在前或LSB在前。

11、可触发中断的专用发送和接收标志。

12、SPI总线忙状态标志。

13、支持可通信的硬件CRC:——在发送模式下,CRC值可以被作为最后一个字节发送。

——在全双工模式中对接收到的最后一个字节自动进行CRC校验。

14、可触发中断的主模式故障、过载以及CRC错误标志。

15、支持DMA功能的1字节发送和接收缓冲器:产生发送和接收请求。

(STM32 SPI接口可配置为支持SPI协议或者支持I2C音频协议,默认是SPI模式。可以通过软件切换到I2C方式)

从器件选择(NSS)引脚管理

时钟信号的相位和极性

CPHA=1(采集数据的时间)

CPHA=0(采集数据的时间)

数据帧格式

根据SPI_CR1寄存器中的LSBFISRST位,输出数据位时可以MSB在先也可以LSB在先。

根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位,所选择的数据帧格式对发送和/或接收都有效

状态标志:应用程序通过3个状态标志位可以完全监控SPI总线的状态。

发送缓冲器空闲标志(TXE):此标志为‘1’表明发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中。当写入SPI_DR时,TXE标志被清除。

接收缓冲器非空(RXNE):此标志为‘1’时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除该标志位。

忙(Busy)标志:BSY标志由硬件设置与清除(写入此位无效果),此标志表明SPI通信层的状态。

SPI中断:

SPI引脚配置(3个SPI)

三、SPI常用寄存器和相关库函数

SPI常用寄存器

SPI控制寄存器1(SPI_CR1)

SPI控制寄存器2(SPI_CR2)

SPI状态寄存器(SPI_SR)

SPI数据寄存器(SPI_DR)

SPI_I2S配置寄存器(SPI_I2C_CFGR)

SPI_I2S预分频寄存器(SPI_I2CSPR)

SPI相关库函数

void SPI_I2C_DeInit(SPI_TypeDef* SPIx);
void SPI_Init(SPI_TypeDef* SPIx,SPI_InitTypeDef* SPI_InitStruct);//SPI初始化函数
void SPI_Cmd(SPI_TypeDef* SPIx,FunctionalState NewState);//SPI使能函数
void SPI_I2S_ITConfig(SPI_TypeDef* SPIx,uint8_t SPI_I2S_IT,FunctionalState NewState);//中断配置函数
void SPI_I2S_DMACmd(SPI_TypeDef* SPIx,uint16_t SPI_I2S_DMAReq,FunctionalState NewState);//DMA函数
void SPI_I2S_SendData(SPI_TypeDef* SPIx,uint16_t Data);//SPI发送数据函数
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);//SPI接收数据函数
void SPI_DataSizeConfig(SPI_TypeDef* SPIx,uint16_t SPI_DataSize);//确定数据是8位还是16位FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx,uint16_t SPI_I2S_FLAG);
void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx,uint16_t SPI_I2S_FLAG);
ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx,uint8_t SPI_I2S_IT);
void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx,uint8_t SPI_I2S_IT);

SPI初始化函数

SPI_Init()

typedef struct

{

uint16_t SPI_Direction;方向:支持两线双通或者一线之类的

uint16_t SPI_Mode;模式

uint16_t SPI_DataSize;确定位数:8位或16位

uint16_t SPI_CPOL;

uint16_t SPI_CPHA;

uint16_t SPI_NSS;确定是硬件还是软件

uint16_t SPI_BaudRatePrescaler;波特率预分频系数

uint16_t SPI_FirstBit;第一位:LSB在前还是MSB在前

uint16_t SPI_CrCPolynomial;CRC的校验

}SPI_InitTypeDef;

程序配置过程:

1、使能SPIx和IO口时钟

RCC_AHBxPeriphClockCmd()/RCC_APBxPeriphClockCmd();

2、初始化IO口为复用功能

void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct);

3、 设置引脚复用映射

GPIO_PinAFConifg();

4、初始化SPIx,设置SPIx工作模式

void SPI_Init(SPI_TypeDef* SPIx,SPI_InitTypeDef* SPI_InitStruct);

5、使能SPIx

void SPI_Cmd(SPI_TypeDef* SPIx,FunctionalState NewState);

6、SPI传输数据

void SPI_I2S_SendData(SPI_TypeDef* SPIx,uint16_t Data);

uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);

7、查看SPI传输状态

SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE);

四、SPI FLASH的相关硬件

 

STM32——SPI接口原理与配置相关推荐

  1. SPI接口原理与配置

    SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.是Motorola首先在其MC68HCXX系列处理器上定义的. SPI,是一种高速的,全双工, ...

  2. STM32——SPI接口

    STM32--SPI接口 宗旨:技术的学习是有限的,分享的精神是无限的. 一.SPI协议[SerialPeripheral Interface] 串行外围设备接口,是一种高速全双工的通信总线.在ADC ...

  3. stm32 spi nss硬件模式配置参考程序

    By: Ailson Jack Date: 2020.11.27 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/ ...

  4. STM32工作笔记0067---SPI接口原理与配置

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 由于工作原因,中间省略了,关于ADC,DAC等的内容,后面补上.

  5. STM32 SPI介绍及CubeMX配置

    目录 一.SPI简介 二.SPI协议 物理层: 协议层: 1.SPI的基本通讯过程 2.通信模式 三.STM32中的SPI SPI框图: 1.通信引脚 2.时钟控制逻辑 3.数据控制逻辑 4.整体控制 ...

  6. SPI菊花链原理和配置

    一.概述 在一个主机和多个从器件的典型 SPI 系统中, 通常采用专门的片选信号来寻址从器件.随着从器件数量不断增加, 片选线也随之增多. 这种情况将给电路板布板带来很大的挑战. 一个布板方法就是采用 ...

  7. STM32输入捕获原理与配置

    目录 一.输入捕获原理 二.输入捕获过程 1.设置输出捕获滤波器(通道1为例) 2.设置输入捕获极性 3.设置输入捕获映射通道 4.设置输入捕获分频器 5.捕获到有效信号可以开启中断 6.工作工程 三 ...

  8. STM32——CAN控制器原理与配置

    一.CAN控制器简介 STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下: 1.支持CAN协议2.0A和2.0B主动模式 2.波特率最高达1Mbps 3.支持时间触发通信 4.具 ...

  9. STM32——LCD—TFTLCD原理与配置介绍

    1.TFTLCD简介 TFTLCD即薄膜晶体管液晶显示屏.它与无源TN-TLCD.STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可以有效的克服非选通时的串 ...

最新文章

  1. JAVA中栈和堆总结
  2. ef 排序string转int_排序算法之基本排序算法
  3. Mysql导入zabbix的sql语句时报错:ERROR 1045 (28000)
  4. javascript:void到底是个什么?
  5. 机器学习之朴素贝叶斯法
  6. python函数执行shell_6方法,python中执行shell命令
  7. C# Lodop实现打印
  8. 双色球机器学习线性回归蓝球预测案例
  9. relocation R_X86_64_PC32 against symbol lua_newstate can not be used when making a shared object
  10. matlab晶闸管整流电路,整流电路MATLAB仿真实验
  11. 谷歌离线地图开发API
  12. UG NX二次开发(C#)-同步建模-删除倒圆(圆角)
  13. 一大堆概率概念_拔剑-浆糊的传说_新浪博客
  14. python mysql library,python调用mysql报错解决方案
  15. 如何保护WordPress网站免受网络攻击?采取安全措施至关重要
  16. 数字逻辑第三章(集成门与触发器)
  17. 制作的自媒体短视频很模糊?教你3个方法,让视频变清晰
  18. iOS QQ 扫一扫 捷径URL
  19. 关于大数定律的讨论(转)
  20. DirectX12(D3D12)基础教程(三)——使用独立堆以“定位方式”创建资源、创建动态采样器、初步理解采取器类型

热门文章

  1. c oracle存储过程返回值,C#调用存储过程详解(带返回值、参数输入输出等)
  2. 计算机硬件耗电,【求助】我想查询我的电脑每一种硬件的耗电功率,谁能给个查询软件?...
  3. 【赛事预告】云上开发,高效智能——第二届阿里云ECS CloudBuild开发者大赛即将启动
  4. 如何选择kmeans中的k值——肘部法则–Elbow Method和轮廓系数–Silhouette Coefficient...
  5. C/C++动态内存创建与内存管理
  6. RM云台黑箱系统辨识及建模
  7. 探访 “成都环保私有云”
  8. 300篇天涯论坛经典帖子合集分享(收藏版本)
  9. 购买啊里空间,操作ftp上传网站,购买域名
  10. 运营积分兑换商城系统的核心关键点,既然是....