最新STM32学习重点spi剖析.docx
《最新STM32学习重点spi剖析.docx》由会员分享,可在线阅读,更多相关《最新STM32学习重点spi剖析.docx(6页珍藏版)》请在冰豆网上搜索。
最新STM32学习重点spi剖析
一、SPI简介
SPI是英语SerialPeripheralinterface的缩写,顾名思义就是串行外围设备接口。
是Motorola首先在其MC68HCXX系列处理器上定义的。
SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32也有SPI接口。
SPI接口一般使用4条线:
MISO主设备数据输入,从设备数据输出。
MOSI主设备数据输出,从设备数据输入。
SCLK时钟信号,由主设备产生。
CS从设备片选信号,由主设备控制。
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文件内容:
#include"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,&GPIO_InitStructure);//初始化指定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,&GPIO_InitStructure);
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);
}