嵌入式物联网之SPI接口原理与配置

  本实验采用W25Q64芯片

  W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb。该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件。W25Q64将8M字节的容量分为128个块,每个块大小为64K字节,每个块又分为16个扇区,每个扇区4K个字节。W25Q64的最小擦除单位为一个扇区,也就是每次必须擦除4K个字节。所以,这需要给W25Q64开辟一个至少4K的缓存区,这样必须要求芯片有4K以上的SRAM才能有很好的操作。

  W25Q64的擦写周期多达10W次,可将数据保存达20年之久,支持2.7~3.6V的电压,支持标准的SPI,还支持双输出/四输出的SPI,最大SPI时钟可达80Mhz。

  一。SPI接口原理

  (一)概述

  

  高速,全双工,同步的通信总线。

  全双工:可以同时发送和接收,需要2条引脚

  同步: 需要时钟引脚

  片选引脚:方便一个SPI接口上可以挂多个设备。

  总共四根引脚。

  (二)SPI内部结构简明图

  

  MISO: 做主机的时候输入,做从机的时候输出

  MOSI:做主机的时候输出,做从机的时候输入

  主机和从机都有一个移位寄存器,在同一个时钟的控制下主机的最高位移到从机的最高位,同时从机的最高位往前移一位,移到主机的最低位。在一个时钟的控制下主机和从机进行了一个位的交换,那么在8个时钟的控制下就交换了8位,最后的结果就是两个移位寄存器的数据完全交换。

  在8个时钟的控制下,主机和从机的两个字节进行了交换,也就是说主机给从机发送一个字节8个位的同时,从机也给主机传回来了8个位,也就是一个字节。

  (三)SPI接口框图

  

  上面左边部分就是在时钟控制下怎么传输数据,右边是控制单元,还包括左下的波特率发生器。

  (四)SPI工作原理总结

  

  (五)SPI的特征

  

  (六)从选择(NSS)脚管理

  

  两个SPI通信首先有2个数据线,一个时钟线,还有一个片选线,只有把片选拉低,SPI芯片才工作,片选引脚可以是SPI规定的片选引脚,还可以通过软件的方式选择任意一个IO口作为片选引脚,这样做的好处是:比如一个SPI接口上挂多个设备,比如挂了4个设备,第二个用PA2,第三个用PA3,第四个用PA4作为片选,我们 跟第二个设备进行通信的时候,只需要把第二个片选选中,比如拉低,其他设备的片选都拉高,这样就实现了一个SPI接口可以连接个SPI设备,战舰开发板上就是通过这种方法来实现的。

  (七)时钟信号的相位和极性

  

  时钟信号的相位和极性是通过CR寄存器的 CPOL 和 CPHA两个位确定的。

  CPOL:时钟极性,设置在没有数据传输时时钟的空闲状态电平。CPOL置0,SCK引脚在空闲时为低电平,CPOL置1,SCK引脚在空闲时保持高电平。

  CPHA:时钟相位 设置时钟信号在第几个边沿数据被采集

  CPHA=1时:在时钟信号的第二个边沿

  

  CPOL=1,CPHA=1, CPOL=1表示时钟信号在没有数据传输时即空闲时的状态为高电平。如果CPHA=1,那么数据就在时钟信号的第二个边沿即上升沿的时候被采集。

  CPOL= 0,CPHA=1, CPOL=0表示时钟信号在没有数据传输时即空闲时的状态为低电平。 如果CPHA=1,那么数据就在时钟信号的第二个边沿即下降沿的时候被采集。

  CPHA=0时:在时钟信号的第一个边沿

  

  CPOL=1,CPHA=0, CPOL=1表示时钟信号在没有数据传输时即空闲时的状态为高电平。如果CPHA=1,那么数据就在时钟信号的第一个边沿即下降沿的时候被采集。

  CPOL= 0,CPHA=0, CPOL=0表示时钟信号在没有数据传输时即空闲时的状态为低电平。 如果CPHA=1,那么数据就在时钟信号的第一个边沿即上升沿的时候被采集。

  为什么要配置这两个参数?

  因为SPI外设的从机的时钟相位和极性都是有严格要求的。所以我们要根据选择的外设的时钟相位和极性来配置主机的相位和极性。必须要与从机匹配。

  (八)数据帧的格式和状态标志

  

  数据帧格式:根据CR1寄存器的LSBFIRST位的设置,数据可以MSB在前也可以LSB在前。

  根据CR1寄存器的DEF位,每个数据帧可以是8位或16位。

  (九)SPI中断

  

  (十)SPI引脚配置 (3个SPI)

  

  引脚的工作模式设置

  

  引脚必须要按照这个表格配置。

  二。SPI寄存器库函数配置

  (一)常用寄存器

  

  (二)SPI相关库函数

  

  STM32的SPI接口可以配置为支持SPI协议或者支持I2S音频协议。默认是SPI模式,可以通过软件切换到I2S方式。

  常用的函数:

  1. void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);//SPI的初始化

  2. void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); //SPI使能

  3. void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); //开启中断

  4. void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState);//通 过DMA传输数据

  5. void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); //发送数据

  6. uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); //接收数据

  7. void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); //设置数据是8位还是16位

  8. 其他几个状态函数

  void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);//SPI的初始化

  

  结构体成员变量比较多,这里我们挑取几个重要的成员变量讲解一下:

  第一个参数 SPI_Direction 是用来设置 SPI 的通信方式,可以选择为半双工,全双工,以及串行发和串行收方式,这里我们选择全双工模式 SPI_Direction_2Lines_FullDuplex。

  第二个参数 SPI_Mode 用来设置 SPI 的主从模式,这里我们设置为主机模式 SPI_Mode_Master,当然有需要你也可以选择为从机模式 SPI_Mode_Slave。

  第三个参数 SPI_DataSiz 为 8 位还是 16 位帧格式选择项,这里我们是 8 位传输,选择SPI_DataSize_8b。

  第四个参数 SPI_CPOL 用来设置时钟极性,我们设置串行同步时钟的空闲状态为高电平所以我们选择 SPI_CPOL_High。

  第五个参数 SPI_CPHA 用来设置时钟相位,也就是选择在串行同步时钟的第几个跳变沿(上升或下降)数据被采样,可以为第一个或者第二个条边沿采集,这里我们选择第二个跳变沿,所以选择 SPI_CPHA_2Edge

  第六个参数 SPI_NSS 设置 NSS 信号由硬件(NSS 管脚)还是软件控制,这里我们通过软件控

  制 NSS 关键,而不是硬件自动控制,所以选择 SPI_NSS_Soft。

  第七个参数 SPI_BaudRatePrescaler 很关键,就是设置 SPI 波特率预分频值也就是决定 SPI 的时

  钟的参数 , 从不分频道 256 分频 8 个可选值,初始化的时候我们选择 256 分频值

  SPI_BaudRatePrescaler_256, 传输速度为 36M/256=140.625KHz。

  第八个参数 SPI_FirstBit 设置数据传输顺序是 MSB 位在前还是 LSB 位在前, ,这里我们选择

  SPI_FirstBit_MSB 高位在前。

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

  设置好上面 9 个参数,我们就可以初始化 SPI 外设了。

  初始化的范例格式为:

  SPI_InitTypeDef SPI_InitStructure;

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线双向全双工

  SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主 SPI

  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI 发送接收 8 位帧结构

  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//串行同步时钟的空闲状态为高电平

  371

  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二个跳变沿数据被采样

  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号由软件控制

  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //预分频 256

  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始

  SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式

  SPI_Init(SPI2, &SPI_InitStructure); //根据指定的参数初始化外设 SPIx 寄存器

  (三)程序配置步骤

  

  三。W25Qxx配置讲解

  (一)电路图

  

  片选用的PB12

  W25Q64 是华邦公司推出的大容量SPI FLASH 产品,W25Q64 的容量为 64Mb,该系列还有 W25Q80/16/32 等。ALIENTEK 所选择的 W25Q64 容量为 64Mb,也就是 8M 字节。(1M=1024K)

  W25Q64 将 8M 的容量分为 128 个块(Block),每个块大小为 64K 字节,每个块又分为 16个扇区(Sector),每个扇区 4K 个字节。W25Q64 的最少擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W25Q64 开辟一个至少 4K 的缓存区,这样对 SRAM 要求比较高,要求芯片必须有 4K 以上 SRAM 才能很好的操作。

  W25Q64 的擦写周期多达 10W 次,具有 20 年的数据保存期限,支持电压为 2.7~3.6V,W25Q64 支持标准的 SPI,还支持双输出/四输出的 SPI,最大 SPI 时钟可以到 80Mhz(双输出时相当于 160Mhz,四输出时相当于 320M),更多的 W25Q64 的介绍,请参考 W25Q64 的DATASHEET。

  在往一个地址写数据之前,要先把这个扇区的数据全部读出来保存在缓存里,然后再把这个扇区擦除,然后在缓存中修改要写的数据,然后再把整个缓存中的数据再重新写入刚才擦除的扇区中。

