最新STM32学习重点spi剖析文档格式.docx
《最新STM32学习重点spi剖析文档格式.docx》由会员分享,可在线阅读,更多相关《最新STM32学习重点spi剖析文档格式.docx(6页珍藏版)》请在冰点文库上搜索。
SPI主要特点有:
可以同时发出和接收串行数据;
可以当作主机或从机工作;
提供频率可编程时钟;
发送结束中断标志;
写冲突保护;
总线竞争保护等。
SPI总线四种工作方式SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。
如果CPOL=0,串行同步时钟的空闲状态为低电平;
如果CPOL=1,串行同步时钟的空闲状态为高电平。
时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。
如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;
如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。
SPI主模块和与之通信的外设备时钟相位和极性应该一致。
不同时钟相位下的总线数据传输时序见下图:
二、STM32的SPI介绍
STM32的SPI功能很强大,SPI时钟最多可以到18Mhz,支持DMA,可以配置为SPI协议或者I2S协议。
本节,我们将利用STM32的SPI来读取外部SPIFLASH芯片(W25X16),这节,我们使用STM32的SPI1的主模式,STM32的主模式配置步骤如下:
1)配置相关引脚的复用功能,使能SPI1时钟。
我们要用SPI1,第一步就要是能SPI1的时钟,SPI1的时钟通过APB2ENR的第12位来设置。
其次要设置SPI1的相关引脚为复用输出,这样才会连接到SPI1上否则这些IO口还是默认的状态,也就是标准输入输出口。
这里我们使用的是PA5、6、7这3个(SCK.、MISO、MOSI,CS使用软件管理方式),所以设置这三个为复用IO。
2)设置SPI1工作模式。
这一步全部是通过SPI1_CR1来设置,我们设置SPI1为主机模式,设置数据格式为8位,然后通过CPOL和CPHA位来设置SCK时钟极性及采样方式。
并设置SPI1的时钟频率(最大18Mhz),以及数据的格式(MSB在前还是LSB在前)。
3)使能SPI1。
这一步通过SPI1_CR1的bit6来设置,以启动SPI1,在启动之后,我们就可以开始SPI通讯了。
Spi.h文件的内容:
#ifndef_SPI_H_
#define_SPI_H_
#include"
stm32f10x.h"
#defineSPI_CE_H()GPIO_SetBits(GPIOE,GPIO_Pin_6)
#defineSPI_CE_L()GPIO_ResetBits(GPIOE,GPIO_Pin_6)
#defineSPI_CSN_H()GPIO_SetBits(GPIOE,GPIO_Pin_7)
#defineSPI_CSN_L()GPIO_ResetBits(GPIOE,GPIO_Pin_7)
voidSPI2_Init(void);
u8Spi_RW(u8dat);
#endif
Spi.c文件内容:
spi.h"
voidSPI2_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//PORTB时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
//SPI2时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC,ENABLE);
//使能PE/C端口时钟
/*配置SPI_NRF_SPI的SCK,MISO,MOSI引脚,GPIOB^13,GPIOB^14,GPIOB^15*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
//复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&
GPIO_InitStructure);
/*配置SPI_NRF_SPI的CE引脚PE6,和SPI_NRF_SPI的CSN引脚PE7:
*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
//PE67推挽
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&
//初始化指定IO
/*配置SPI_NRF_SPI的IRQ引脚,*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
//下拉输入
GPIO_Init(GPIOC,&
SPI_CSN_L();
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
//双线全双工
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
//主模式
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
//数据大小8位
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
//时钟极性,空闲时为低
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
//第1个边沿有效,上升沿为采样时刻
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
//NSS信号由软件产生
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16;
//SPI_BaudRatePrescaler_88分频,9MHz
市场环境所提供的创业机会是客观的,但还必须具备自身的创业优势,才能使我们的创业项目成为可行。
作为大学生的我们所具有的优势在于:
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
//高位在前
SPI_InitStructure.SPI_CRCPolynomial=7;
//CRC值计算的多项式
SPI_Init(SPI2,&
SPI_InitStructure);
(五)DIY手工艺品的“价格弹性化”/*EnableSPI2*/
SPI_Cmd(SPI2,ENABLE);
大学生购买力有限,即决定了要求商品能价廉物美,但更注重的还是在购买过程中对精神文化爱好的追求,满足心理需求。
}
u8Spi_RW(u8dat)
培养动手能力□学一门手艺□打发时间□兴趣爱好□{
/*当SPI发送缓冲器非空时等待*/
(5)资金问题while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
(2)东西全/*通过SPI2发送一字节数据*/
SPI_I2S_SendData(SPI2,dat);
3、消费“多样化”/*当SPI接收缓冲器为空时等待*/
(3)心态问题while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
3、消费“多样化”/*ReturnthebytereadfromtheSPIbus*/
9、如果你亲戚朋友送你一件DIY手工艺制品你是否会喜欢?
returnSPI_I2S_ReceiveData(SPI2);