datasheet

SPI协议内容及STM32 SPI的操作

2019-07-11来源: eefocus关键字:SPI  协议内容  STM32  SPI的操作

SPI总线协议简介及内容

简介

SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全/半双工,同步的通信总线,并且在芯片的管脚上只占用三/四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。


SPI特征

3根/4根线全双工同步传输 

8或16位传输帧格式选择 

主从操作模式 

支持多主操作模式 

从模式频率(最大为fpclk/2) 

可编程的时钟极性和相位 

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

可触发中断的专用发送和标志 

SPI总线忙状态标志 

支持可靠通信的CRC


功能

SPI框图 


SPI框图

SPI通常都是采用四个引脚和外围设备相连,每个引脚的含义:


MISO 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。

MOSI 主设备输出/从设备输入引脚。该引脚在从模式下接收数据,在主模式下发送数据。

SCK 串口时钟,作为主设备的输出,从设备的输入。

NSS 从设备选择(片选引脚),是一个可选的引脚,用来选择主/从设备。

SPI时钟极性(CPOL)和时钟相位(CPHA)的组合时序图 

SPI极性和相位时序图


SPI的极性和相位组合有四种:


CPHA=0,表示第一个边沿: 

对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿; 

对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;

CPHA=1,表示第二个边沿: 

对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿; 

对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;

可以相互组合通过寄存器(SPI_CR1)设置不同的时钟极性和时钟相位组合。


STM32 的SPI寄存器映射及复位值

SPI寄存器映射

寄存器映射和复位值


用STM32固件库函数编程配置SPI总线操作

SPI所用到的GPIO初始化

void SPI_GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure SPI2  -------------------------*/

  GPIO_StructInit(&GPIO_InitStructure);

  //CS | NSS

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  //SCK

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  //MISO

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  //MOSI

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

}


SPI配置初始化

void SPI_Configuration(void)

{

  SPI_InitTypeDef SPI_InitStructure;


  SPI_Cmd(SPI2, DISABLE);

  SPI_StructInit(&SPI_InitStructure);


  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;     

  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;    

  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;  

  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

  SPI_InitStructure.SPI_CRCPolynomial = 7;

  SPI_Init(SPI2, &SPI_InitStructure);


  /*Enable SPI1.NSS as a GPIO*/

  SPI_SSOutputCmd(SPI2, ENABLE);


//  GPIO_SetBits(GPIOD, GPIO_Pin_7); 

  GPIO_SetBits(GPIOB, GPIO_Pin_12);    //CS = 1 |  NSS=1 


  /* Enable SPI1 */

  SPI_Cmd(SPI2, ENABLE);

}


Tips


对于SPI配置中的CPOL和CPHA两个选项,可以根据连接外设需求不同进行修改配置,参考上面提到的四种模式。


SPI发送和接收


u8 SPI_SendByte(u8 tempdata)

{

  /* Loop while DR register in not emplty */

  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);     


  /* Send byte through the SPI1 peripheral */

  SPI_I2S_SendData(SPI2, tempdata);    //send tempdata


  /* Wait to receive a byte */

  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);    

  /* Return the byte read from the SPI bus  */

  return SPI_I2S_ReceiveData(SPI2);

}



u8 SPI_ReceiveByte(void)

{

  return (SPI_SendByte(0x00));

}


一般在SPI总线外围所接设备


一般常见的SPI连接外围设备有: 

Flash存储芯片,传感器类芯片。



关键字:SPI  协议内容  STM32  SPI的操作

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic467448.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32 I2C问题 I2C_CheckEvent()
下一篇:STM32入门——第二天学习串口收发

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

技术文章—SPI接口原理介绍

。以智能表计方案为例,使用一个NRAM就可以替代电、水、气、热表中的Flash、FRAM和EEPROM等所有存储单元,不仅减少了存储器的使用数量,也有利于系统工程师简化设计上的难度。  图7:基于富士通NRAM可简化智能表计方案设计 作为NRAM的第一代产品,16M bit的DDR3 SPI接口产品最快将于2020年底上市,势必引发存储行业的新一轮变革。冯逸新自信地表示:“NRAM既继承了FRAM的高性能,又具有替换NOR Flash大容量的特点,我们坚信这必将是一个划时代的存储器解决方案!
发表于 2019-07-15
技术文章—SPI接口原理介绍

stm32通过SPI与adc124s021通信读取ad

/** * 配置用于操作ADC124S21的模拟SPI GPIO端口 */static void U11ADC124S021_GPIO_init(){             SPI_InitTypeDef  SPI_InitStructure;  //定义SPI结构体   GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体         //使能SPI1时钟、GPIOA及GPIOC口时钟、引脚复用
发表于 2019-07-11

STM32模拟spi控制MCP41100数字电位器

; CS_1;}/*******************************************************函数名:writebyte(u8 data)功能:模拟spi*******************************************************/void writebyte(u8 data){    u8 i;    SCK_0;    MOSI_0;    for (i = 0; i < 8; i++ )    {       
发表于 2019-07-11

STM32常用通信——USART,IIC,SPI,CAN

空,接受有效报文,挂号1(读出,释放邮箱),挂号2(读出,释放邮箱).......满溢出,丢失信息。SPI四线通信,MOSI,MISO,CS,SCLK,串行通信,通过移位寄存器进行操作,所以读的时候,需要发送空子节,引起主机发送,如果是写,则不需要考虑接收。SPI主模块和与之通信的外设备时钟相位和极性应该一致。32配置省略......模拟SPI:void Write_date ()//SPI写模拟CPHA=1,CPOL=1操作的伪代码{    片选CS置零选中; for(i=0;i<8;i++)//八位 {       时钟脚置为零; 
发表于 2019-07-11
STM32常用通信——USART,IIC,SPI,CAN

STM32——SPI通信协议(W25Q128FLASH的通信)

SPI协议串行外设接口(Serial Peripheral Interface Bus,SPI),是一种用于短程通信的同步串行通信接口规范,主要应用于单片机系统中。类似I2C。 这种接口首先被Motorola(摩托罗拉)公司开发,然后发展成了一种行业规范。典型应用包含SD卡和液晶显示器。 SPI设备之间使用全双工模式通信,包含一个主机和一个或多个从机。主机产生待读或待写的帧数据,多个从机通过一个片选线路 决定哪个来响应主机的请求。SPI物理层SPI 通讯设备之间的常用连接方式 SS( Slave Select):从设备选择信号线,常称为片选信号线,也称为 NSS、CS。当有多个 SPI 从设备与 SPI 主机相连时,设备
发表于 2019-07-11
STM32——SPI通信协议(W25Q128FLASH的通信)

arm底层通讯协议之SPI通讯

1、基本概念区分    (1)SPI和SSP区别        可能很多人在其他的地方都多次到过SPI和SSP,比如爱NXP的LPC11XX系列的SOC手册中多次出现SSP,这里作统一区分:SSP(Synchronize Serial Port,同步串行口)和SPI(Serial Peripheral Interface,串行外设接口)。SSP是在SOC和一些串行外部设备通信的通信模块,他有两种工作模式:SPI和IIC。    (2)SPI协议和代码关系        我们在使用SPI接口进行
发表于 2019-07-11
arm底层通讯协议之SPI通讯

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved