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

嵌入式物联网之SPI接口原理与配置,第1张

本实验采用W25Q64芯片

W25Q64是华邦公司推出的大容量SPI

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

W25Q64的擦写周期多达10W次,可将数据保存达20年之久,支持27~36V的电压,支持标准的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=140625KHz。

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

SPI_FirstBit_MSB 高位在前。

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

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

初始化的范例格式为:

SPI_InitTypeDef SPI_InitStructure;

SPI_InitStructureSPI_Direction = SPI_Direction_2Lines_FullDuplex;

//双线双向全双工

SPI_InitStructureSPI_Mode = SPI_Mode_Master; //主 SPI

SPI_InitStructureSPI_DataSize = SPI_DataSize_8b; // SPI 发送接收 8 位帧结构

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

371

SPI_InitStructureSPI_CPHA = SPI_CPHA_2Edge;//第二个跳变沿数据被采样

SPI_InitStructureSPI_NSS = SPI_NSS_Soft; //NSS 信号由软件控制

SPI_InitStructureSPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //预分频

256

SPI_InitStructureSPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始

SPI_InitStructureSPI_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 年的数据保存期限,支持电压为 27~36V,W25Q64 支持标准的

SPI,还支持双输出/四输出的 SPI,最大 SPI 时钟可以到 80Mhz(双输出时相当于 160Mhz,四输出时相当于 320M),更多的 W25Q64

的介绍,请参考 W25Q64 的DATASHEET。

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

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

stm32之SPI通信

>看方向
如果选择嵌入式硬件开发,就不懂了
软件开发的话,分底层和应用层
我是从事wince驱动开发的(快满一年),
以wince为例,底层就是boot、bsp修改、驱动开发这几部分
学习路线:
1、买个开发板
2、按照开发板上的例子玩玩,ARM汇编稍微能看懂,写点简单的程序跑跑,对汇编有个大概的了解,bootloader等等会多少涉及点汇编的东西
然后就是开发板上的一些驱动玩玩。如果可以拿相似的BSP移植到开发板上就更好了,对BSP就有更多的认识了,学完以上可能可以找到工作,在工作中进一步加深理解
如果是应用的话,wince,我们写应用用的是VS2005,VC++,和PC的开发基本差不多
学完一个 *** 作系统,切换到另一个平台相对而言还是蛮快的,基本都是相通的
我之前的经验是,我买了开发板玩了ADS程序写了小型的程序,就是把LED啊、液晶屏啊、等等驱起来,然后,在linux下玩驱动,写了几个简单的流驱动,去应聘,鬼使神差被招进去玩wince驱动了,感觉差得不是很多,玩了2周就开始上手,2个月之后,底层这块就都扔给我了
以上,仅供参考(至于开发板,如果是消费电子类的,好像三星的S3C系列用的人比较多,开发板也很多,工业类的就不懂了。至于选哪家开发板厂家,百度google一下)

开发之间的重要问题

这些问题对物联网应用开发人员很重要。哪一种才是最好的方法,来构建一个“物联网应用”,它可以做很多事情,从远程控制家庭应用到对引擎改动机制造商发送通知,而这一需要维护服务的引擎有个能在世界任何一个地方?开发人员要具备怎样的技能?要从哪里先开始?

物联网应用开发的始占在于它本身。这些边缘设备通常没有屏幕(尽管并非总是如此)、处理器功耗低,搭载的是某种嵌入式 *** 作系统,使用一个或多个通信协议进行交流(通常是无线)。这些东西可能直接与网络、相邻事物和网络网关相连,一般外形就是一个盒子带一些闪闪发光的灯。

系统的下一层即集成层是软件和基础设施,运行在企业数据中心或云中,来从各种事物中接收和管理数据流。运行在集成层的软件通常也负责管理这些事物,必要时更新固件。

接下来就分析层,用于管理并处理数据。最后,还有一个终端用户层,这一层上应用程序用于用户之间交流。这些可能是企业应用、可能是网络应用,也可能是移动应用。

如果你正在想办法构建物联网应用,最后两层将会是你接触最多的。作为开发人员,你可能没有工具处理这些边缘设备或网关,或者没有适应集成层的能力。

这也就是为什么说构建应用程序要从已经就绪的“物联网平台”开始是有道理的了。这些平台通常包含集成层,这一层承载着以时间为序列输入的数据,以及分析层、自动精简配置,激活和管理功能,实时消息总线和建立其上的平台和应用之间的通信API。

现在市场上有许多公司都在提供这类平台。这有Xively、Mnubo、BugLabs和ThingWorx,他们都有能力与不同的制造商产生的大量“事物”进行沟通。

还有些比较有名的公司,如微软的智能系统服务,和企业软件厂商如SAP的物联网解决方案,这些厂商都在他们的产品中增加了物联网功能。

物联网软件工程师也是属于软件工程师的一种,只是在软件工程师上面细分了一些;物联网工程师,主要方面在于硬件的嵌入式开发比较多;如现在很多热门的智能手表、智能手环、智能扫地机之类的都属于物联网软件工程师开发的。

软件工程师是一个广义的概念,包括软件设计人员、软件架构人员、软件工程管理人员、程序员等一系列岗位,工作内容都与软件开发生产相关。软件工程师的技术要求是比较全面的,除了最基础的编程语言(C语言/C/JAVA等)、数据库技术(SQL/ORACLE/DB2等)等,还有诸多如JAVASCRIPT、AJAX、HIBERNATE、SPRING等前沿技术。此外,关于网络工程和软件测试的其他技术也要有所涉猎。

嵌入式系统需要学C语言编程。

