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

发布时间:2023-10-24  

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;


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    要相等,这是振幅平衡条件。二是 Uf 和 Ui 必须相位相同,这是相位平衡条件,也就是说必须保证是正反馈。一般情况下,振幅平衡条件往往容易做到,所以在判断一个振荡电路能否振荡,主要是看它的相位平衡条件......
    为 ,相位平衡条件为 82、信号发生器原理是在电路负反馈时 ,例如 自激......
    磁直流电机怎么判断好坏 永磁直流电机是有刷还是无刷;  永磁直流电机怎么判断好坏   永磁直流电机坏了通常会出现以下一些状况:   电机无法转动或转动缓慢:如果电机无法转动或转动缓慢,可能......
    不间断电源系列的最新成员解决了将单相负载连接到飞机和船舶上的三相电力系统的独特挑战。 UPS-1500-x-1U-4 可按照 MIL-STD-1399-300B 规定的严格要求来平衡相电流,其中船舶的相位平衡......
    MOS管的三个极怎么判定?;相信很多工程师在使用电子测量仪器的时候大家都了解,下面一起看看究竟是什么。本文引用地址: 1. MOS的三个极怎么判定? 符号上的三个脚,辨认......
    单相电机的主副绕组怎么判断_单相电机主绕组为什么电阻小;  单相电机的主副绕组怎么判断   判断单相电机的主副绕组可以通过以下方法:   通过电阻值判断:单相电机的主副绕组的电阻值通常是不同的。可以......
    所示: 当然上述对于Vref的合成,需要先知道 Vref在哪个扇区,具体怎么判断? 不难联想到高中所学过的线性规划把V1V6, V3V4, V2V5看成三条直线,用α,β表示这三条直线方程,那么有: 直线......
    三相电机通电不转没有反应 电机不通电怎么判断好坏;  三相电机通电不转没有反应       如果三相电机通电不转,没有反应,通常可能是以下几种原因造成的:   电源故障:首先......
    转换值       一.ADC初始化   A.选择转换通道-     B.设置转换频率      怎么判断开始转换了?用一个whlie循环,查询ENABLE_START是否变成0    怎么判断......
    频率与被测量往往是非线性关系,需要进行线性化处理 三、测试方法: 1、闭环测试法: · 通过一个正反馈网路将输出信号反馈到激励端,调制幅度与相位平衡,实现连续等幅度自激振荡,直接输出谐振频率 · 测试......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>