便于学习和参考再给大家分享些spi 的资料

stm32之SPI通信
http://www.makeru.com.cn/live/3523_1795.html?s=45051
SPI通信协议驱动norFlash
http://www.makeru.com.cn/live/4034_2151.html?s=45051

原文地址:https://www.cnblogs.com/923327iu/p/11865852.html

时间: 2024-08-25 10:53:22

嵌入式物联网之SPI接口原理与配置的相关文章

高通APQ8074 spi 接口配置

8074 平台含有两个BLSP(BAM Low-Speed Peripheral) , 每一个BLSP含有两个QUP, 每一个QUP可以被配置为I2C, SPI, UART, UIM接口, BLSP是高通对于低速接口的一种管理方式. 每个QUP是和特定的引脚相关的, 如下图所示,比如下面的引脚是属于BLSP8的, 也就是第二个BLSP的第二个QUP, 注意这些引脚只能被配置到第二个BLSP的第2个QUP上,可以通过继续查看高通相关资料 QUP的中断相关信息 得到这些信息后,如果只是要将SPI配置

SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SDO).串行数据输入(SDI).SPI总线可以实现多个SPI设备互相连接.提供SPI串行时钟的SPI

IPsec VPN原理与配置 【Route&ASA】

IPsec VPN原理与配置 简单的了解一些VPN的理论知识: 1.VPN的连接模式 VPN技术有两种传输模式:隧道模式和传输模式.这两种模式定义了两台实体设备之间传输数据时所采用的不同封装过程. (1)传输模式 传输模式一个最显著的特点就是:在传输过程中,包头并没有被封装进去,意思是从源端到目的端始终使用原有的IP地址进行通信.而传输的实际数据被封装在VPN报文中. (2)隧道模式 与传输模式的区别显而易见,VPN设备将整个三层数据报文封装在VPN数据内,再为封装过后的数据报文添加新的IP包头

