电子说
一、概述
SPI是Serial Peripheral interface的缩写,是一种串行外设接口。全双工通信,有4根信号线,在MCU、SOC、FLASH、DSP等芯片上常见。
SPI特点
SPI接口只有一个主机,可以有一个或者多个从机。时钟信号由主机发送,所以主机要读一个字节就需要发送一个字节,为从机提供时钟信号。当存在多个从机时由CS片选信号选择从机。
一主一从连接框图
一主多从连接框图
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:
二、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);
}
全部0条评论
快来发表一下你的评论吧 !