历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2019年07月30日 | STM32 SPI配置

2019-07-30 来源:eefocus

用stm32的库进行深入


SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

四根线

MISO 主设备数据输入,从设备数据输出。

MOSI 主设备数据输出,从设备数据输入。

SCLK时钟信号,由主设备产生。

CS从设备片选信号,由主设备控制。


外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节


时钟极性CPOL对传输协议没有重大的影响,代表串行同步时钟的空闲状态下的电平。

时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。

SPI主模块和与之通信的外设备时钟相位极性应该一致。


使用STM32的SPI读取SPIFLASH芯片(W25Q64),

第一步  配置SPI引脚 使能引脚及SPI时钟


第二步 配置SPI---工作模式+数据格式+时钟频率、极性


 设置为主机模式

 数据格式-8位

 SCK时钟极性及采样方式

 SPI时钟频率

 数据格式-MSB在前还是LSB在前


typedef struct

{

uint16_t SPI_Direction;

uint16_t SPI_Mode; 

uint16_t SPI_DataSize; 

uint16_t SPI_CPOL; 

uint16_t SPI_CPHA; 

uint16_t SPI_NSS;   

uint16_t SPI_BaudRatePrescaler;  

uint16_t SPI_FirstBit;    

uint16_t SPI_CRCPolynomial; 

}SPI_InitTypeDef;

SPI_Direction;通信方式(全双工,半双工,串行发串行收)

 SPI_Mode:主还是从  ,模式选择,SPI_Mode_Master or SPI_Mode_Slave

SPI_DataSize:数据帧长度选择,8位或16位

SPI_CPOL:时钟极性,(空闲态的电平)

SPI_CPHA:时钟相位,串行时钟第一个跳变沿采样数据,或第二个跳变沿~~SPI_CPHA_2Edge

SPI_NSS:NSS信号由硬件控制还是软件控制,这里SPI_NSS_Soft

SPI_BaudRatePrescaler:设置SPI波特率预分频值,也就是决定SPI的时钟的参数,从不分频道256分频8个可选值,初始化的时候我们选择256分频值SPI_BaudRatePrescaler_256, 传输速度为36M/256=140.625KHz。

SPI_FirstBit:数据传输顺序,MSB在前或LSB在前

SPI_CRCPolynomial:是用来设置CRC校验多项式,提高通信可靠性,大于1即可。


9个参数。

定义这个结构,

SPI_InitTypeDef  SPI_InitStructure;

每个参数都选合适了

调用SPI_Init(SPI2,&SPI_InitStructure);

根据指定的参数初始化外设SPIx寄存器,


初始化完了,还有个开关,现在我们来使能这个SPI2口通信,

SPI_Cmd(SPI2,ENABLE);

使能这个外设


现在可以用了,发数据吧,

void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);

uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);


发数据,接收数据,传输传输,我们经常要判断这个数据是否传输完成了,是不是,发送区是否为空等等,

SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE);


引脚介绍

SPI 包含 4 条总线,SPI 总线包含 4 条总线,分别为

——SS 、SCK、MOSI、MISO。它们的作用介绍如下 :

1)SS ( Slave Select):片选信号线,当有多个 SPI 设备与 MCU 相连时,每个设备

的这个片选信号线是与 MCU 单独的引脚相连的,而其他的 SCK、MOSI、MISO线则为多个设备并联到相同的 SPI 总线上,见图 15- 1。当 SS 信号线为低电平时,片选有效,开始SPI 通信。

2)SCK (Serial Clock):时钟信号线,由主通信设备产生,不同的设备支持的时钟

频率不一样,如 STM32 的 SPI 时钟频率最大为 f PCLK /2。

3)MOSI (MasterOutput, Slave Input):主设备输出 / 从设备输入引脚。主机的数据

从这条信号线输出,从机由这条信号线读入数据,即这条线上数据的方向为主机到从机。

4)miso主设备输入/ 从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号线输出,即在这条线上数据的方向为从机到主机。


GPIO配置


硬件连接

编程要点

初始化了 SPI1 复用到的 GPIO 引脚,启动了 GPIO 及 SPI1 外设

的时钟,并初始化了 SPI 的模式


1)SPI_Mode :STM32 的 SPI 设 备 可 以 工 作 于 主 机 模 式(SPI_Mode_Master)

或 从 机 模 式(SPI_Mode_Slave),这两个模式的最大区别为 SPI 的 SCK 信号线的时序,SCK 的时序是由通信中的主机产生的。若被配置为从机模式,STM32 的 SPI 模块将接受外来的 SCK 信号。本实验中 STM32 作为 SPI 通信中的主机,我们向这个成员赋值为主机模式(SPI_Mode_Master)。


2)SPI_DataSize :这个成员可以选择 SPI 每次通信的数据大小(称为数据帧)为8 位

还是 16 位。从 Flash 的数据手册我们可以查到,本 Flash 通信的数据帧大小为 8 位,

STM32 的 SPI 模块设置要与之相同。


3)SPI_CPOL 和 SPI_CPHA :这 两 个 成 员 即 配 置 SPI 的 时 钟 极 性(CPOL) 和

时 钟 相 位(CPHA),这两个配置影响到 SPI 的通信模式,该设置要符合将要互相通信的设备的要求。CPOL 分别可以取 SPI_CPOL_High(SPI 通信空闲时 SCK 为高电平)和

SPI_CPOL_Low(SPI 通信空闲时 SCK 为低电平)。CPHA则可以取 SPI_CPHA_1Edge

(在 SCK 的奇数边沿采集数据) 和 SPI_CPHA_2Edge (在 SCK 的偶数边沿采集数

据) 。


查阅本 Flash 的使用手册,见图 15- 6。可以了解到这个 Flash 支持以 SPI 的模式 0 和模式 3通信。即在 SPI 空闲时,SCK 为低电平,奇数边沿采样(模式 0);也可以在 SPI 空闲时,SCK 为高电平,偶数边沿采样(模式 3)。即无论 CPOL 的状态是什么,Flash的数据采样时刻为 SCK 的上升沿。我们在本实验配置使用它的模式 3,即把 CPOL 赋值为

SPI_CPOL_High ;2)4 ) SPI_NSS : 本 成 员 配 置 NSS 引 脚 的 使 用 模 式 , 可 以 选 择 为 硬 件 模 式(SPI_NSS_Hard )与软件模式(SPI_NSS_Soft),在硬件模式中的 SPI 片选信号由硬件自动产生,而软件模式则需要我们亲自把相应的 GPIO 端口拉高或置低产生非片选和片选信号。如果外界条件允许,硬件模式还会自动将 STM32 的 SPI 设置为主机。本实验使用软件模式,向这个成员赋值为 SPI_NSS_Soft 。


5)SPI_BaudRatePrescaler :本成员设置波特率分频值,分频后的时钟即为 SPI 的 SCK

信号线的时钟频率。这个成员参数可设置为 f PCLK 的 2、4、6、8、16、32、64、128、

256 分频。本实验向这个成员赋值为 SPI_BaudRatePrescaler_4,即 f PCLK 的 4 分频。


6)SPI_FirstBit :所有串行的通信协议都会有 MSB 先行(高位数据在前)还是 LSB

先行(低位数据在前)的问题,而 STM32 的 SPI 模块可以通过这个结构体成员,对这个特性 编 程 控 制 。 据 Flash 的 通 信 时 序 , 我 们 向 这 个 成 员 赋 值 为 MSB 先 行

(SPI_FirstBit_MSB)。


7)SPI_CRCPolynomial :这是 SPI 的 CRC 校验中的多项式,若我们使用 CRC 校验

时,就使用这个成员的参数(多项式)来计算 CRC 的值。由于本实验的 Flash 不支持 CRC校验,所以我们向这个结构体成员赋值为7 实际上是没有意义的。


配置完这些结构体成员后,我们要调用SPI_Init() 函数把这些参数写入寄存器中,实现

SPI 的初始化,然后调用


CPOL       是空空闲时电平          选择高还是低得看Datasheet时序图


CPHA      第几个边沿有效          看时钟哪个边沿在数据中间穿过


推荐阅读

史海拾趣

EOS POWER INDIA Pvt公司的发展小趣事

在稳固了印度市场后,EOS开始积极拓展国际市场。公司参加了多个国际电子展会,与全球各地的客户和合作伙伴建立了广泛的联系。通过与国际知名企业的合作与交流,EOS不断吸收先进的管理经验和技术理念,并将其应用到自己的产品和服务中。这些举措不仅提升了EOS的国际知名度,还为公司带来了更多的商业机会。

FILTRONIC公司的发展小趣事

随着市场需求的不断增长,FILTRONIC开始着手拓展产品线,从单一的滤波器产品扩展到包括射频模块、天线等在内的多种无线通信产品。同时,公司也积极实施国际化战略,通过参加国际展会、设立海外办事处等方式,逐步打开了国际市场的大门。FILTRONIC的产品以其卓越的性能和可靠的质量赢得了全球客户的信赖,公司也因此实现了业务的快速增长。

Dow-Key Microwave Corporation公司的发展小趣事