三层交换工作原理及配置

三层交换机就是具有部分路由器功能的交换机,三层交换机的最重要目的是加快大型局域网内部的数据交换,所具有的路由功能也是为这目的服务的,能够做到一次路由,多次转发.三层交换技术就是二层交换技术+三层转发技术. 三层交换机工作原理 三层交换机通过硬件来交换和路由选择数据包.使用传统的MLS(多层交换)体系结构或基于CEF(Cisco快速转发)的MLS体系结构.传统的MLS是一种老式结构,而所有新型的交换机都支持CEF多层交换. 1.基于CEF的MLS CEF是一种基于扩扑的转发模型,可预先将所有路由选

STM32——SPI接口

STM32--SPI接口 宗旨:技术的学习是有限的,分享的精神的无限的. 一.SPI协议[SerialPeripheral Interface] 串行外围设备接口,是一种高速全双工的通信总线.在ADC/LCD等与MCU间通信. 1.SPI信号线 SPI 包含 4 条总线,SPI 总线包含 4 条总线,分别为SS .SCK.MOSI.MISO. (1)SS(SlaveSelect):片选信号线,当有多个 SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单独的引脚相连的,而其他

21.HCNA-HNTD——DHCP原理与配置

在大型企业网络中,会有大量的主机或设备需要获取IP地址等网络参数.如果采用手工配置,工作量大且不好管理,如果有用户擅自修改网络参数,还有可能会造成IP地址冲突等问题.使用动态主机配置协议DHCP来分配IP地址等网络参数,可以减少管理员的工作量,避免用户手工配置网络参数时造成的地址冲突. 学习目标: 1. 掌握DHCP的应用场景 2. 掌握DHCP的基本原理 3. 掌握DHCP的基本配置 DHCP的应用场景 在大型企业网络中,一般会有大量的主机等终端设备.每个终端都需要配置IP地址等网络参数才能接

深入探索spring技术内幕(二): 剖析spring管理Bean的原理与配置

求二叉树的宽度和深度 给定一个二叉树,获取该二叉树的宽度和深度. 例如输入 a / \ b c / \ / \ d e f g 返回3. 详细描述: 接口说明 原型: int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight) 输入参数: head 需要获取深度的二叉树头结点 输出参数(指针指向的内存区域保证有效): pulWidth 宽度 pulHeight 高度 返回值: 0 成功 1 失败

OSPF路由协议之多区域的原理与配置

前面学习了OSPF路由协议的基本概念.工作过程以及单域的配置,但在大型网络中,网络结构的变化是时常发生的,随着网络路径的增加,路由表变得越来越大,仅有单域是远远不够的.为了解决这个问题,OSPF允许把大型区域划分为多个更易管理的小型区域,这里就来了解一下OSPF多区域的原理及配置. 生成OSPF多区域的原因:改善网络的可扩展性,快速收敛 OSPF区域的容量 划分多区域后,每个OSPF区域里到底可以容纳多少台路由器? 单个区域所支持的路由器数量的范围大约是30-200.但在一个区域内实际加入的路由

OSPF多区域原理与配置

OSPF多区域原理与配置 n 生成OSPF多区域的原因 1. 生成OSPF多区域的原因 ? 改善网络的可扩展性 ? 快速收敛 2. OSPF区域的容量 划分多区域后,每个OSPF区域里到底可以容纳多少台路由器?单个区域所支持的路由器数量的范围大约是30-200.但在一个区域内实际加入的路由器数量要小于单个区域所能容纳路由器的最大数量.这是因为还有更为重要的一些因素影响着这个数量,诸如一个区域内链路的数量,网络拓扑的稳定性.路由器的内存和CPU性能.路由汇总的有效使用和注入到这个区域的汇总LSA的