SPI串行外设接口的特点概述

电子说

1.3w人已加入

描述

一、概述

SPI是Serial Peripheral interface的缩写,是一种串行外设接口。全双工通信,有4根信号线,在MCU、SOC、FLASH、DSP等芯片上常见。

SPI特点

SPI接口只有一个主机,可以有一个或者多个从机。时钟信号由主机发送,所以主机要读一个字节就需要发送一个字节,为从机提供时钟信号。当存在多个从机时由CS片选信号选择从机。

一主一从连接框图

MCU芯片

一主多从连接框图

MCU芯片

SPI的片选信号

如果是一主一从也可以不使用片选信号,此时从机SPI的接收数据中断使能,在中断ISR里处理数据;如果使用片选信号,可以不使用SPI硬件片选信号,可以使用一个带外部中断功能的IO作为CS。

SPI的4根信号

MISO: 主机输入/从机输出引脚。

MOSI: 主机输出/从机输入引脚。

CLK:串行时钟信号,由主机产生。

CS:从机片选信号,由主机控制。

当然,4根线也不是必须全用上,可以只发送或只接收。可以参考STM32的SPI介绍。

SPI的4种mode

所谓的模式,是指可以通过配置CPOL(时钟极性)来设定CLK空闲状态的电平是高还是低;通过配置CPHA(时钟相位)来设定在CLK的哪个沿进行数据采样和数据发送。CPOL和CPHA可以配置成0或1,所以组合有4种mode。

主机和从机的使用的mode要匹配对应。比如SPI FLASH只支持两种mode,所以主机初始化配置要注意。如下图FLASH只支持mode 0 和 mode 3:

MCU芯片

二、STM32程序初始化举例

void SPI1_Init(void)

{

//Enable SPI1 clock and GPIO clock for SPI1

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;

//Configure SPI1 pins: SCK, MISO and MOSI

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

//SPI1 Config

SPI_InitTypeDef SPI_InitStructure;

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;

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_16;

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;//主从机的配置相同

SPI_InitStructure.SPI_CRCPolynomial = 7;

SPI_Init(SPI1, &SPI_InitStructure);

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE,ENABLE);//使能接收中断

//Enable SPI1

SPI_Cmd(SPI1, ENABLE);

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分