1945年,第二次世界大战结束后不久,Dow-Key Microwave Corporation在美国成立。公司创始人凭借对射频和微波技术的深刻理解和市场需求的敏锐洞察,决定专注于射频微波开关的制造。在初创阶段,公司面临资金短缺、技术挑战和市场接受度不高等问题。然而,创始人及其团队凭借不懈的努力和创新的精神,逐渐克服了这些困难,为公司的发展奠定了坚实的基础。

FETek Technology(东沅)公司的发展小趣事

在半导体测试领域取得成功后,东沅并没有停止前进的步伐。他们开始关注新兴的电子行业趋势,并决定拓展新的业务领域。例如,他们开始研发和生产与电源管理相关的Power Mosfet产品,这些产品具有高效能、高可靠度和价格优势等特点,迅速在市场上占据了一席之地。此外,东沅还积极拓展射频和模拟芯片领域的研发和销售,为客户提供更全面的解决方案。

台湾唯圣(GW)公司的发展小趣事
电路设计应遵循相关的行业标准和安全规范,确保各元器件的选型、布局和连接方式合理可靠。
德欣(COV)公司的发展小趣事

面对电子行业的快速发展和市场竞争的加剧,德欣公司始终将技术创新作为发展的核心动力。公司不断加大研发投入,引进先进的生产设备和技术人才,加强与高校和科研机构的合作。通过不断的技术创新和产品升级,德欣公司在保持传统产品优势的同时,也成功拓展了新的业务领域,实现了产业升级和可持续发展。

问答坊 | AI 解惑

数码摄像机磁头堵塞解决办法

关键字:摄像机     家用数码摄像机在拍摄过程中(如旅游、婚庆、生日、聚会等),最怕的就是突然出现故障,因为一旦出现故障,轻则影响拍摄活动,重则整个拍摄过程无法进行。     磁头堵塞就是数码摄像机最常见的故障之一, ...…

查看全部问答>

关于IC存放事宜

一、IC真空密封包装的储存期限: 1、请注意每盒真空包装密封日期; 2、保存期限:12个月,储存环境条件:在温度 < 40℃,湿度 < 90% R.H; 3、库存管制:以“先进先出”为原则。 二、IC包装拆封后,SMT组装的时限:  1、检查湿度卡:显示 ...…

查看全部问答>

关于VREF管脚的连接问题

用的是Altera的EP2S30系列的FPGA芯片,需要用到DDR SDRAM,需要接SSTL2电压标准,不知道VREF怎么连接,是不是VREF连到1.25V的话,VCCIO必须连到2.5V,不能连到3.3V。如果这样的话岂不是一个bank内除了DDR SDRAM以外其他的脚都不能用了请有经验的大 ...…

查看全部问答>

流式驱动的电源管理是怎么做的呀?

在WINCE中,如果进入SLEEP状态,会不会调用流式驱动中的SHC_PowerDown函数呀?谢谢 !…

查看全部问答>

ce 5.0 模拟器的问题

如何将一个程序放到wince 5.0 的模拟器中运行呢。 即通过evc启动模拟器,怎么才能将一个程序加载到模拟器中呢。…

查看全部问答>

wince5 evc4 实现半透明图片

    我在Test1Dlg.cpp 文件中 使用 lphaBlend 函数 也导入了以下头文件和 lib #pragma comment (lib,\"Coredll.lib\") #include 出现错误误码: Test1Dlg.cpp E:\\Test1\\Test1Dlg.cpp(97) : error C2065: \'AlphaBlend\' : unde ...…

查看全部问答>

博通电子专业制作430开发板

QQ:37955698     技术交流QQ群:7757652 msp430@botom.cn 电话:13261892076 最新产品:    MSP430开发板 学习板:           MSP430F44X开发板       & ...…

查看全部问答>

MC55硬件启动问题

看到资料和网上都是说的用单片机控制MC55的启动,但是我看有的产品没有单片机,上电后自己可以启动,请问具体是如何实现的,谢谢…

查看全部问答>

【求助】keilc编程 8958cpu 定义片外空间地址变量

8958cpu 定义片外空间地址变量 怎么定义 用什么数据类型好些。 我想定义 1个数组全局变量 2个数组局部变量 大小是[24]一维 [4][24]二维。…

查看全部问答>

如何提取两个方波的时间差?

想要在FPGA中提取两个方波的相位差,两个方波频率约为1HZ,时间差比较小,然后用50MHZ的时钟计算时间差 用异或门的话同一周期会出现两个相位差 请问各位知道有更好的方法吗?   采用异或门: [ 本帖最后由 open82977352 于 2011-9-1 ...…

查看全部问答>