SPI串行接口
SPI是由Motorala公司提出的一种同步串行外围接口。它在速度要求不高、低功耗、需保存少量参数的智能化传感系统中得到了广泛应用。
SPI是一个全双工的同步串行接口。在数据传输过程中,总线上只能是一个主机和一个从机进行通信。
1、MISO(Master In Slave Out)
主机输入、从机输出信号。
2、MOSI(Master Out Slave In)
主机输出、从机输入信号。
3、SCK(Serial Clock)
串行时钟信号。(用来同步使用的)
4、SS(Slave Select)
从机选择信号,低电平有效。
SPI系统连接
SPI总线可在软件的控制下构成各种简单或复杂的系统。
SPI通信工作原理
SPI的基本结构相当于两个8位移位寄存器的首位相接,构成16位的环形移位寄存器。从而实现了主机与从机的数据交换。
SPI框图
分析:
①首先看SCK 管脚,通过波特率发生器产生时钟信号,这个信号可以出去给从机使用,也可以进来给自己驱动 COMMUNICATION CONTROL(通信控制),其中波特率发生器由BR0、BR1、BR2控制,由这三个值来决定波特率的速度,通信控制受MSTR、SSM、SSI控制
,如果通信控制出错,比如控制的CRCERR(CRC校验错误)、MODF(模式)、OVR(数据溢出),就会在SPI_SR的相应位置1。通信控制出来的信号连接着 MASTER CONTROL LOGIC(主控逻辑电路),中控逻辑电路控制着MOSI、MISO这一块。
②数据从MISO进来,进入SHIFT REGISTER(移位寄存器),移位寄存器数据一旦8位接收完整之后,会自动放到 RX BUFFER 中,我们可以通过 RX BUFFER可以读取数据。 当我们要发送内容,就是通过总线(地址总线,数据总线)将数据写入 TX BUFFER 中去,然后送到移位寄存器 ,数据一旦8位接收完整之后,可以通过MOSI将数据发送出去。
SPI通信的几个步骤
1.SPI主从模式
设置MSTR(主设备选择)和SPE位(使能位)来选择是否工作在主模式还是从模式下。(这两个位都在SPI_CR1寄存器中都可以设置),作为从机,片选要接地,可以硬件实现也可以软件实现,接电源是作主机
2.时钟信号的相位和极性
SPI接口可由CPOL和CPHA设定4种不同传输格式的时序。(CPOL和CPHA在SPI_CR1寄存器中)
CPOL决定时钟脉冲SCK的有效脉冲方式(正脉冲、负脉冲)。CPHA决定数据线MOSI什么时候输出数据或采集数据。
根据CPOL和CPHA的组合数目,一共有4种设置情况。
分析:
CPOL决定了脉冲的方式,第一行(CPOL=0),是正脉冲,第二行(CPOL=1),是负脉冲(空闲时高电平,来数据下降沿);当CPHA=0,数据是先出来的,即比上方的SCK的电平变化(时钟输出)要快,大概快半拍,我们称之为数据传输相位超前;当CPHA=1,SCK的电平变化之后数据才会出来,相位是同步的,当在SCK的第二个上升沿或者下降沿的时候才开始数据采集
4种时序下的数据传输,其中“第一位数据的输出”和“其他位数据的输出”栏是表示数据在什么时候更新输出。还需注意数据采样是上升沿还是下降沿有效。
数据与时钟的相位关系如下图:
3.数据帧的格式
根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB在先也可以LSB在先。
根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和/或接收都有效。
SPI主模式通信
在主模式时,串行时钟在SCK脚产生。
配置步骤:
通过 SPI_CR1寄存器的 BR[2:0]位定义串行时钟波特率
选择 CPOL和CPHA 位,定义数据传输和串行时钟间的相位关系
设置 DFF 位来定义8或16位数据帧格式
配置 SPI_CR1寄存器的 LSBFIRST 位定义帧格式
如果 NSS 引脚需要工作在输入模式,硬件模式中在整个数据帧传输期间应把 NSS 脚连接到髙电平:在软件模式中,需设置 SPI_CR1寄存器的 SSM 和 SSI 位 。 如 果 NSS 引脚工作在输出模式.则只需设置 SSOE 位
必须设置 MSTR 和 SPE 位(只当 NSS 脚被连到高电平.这些位才能保持置位)
在这个配置中, MOSI 脚是数据输出,而 MISO 脚是数据输入。
数据发送过程
1、 当一字节写进发送缓冲器时,发送过程开始。
2、 在发送第一个数据位时,数据字被并行地(通过内部总线–TX BUFFER)传入移位寄存器,而后串行地移出到 MOSI 脚上; MSB 在先还是 LSB 在先,取决于 SPI_CR1寄存器中的 LSBFIRST 位。数据从发送缓冲器传输到移位寄存器 TXE 标志将被置位,如果设置 SPI_CR1寄存器中的 TXEIE 位,将产生中断。
3、 在试图写发送缓冲器之前,需确认 TXE 标志应该是1
数据接收过程
当数据传输完成时:
1、 移位寄存器里的数据传送到接收缓冲器(8位–>RX BUFFER),并且 RXNE 标志被置位(硬件接受满自动置位1)。如果 SPI_CR2寄存器中的 RXEIE 位被设置,则产生中断。
2、 读 SPI_ DR 寄存器时, SPI 设备返回接收到的数据字。读 SPI_DR 寄存器将清除RXNE 位(也是硬件自动清零)。
数码管显示 123.4
main.c
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h" //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
#include "../Module_Function/Module.h"
#include TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; ErrorStatus HSEStartUpStatus; void Delay_Ms(u16 time); void RCC_Configuration(void); void GPIO_Configuration(void); /* Private functions ---------------------------------------------------------*/ /******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { // u16 i=0,j; #ifdef DEBUG debug(); #endif RCC_Configuration();//使能外设时钟 SEG_Init(); //========实现数码管显示========== while (1) { /*for(i=0;i<9999;i++) { for(j=0;j<500;j++) SEG_Display(i,0); } */ SEG_Display(1234,3); } } /******************************************************************************* * Function Name : Delay_Ms * Description : delay 1 ms. * Input : time (ms) * Output : None * Return : None *******************************************************************************/ void Delay_Ms(u16 time) //延时函数 { u16 i,j; for(i=0;i
上一篇:STM32-(17):SPI与数码管,
下一篇:STM32-(19):I2C通信(理论基础)
推荐阅读最新更新时间:2024-11-11 11:54
设计资源 培训 开发板 精华推荐
- 使用 MaxLinear, Inc 的 SPX29302U 的参考设计
- k270改TP4056pad触控开关小键盘
- 用于电池充电器的 0.1W、5V DC 至 DC 单路输出电源
- LDO稳压器TCR15AGADJ 应用&电路
- 适用于STM32L412KB MCU的STM32 Nucleo-32开发板,支持Arduino nano连接
- 使用 Analog Devices 的 LTC3725EMSE 的参考设计
- LT1956EFE 双极性输出降压转换器的典型应用电路
- AR0132AT6B00XPEAH3-GEVB:1.2 MP Sunex DSL945D 1/3" iBGA CIS HB
- CN0188
- esp8266 温控风扇-v1.0.1-20230331