首页天道酬勤SPI设备,spi锡膏检测原理

SPI设备,spi锡膏检测原理

张世龙 05-13 00:46 42次浏览

所谓SPISPI主从SPI信号线SPI设备选择SPI数据收发SPI通信的4模式SPI的通信协议SPI的3模式SPI原理图连接STM32中的SPI初始化结构

什么是SPI

SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。

SPI是一种种高速的,全双工,同步的通信总线,在芯片引脚上只占用4根线,节省了芯片引脚,同时为PCB布局节省了空间,提供了方便,主要有EEPROM、FLASH、实时

SPI主从模式SPI分为主机和从机两种模式,一个SPI通信系统必须包含一个主设备和一个或多个从设备。 提供时钟的主设备(主设备),接收时钟的设备是从设备),所有SPI接口的读写操作都从主设备开始。 从站设备有多个时,用各自的芯片选择信号进行管理。

SPI是全双工且SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps

SPI信号线SPI接口通常为SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)

http://www.Sina.com/: http://www.Sina.com /。 该引脚在从模式下发送数据,在主模式下接收数据。 http://www.Sina.com/: http://www.Sina.com /。 该引脚在主模式下发送数据,在从模式下接收数据。 3358 www.Sina.com/: http://www.Sina.com /由主设备生成。 3358 www.Sina.com/: http://www.Sina.com /由主机控制。 其功能用作“芯片选择端子”,也是MISO,允许主设备单独与特定从设备进行通信,避免数据线上的冲突。主设备输入/从设备输出引脚

MOSI

主设备输出/从设备输入引脚

SPI设备为SCLK

发送和接收SPI数据串行时钟信号

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com.Sina.com

SPI通信的四种模式CS/SS

从设备片选信号但是,我们的通信必须在两者相同的模式下工作,所以我们主设备的SPI模式可以由时钟极性(CPOL )和CPHA (时钟相位)构成

控制我们主要设备的通信模式,具体如下。

在、

就是选择指定的从设备

硬件上为4根线。表示SCLK=0时为空

闲态,所以有效状态就是SCLK处于高电平时CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时

时钟相位(CPHA)定义数据的采集时间。

CPHA=0,在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。,在第2个边沿发送数据CPHA=1,在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。,在第1个边沿发送数据

例如:

Mode0:CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿(准备数据),(发送数据)数据发送是在下降沿。

Mode1:CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

Mode2:CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

Mode3:CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。


它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。每种模式由一对参数刻画,它们称为时钟极(clock polarity)CPOL与时钟期(clock phase)CPHA。

SPI的通信协议

主从设备必须使用相同的工作模式——SCLK、CPOL 和 CPHA,才能正常工作。如果有多个从设备,并且它们使用了不同的工作模式,那么主设备必须在读写不同从设备时需要重新修改对应从设备的模式。以上SPI总线协议的主要内容。

是不是感觉,这就完了? SPI就是如此,他没有规定最大传输速率,没有地址方案,也没规定通信应答机制,没有规定流控制规则。

只要四根信号线连接正确,SPI模式相同,将CS/SS信号线拉低,即可以直接通信,一次一个字节的传输,读写数据同时操作,这就是SPI

些通信控制都得通过SPI设备自行实现,SPI并不关心物理接口的电气特性,例如信号的标准电压。

PS:
这也是SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。

SPI的三种模式

SPI工作在3中模式下,分别是运行、等待和停止。

运行模式(Run Mode)
这是基本的操作模式

等待模式(Wait Mode)
SPI工作在等待模式是一种可配置的低功耗模式,可以通过SPICR2寄存器的SPISWAI位进行控制。在等待模式下,如果SPISWAI位清0,SPI操作类似于运行模式。如果SPISWAI位置1,SPI进入低功耗状态,并且SPI时钟将关闭。如果SPI配置为主机,所有的传输将停止,但是会在CPU进入运行模式后重新开始。如果SPI配置为从机,会继续接收和传输一个字节,这样就保证从机与主机同步。

停止模式(Stop Mode)
为了降低功耗,SPI在停止模式是不活跃的。如果SPI配置为主机,正在进行的传输会停止,但是在CPU进入运行模式后会重新开始。如果SPI配置为从机,会继续接受和发送一个字节,这样就保证了从机与主机同步。

SPI原理图连接


**

STM32中SPI初始化配置

1.初始化GPIO口,配置相关引脚的复用功能,使能SPIx时钟。调用函数:void GPIO_Init();

2.使能SPI时钟总线:RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE)

3.配置SPI初始化的参数,设置SPI工作模式:SPI_Init(SPI1,&SPI_Initstructure)

4.使能SPI外设:SPI_Cmd(SPI1,ENABLE);

SPI配置设置

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; /*!< 指定数据传输是从MSB还是LSB位开始的。MSB就是二进制第一位,LSB就是最后一位 */uint16_t SPI_CRCPolynomial; /*!< CRC校验 ,设置 CRC 校验多项式,提高通信可靠性,大于 1 即可*/}SPI_InitTypeDef;

void SPI2_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB13/14/15上拉 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//串行同步时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//串行同步时钟的第二个跳变沿(上升或下降)数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 SPI_Cmd(SPI2, ENABLE); //使能SPI外设SPI2_ReadWriteByte(0xff);//启动传输 }

SPI发送函数(标准库/HAL库)

标准库:u8 SPIx_ReadWriteByte(u8 TxData){ u8 retry=0; while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) { }//等待发送区空 SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个byte 数据 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) { } //等待接收完一个byte return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据} HLA库:uint8_t SPI_SendByte(uint8_t byte){ uint8_t d_read,d_send=byte; if(HAL_SPI_TransmitReceive(&hspi1,&d_send,&d_read,1,0xFFFFFF)!=HAL_OK) d_read=0XFF; return d_read;


单片机抢答器课程设计报告,c51单片机四路抢答器 宫颈spi是不是很严重,SPI设备