STM32学习重点spi_第1页
STM32学习重点spi_第2页
STM32学习重点spi_第3页
STM32学习重点spi_第4页
STM32学习重点spi_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、SPI简介SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32也有SPI接口。SPI接口一般使用4条线: MISO 主设备数据输入,从设备数据输出。MOSI

2、主设备数据输出,从设备数据输入。SCLK时钟信号,由主设备产生。CS从设备片选信号,由主设备控制。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。SPI总线四种工作方式 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步

3、时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。不同时钟相位下的总线数据传输时序见下图:二、STM32的SPI介绍STM32的SPI功能很强大,SPI时钟最多可以到18Mhz,支持DMA,可以配置为SPI协议或者I2S协议。本节,我们将利用STM32的SPI来读取外部SPI FLASH芯片(W25X16),这节,我们使用STM32的SPI1的主模式, STM32的主模式配置步骤如下: 1)配置相关引脚的复用功能,使能SPI1时钟。我们要用SPI1,第一步就要是能SPI1的时

4、钟,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的bi

5、t6来设置,以启动SPI1,在启动之后,我们就可以开始SPI通讯了。Spi.h文件的内容:#ifndef _SPI_H_#define _SPI_H_#include "stm32f10x.h"#define SPI_CE_H() GPIO_SetBits(GPIOE, GPIO_Pin_6) #define SPI_CE_L() GPIO_ResetBits(GPIOE, GPIO_Pin_6)#define SPI_CSN_H() GPIO_SetBits(GPIOE, GPIO_Pin_7)#define SPI_CSN_L() GPIO_ResetBits(GPIO

6、E, GPIO_Pin_7)void SPI2_Init(void);u8 Spi_RW(u8 dat);#endifSpi.c 文件内容:#include "spi.h"void SPI2_Init(void) GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );/PORTB时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENA

7、BLE );/SPI2时钟使能 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC, ENABLE); /使能PE/C端口时钟/*配置 SPI_NRF_SPI的 SCK,MISO,MOSI引脚,GPIOB13,GPIOB14,GPIOB15 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用推挽输出 GPIO_InitS

8、tructure.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;/PE6 7 推挽 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GP

9、IO_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_Direc

10、tion = 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

11、= 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); /* Enable SPI2 */ SPI_Cmd(SPI2, ENABLE);u8 Spi_RW(u8 dat) /* 当 SPI发送缓冲器非空时等待 */ while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) = RESET); /* 通过 SPI2发送一字节数据 */ SPI_I2S_Se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论