根据中国物联网校企联盟的建议,学习嵌入式系统的必备知识与学习方法如下:

1、C开发经验

条件:Linux。方法:主要是掌握ANSIC编程(不包括gtk,qt等图形可视化开发)

2、网络、 *** 作系统、体系结构

条件:Linux,各种书,算法、例程。方法:通过C编程实现简单的网络等知识的算法和过程。

3、嵌入式系统概念

条件:各个嵌入式网站,讨论组,书籍。方法:少提问,多留给自己思考的空间。

4、嵌入式开发实践

条件:各种嵌入式系统开发工具的demo版,包括编译器,仿真器。

方法:一个是基于MCU/MDSP的嵌入式系统开发,另一个是像PalmOS,WinCE,uC/OSII等RTOS下的应用软件开发。第一个是针对硬件开发而言的,而第二个则是针对软件开发而言的。

扩展资料

发展趋势:

1、嵌入式开发是一项系统工程,因此要求嵌入式系统厂商不仅要提供嵌入式软硬件系统本身,同时还需要提供强大的硬件开发工具和软件包支持。

目前很多厂商已经充分考虑到这一点,在主推系统的同时,将开发环境也作为重点推广。比如三星在推广Arm7,Arm9芯片的同时还提供开发板和板级支持包(BSP)。

而WindowCE在主推系统时也提供EmbeddedVC作为开发工具,还有Vxworks的Tonado开发环境,DeltaOS的Limda编译环境等等都是这一趋势的典型体现。当然,这也是市场竞争的结果。

2、网络化、信息化的要求随着因特网技术的成熟、带宽的提高日益提高,使得以往单一功能的设备如电话、手机、冰箱、微波炉等功能不再单一,结构更加复杂。

物联网和5G都是最近很热门的话题。随着5G的推广,万物互联的时代也越来越近了。

物联网归根到底依赖于嵌入式开发的支撑。其实嵌入式这个概念非常的广,几乎可以包括各行各业,从工作类型最常见的是分为嵌入式硬件工程师和嵌入式软件工程师。

就岗位需求量而言,嵌入式开发的岗位需要肯定要随着物联网的普及有一定的增长。

就岗位工资待遇而言,虽然这与企业所处的地域、行业、企业的性质和人员的工作岗位有关,但总体而言,这个岗位的开发人员在所有行业内工资待遇还是比较靠前的,和普通互联网行业开发人员工资较为接近。

不过嵌入式行业入门有一定的门槛,需要一定的技术和经验积累,才能基本胜任嵌入式开发的工作。

嵌入式系统是电子信息产业的基础,是智能系统的核心,广泛应用于工业控制、 汽车 电子、智能家居、医疗器械和智能穿戴设备等众多领域。伴随物联网和人工智能的快速发展,嵌入式系统在智能系统中发挥着越来越大的作用。

随着物联网的快速发展,应用环境的复杂化,特别是嵌入式AI的需求,随着微电子技术的飞速发展,嵌入式系统内核架构种类繁多,如MCS-51架构、MIPS架构、PowerPC架构、ARM架构以及现在比较火的RISC-V架构,随着用户对产品功能多元化的追求,对更低功耗、更人性化的人机交互界面以及多任务等需求的增加,传统的基于MCS-51架构的8位51单片机,无论是处理能力还是存储能力都已无法满足此类复杂的应用。ARM公司针对通用MCU(微控制器)领域成功推出了32位的Cortex-M系列内核,而各大半导体厂商(如NXP、TI、ST、Atmel等)纷纷基于该内核针对不同的应用领域开发出了各具特色的MCU。采用标准化内核,一方面降低了半导体芯片厂商在芯片架构上的研发难度,缩短了产品推向市场的时间;另一方面,由于采用同样的ARM内核,为了实现产品的差异化,使得各大半导体厂商将研发重点放在了外设接口、功耗、存储器资源等方面,针对各自优势应用领域推出系列化的产品。从嵌入式开发者的角度来看,这种方式降低了开发人员学习和掌握MCU应用开发的难度,学习者只需要针对通用的内核就某种MCU深入研究,掌握其精髓,就能融会贯通。采用统一的标准化内核设计和生产MCU产品已成为嵌入式MCU发展的趋势。

ARM公司还与各大半导体厂商深度合作,在与芯片相关的开发工具和软件解决方案上形成了一条良好的、完整的生态产业链/生态系统,不仅为嵌入式开发人员提供了一系列高效易用的开发工具(如Keil、IAR等),而且提供了丰富的资源(如OS、固件库、应用例程等),在提高开发效率、降低开发成本、缩短开发周期等关键环节具有明显的优势,如ST公司针对Cortex-M内核开发的STM32系列产品,为STM32的开发提供了各种固件库,如标准外设库、HAL库、LL库等,这些位于嵌入式组成结构中间层的库文件屏蔽了复杂的寄存器开发,使得嵌入式开发人员通过调用API函数的方式就能迅速搭建系统原型。目前,基于库的开发方式已成为嵌入式系统开发的主流模式。

嵌入式技术作为物联网的底层支撑技术,是物联网的核心技术之一,物联网的底层和感知层都涉及到嵌入式系统中微控制器及外围接口的驱动开发技术,在当前物联网与移动互联网、人工智能、大数据相融合的趋势下,以智能制造、智能家居、智能交通、智慧医疗为代表的物联网应用领域,对嵌入式技术人才需求越来越大,嵌入式AI正以蓬勃姿态迎接未来。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/10372213.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-08
下一篇 2023-05-08

发表评论

登录后才能评论

评论列表(0条)

保存