您的位置 首页 设计

STM32单片机SPI极性和相位的设置办法

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

SPI分主设备和从设备,两者经过SPI协议通讯。而设置SPI的形式,是从设备的形式,决议了主设备的形式。所以要先去搞懂从设备的SPI是何种形式,然后再将主设备的SPI的形式,设置和从设备相同的形式,即可正常通讯。关于从设备的SPI是什么形式,有两种:(1)固定的,有SPI从设备硬件决议的SPI从设备,具体是什么形式,相关的datasheet中会有描绘,需求自己去datasheet中找到相关的描绘,即:关于SPI从设备,在闲暇的时分,是高电平仍是低电平,即决议了CPOL是0仍是1;然后再找到关于设备是在上升沿仍是下降沿去采样数据,这样便是,在定了CPOL的值的前提下,对应着能够推算出CPHA是0仍是1了。举例1:CC2500-Low-CostLow-Power2.4GHzRFTransceiver的datasheet中SPI的时序图是:

STM32单片机SPI极性和相位的设置办法

从图中能够看到,最开端的SCLK和完毕时分的SCLK,即闲暇时间的SCLK,是低电平,推导出CPOL=0,然后能够看到数据采样的时分,即数据最中心的那一点,对应的是SCLK的第一个边缘,所以CPHA=0(此刻对应的是上升沿)。举例2:SSD1289-240RGBx320TFTLCDControllerDriver的datasheet中说到:“SDIisshiftedinto8-bitshiftregisteroneveryrisingedgeofSCKintheorderofdatabit7,databit6……databit0.”意思是,数据是在上升沿采样,所以能够断定是CPOL=0,CPHA=0,或许CPOL=1,CPHA=1的形式,可是至所以哪种形式。按理来说,接下来应该再去确认SCLK闲暇时分是高电平仍是低电平,用以确认CPOL是0仍是1,可是datasheet中没有说到这点。所以,此处,现在不太确认,是两种形式都支撑,仍是需求额外找依据却确认CPOL是0仍是1.(2)可装备的,由软件自己设定从设备也是一个SPI操控器,4种形式都支撑,此刻只需自己设置为某种形式即可。然后知道了从设备的形式后,再去将SPI主设备的形式,设置为和从设备形式相同,即可。 关于怎么装备SPI的CPOL和CPHA的话,不多细说,大都都是直接去写对应的SPI操控器中对应寄存器中的CPOL和CPHA那两位,写0或写1即可。举例:C8051F347中的SPI便是一个SPI的controller操控器,即支撑软件装备CPOL和CPHA的值,四种形式都支撑,此处C8051F347作为SPI从设备,设置了CPOL=1,CPHA=0的形式,因而,此处对应主芯片中的SPI操控器,作为Master主设备,其SPI的形式也要设置为CPOL=1,CPHA=0,即可。

【SPI的读写程序规划】文中标红的是特别注意看的当地首要是了解flash芯片的指令集,以及存储芯片扇区和块的了解,最重要的是擦除都是以扇区擦除的办法。

本节将运用SPI来完成对外部FLASH(W25X16)的读写,并将成果显现在TFTLCD模块上。本节分为如下几个部分:

3.17.1 SPI简介

3.17.2硬件规划

3.17.3软件规划

3.17.4下载测验

1 SPI简介

SPI是英语Serial Peripheralinterface的缩写,望文生义便是串行外围设备接口。是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极性和相位的设置办法

图3.17.1.1不一起钟相位下的总线传输时序(CPHA=0/1)

STM32的SPI功用很强壮,SPI时钟最多能够到18Mhz,支撑DMA,能够装备为SPI协议或许I2S协议。

本节,咱们将运用STM32的SPI来读取外部SPIFLASH芯片(W25X16),完成相似上节的功用。这儿对SPI咱们只简略介绍一下SPI的运用,STM32的SPI具体介绍请参阅《STM32参阅手册》第422页,22节。然后咱们再介绍下SPIFLASH芯片。

这节,咱们运用STM32的SPI1的主形式,下面就来看看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通讯了。

SPI1的运用就介绍到这儿,接下来介绍一下W25X16。W25X16是华邦公司推出的继W25X10/20/40/80(从1Mb~8Mb)后容量更大的FLASH产品,W25X16的容量为16Mb,还有容量更大的W25X32/64,ALIENTEK所挑选的W25X16容量为16Mb,也便是2M字节,同AT45DB161是相同巨细的。

W25X16将2M的容量分为32个块(Block),每个块巨细为64K字节,每个块又分为16个扇区(Sector),每个扇区4K个字节。W25X16的最少擦除单位为一个扇区,也便是每次有必要擦除4K个字节。这样咱们需求给W25X16拓荒一个至少4K的缓存区,这样对SRAM要求比较高(相关于AT45DB161来说),可是它有价格及供货上的优势。

W25X16的差些周期为10000次,具有20年的数据保存期限,支撑电压为2.7~3.6V,W25X16支撑规范的SPI,还支撑双输出的SPI,最大SPI时钟能够到75Mhz(双输出时相当于150Mhz),更多的W25X16的介绍,请参阅W25X16的DATASHEET。

2硬件规划

本节试验功用简介:开机的时分先检测W25X16是否存在,然后在主循环里边用1个按键用来履行写入W25X16的操作,别的一个按键用来履行读出操作,在TFTLCD模块上显现相关信息。一起用DS0提示程序正在运转。

所要用到的硬件资源如下:

1)STM32F103RBT6

2)DS0(外部LED0)。

3)KEY0和KEY2。

4)TFTLCD液晶模块。

5)W25X16。

前面4部分的资源,咱们前面现已介绍了,请我们参阅相关章节。这儿只介绍W25X16与STM32的衔接,板上的W25X16是直接连在STM32F103RBT6上的,衔接联系如下图:

STM32单片机SPI极性和相位的设置办法

图3.17.2.1STM32F103RBT6与W25X16衔接电路

3软件规划

翻开上一节的工程,首要在HARDWARE文件夹下新建一个FLASH的文件夹和SPI的文件夹。然后新建一个flash.c和flash.h的文件保存在FLASH文件夹下,新建spi.c和spi.h的文件,保存在SPI文件夹下,并将这两个文件夹参加头文件包括途径。

翻开spi.c文件,输入如下代码:

#include“spi.h”

//SPI口初始化

//这儿针是对SPI1的初始化

voidSPIx_Init(void)

{

RCC-》APB2ENR“=1《《2; //PORTA时钟使能

RCC-》APB2ENR|=1《《12; //SPI1时钟使能

//这儿只针对SPI口初始化

GPIOA-》CRL&=0X000FFFFF;

GPIOA-》CRL|=0XBBB00000;//PA5.6.7复用

GPIOA-》ODR|=0X7《《5; //PA5.6.7上拉

SPI1-》CR1|=0《《10;//全双工形式

SPI1-》CR1|=1《《9; //软件nss办理

SPI1-》CR1|=1《《8;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/346255.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部