新闻中心

EEPW首页>嵌入式系统>设计应用> 踏踏实实搞清 stm32 SPI总线 基础和编程

踏踏实实搞清 stm32 SPI总线 基础和编程

作者: 时间:2016-11-28 来源:网络 收藏

SPI应用是相当的广了,同步串行总线,同步同步当然需要时钟信号来统一了,这样通讯双方通讯时就比较默契没那么延迟(呆呆)了。应用于中低速场合。

本文引用地址: //m.amcfsurvey.com/article/201611/322996.htm

学起来从哪些地方入手呢?如下:

SPI概念与特点关键的时序接受编程时重点STM32内部的SPI使用(介绍、功能、中断)

SPI概念与特点:不多说,串行,需要同步信号主从结构的CS(片选)SCKSDISDO

全双工一主控多从8或16位数据通信

其它特点:8个主模式波特率预分频系数fpcll/2

主模式和从模式下快速通行并支持切换

编程MSB 或LSB在前

专用发送和接受标志可促发中断

有SPI忙标志位

支持硬件CRC校验,发送模式下crc值作为最后一个字节被发送,接受模式下最后一字节自动CRC校验

支持错误中断标志,支持DMA功能的1字节发送和接受缓冲器:产生发送和接受请求。

SPI总线时序介绍:

看下下图应该就会了


使用stm32spi需要以下的步骤

1.管脚因为复用的,故先配置好管脚、并打开spi时钟

2.设置spi的工作模式

通过 SPI1_CR1 来设置,设置SPI1主机模式,设置数据格式8位,然后通过 CPOL 和 CPHA 位来设置 SCK时钟极性及采样方式。并设置 SPI1 的时钟频率(最大18Mhz),以及数据的格式(MSB 在前还是 LSB在前)。
3.使能SPI.

SPI固件库函数

下面是初始化,必须得结构体原型

typedef struct
{
uint16_t SPI_Direction;//设置方向(2线全双工、2线只接受、一线发送、一线接受)

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;//波特率预分频(从2---256分频)

uint16_t SPI_FirstBit;//最先发送的位(最低位,还是最高位在先)

uint16_t SPI_CRCPolynomial;//设置crc多项式(数字)如7

}SPI_InitTypeDef;

下面是实例,对SPI2进行的初始化

void SPI2_Init(void)
{
SPI_InitTypeDefSPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

//配置SPI2管脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);

//SPI2配置选项
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);

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_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);

//使能SPI2
SPI_Cmd(SPI2, ENABLE);
}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

以上是,初始化的一些函数,发现固件库还有很多函数没用上,下面就要谈到应用了

STM32的SPI串行外围总线接口,本程序,是将STM32的SPI配置为全双工模式,且NSS使用的软件模式。在使用SPI前,下面的这个过程我们必须理解,即STM32作为主机发送一个字节数据时,必然能接收到一个数据,至于数据是否处理,由程序操作。


上一页 1 2 下一页

关键词:stm32SPI总

评论


技术专区

关闭