SPI简介
SPI开发步骤
(1)使能 SPI 及对应 GPIO 端口时钟并配置引脚的复用功能 要使用 SPI 就必须使能它的时钟,前面介绍框图时,我们知道 SPI1 是挂接 在 APB2 总线上,而 SPI2 和 SPI3 挂接在 APB1 总线上。而且 SPI 总线接口对应不 同的 STM32 引脚,所以还需使能对应引脚的端口时钟,同时配置为复用功能。本 章实验使用 SPI2,所以使能 SPI2 及端口时钟函数代码如下: RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); SPI2 对应的 IO 口前面也介绍了,我们这里只需使用 SPI 的 3 条总线,片选 线使用普通 IO 即可。配置引脚复用映射代码如下: 1. /* SPI 的 IO 口设置 */ 2. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; 3. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB13/14/15 复用推挽输出 4. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 5. GPIO_Init(GPIOB, &GPIO_InitStructure); (2)初始化 SPI,包括数据帧长度、传输模式、MSB 和 LSB 顺序等 使能了 SPI 时钟后,我们就可以对 SPI 相关参数进行配置,包括数据帧长度、 传输模式、MSB 和 LSB 顺序等,这些其实都是通过 SPI_CR1 寄存器来设置,库 函数中用来初始化 SPI 的函数是: void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct); 函数中第一个参数是用来确定哪个 SPI,例如 SPI2;第二个参数是一个结构 体指针变量,结构体类型是 SPI_InitTypeDef,其内包含了 SPI 初始化的成员变 量。下面我们简单介绍下它的成员: 1. typedef struct 2. { 3. uint16_t SPI_Direction; //设置 SPI 的单双向模式 4. uint16_t SPI_Mode; //设置 SPI 的主/从机端模式 5. uint16_t SPI_DataSize; //设置 SPI 的数据帧长度,可选 8/16 位 6. uint16_t SPI_CPOL; //设置时钟极性 CPOL,可选高/低电平 7. uint16_t SPI_CPHA; //设置时钟相位,可选奇/偶数边沿采样 8. uint16_t SPI_NSS; //设置 NSS 引脚由 SPI 硬件控制还是软件控制 9. uint16_t SPI_BaudRatePrescaler;//设置时钟分频因子 10. uint16_t SPI_FirstBit; //设置 MSB/LSB 顺序 11. uint16_t SPI_CRCPolynomial; //设置 CRC 校验的表达式 12. }SPI_InitTypeDef; SPI_Direction:用于设置 SPI 的通信方向,可设置为双线全双工 (SPI_Direction_2Lines_FullDuplex),双线只接收 (SPI_Direction_2Lines_RxOnly),单线只接收(SPI_Direction_1Line_Rx)、单 线只发送模式(SPI_Direction_1Line_Tx)。本实验设置的是双线全双工,即 SPI_Direction_2Lines_FullDuplex。 SPI_Mode:用于设置 SPI 工作在主机模式(SPI_Mode_Master)或从机模式 (SPI_Mode_Slave ),这两个模式的最大区别为 SPI 的 SCK 信号线的时序, SCK 的时序是由通讯中的主机产生的。若被配置为从机模式, STM32 的 SPI 外设将 接受外来的 SCK 信号。本实验设置的是主机模式,即 SPI_Mode_Master。 SPI_DataSize:用于设置 SPI 通信的数据帧长度,可以选择 8 位 (SPI_DataSize_8b)或者 16 位(SPI_DataSize_16b)。本实验设置的是 8 位,即 SPI_DataSize_8b。 SPI_CPOL:用于设置时钟极性,可设置为高电平(SPI_CPOL_High)或低电平 (SPI_CPOL_Low )。本实验我们设置串行同步时钟的空闲状态为高电平所以选择 SPI_CPOL_High。 SPI_CPHA:用于设置时钟相位,也就是选择在串行同步时钟的第几个跳变沿 (上升或下降)数据被采样,可以为 SPI_CPHA_1Edge(在 SCK 的奇数边沿采集 数据) 或 SPI_CPHA_2Edge (在 SCK 的偶数边沿采集数据) 。 SPI_NSS:用于设置 NSS 引脚的使用模式,可以选择为硬件模式 (SPI_NSS_Hard )与软件模式(SPI_NSS_Soft ),在硬件模式中的 NSS 信号由 SPI 硬件自动产生,而软件模式则需要我们使用相应的 GPIO 端口来控制。本实验我 们使用软件模式,即 SPI_NSS_Soft。 SPI_BaudRatePrescaler:用于设置波特率分频因子,分频后的时钟即为 SPI 的 SCK 信号线的时钟频率。可设置为 fpclk 的 2、 4、 6、 8、 16、 32、 64、 128、 256 分频。本实验初始化的时候我们设置分频因子为 256 (SPI_BaudRatePrescaler_256), 传输速度为 36M/256=140.625KHz。 SPI_FirstBit:用于设置数据传输顺序是 MSB 位在前还是 LSB 位在前,本 实验我们选择 MSB 位在前,即 SPI_FirstBit_MSB。 SPI_CRCPolynomial:用于设置 CRC 校验多项式,提高通信可靠性,若我们 使用 CRC 校验时,就使用这个成员的参数(多项式),来计算 CRC 的值,我们这 里大于 1 即可。
本文详细介绍了如何在STM32微控制器上初始化SPI接口,包括配置GPIO、SPI参数设置以及启用SPI。接着,文章讲解了如何与EN25Q128闪存进行读写操作,涉及写使能、读写状态寄存器、数据传输等步骤。最后,展示了如何在主函数中控制SPI与EN25Q128的交互,实现数据的读写功能。
最低0.47元/天 解锁文章
2166

被折叠的 条评论
为什么被折叠?



