STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)

发布者:w2628203123最新更新时间:2017-02-05 来源: eefocus关键字:STM32F10x_SPI  硬件接口  软件模拟  读写Flash 手机看文章 扫描二维码
随时随地手机看文章

Ⅰ、写在前面

SPI(Serial Perripheral Interface)串行外设通信接口,主要实现设备(主从)之间的通信。硬件上由CS、SCK、MISO、MOSI四根通信线连接而成。关于SPI更多介绍不再详细描述,本文主要以STM32F103为主机、W25Q16为从机进行SPI通信实验。

 

本文将提供STM32硬件SPI、软件模拟SPI两实例工程代码供大家参考、掌握两种方式的区别。

STM32硬件SPI:控制简单、运行效率高、使用方便等。

软件模拟SPI:移植性强,只需要简单修改接口,就能在其他MCU芯片(如:51、430等)上使用。

 

实例实验效果:

两个实例SPI通信控制方式不一样,但实验效果是一样的。

W25Q16设备ID:

上电,读取W25Q16设备ID,并通过串口打印出来;

 

写数据:

SFLASH_WriteNByte((uint8_t*)"ABCDEF", 0, 6); 通过该函数在W25Q16的0地址处 连续写入6字节“ABCDEF”数据。(测试的时候:第一次下载之后让程序运行一次,即写入W25Q16数据。再将该函数屏蔽、下载。断电重新让程序运行看读出来的数据是否是前面写入的数据)

 

读数据:

SFLASH_ReadNByte(read_buf, 0, 6); 通过该函数从W25Q16的0地址连续读取6字节数据,保存在read_buf里面。(地址、数据及数据长度都可以修改,但读写的地址要相同,读出来的数据才是写入的数据)

 

 

关于本文的更多详情请往下看。

 

Ⅱ、实例工程下载

笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

 

提供下载的软件工程是基于Keil(MDK-ARM) V5版本、STM32F103ZE芯片,但F1其他型号也适用(适用F1其他型号: 关注微信,回复“修改型号”)。

 

STM32F10x_SPI(硬件接口)读写Flash(25Q16)实例源代码工程:

https://yunpan.cn/c6mfRJWva6AJ2  访问密码

 

STM32F10x_SPI(软件模拟)读写Flash(25Q16)实例源代码工程:

https://yunpan.cn/c6mf6zyzCaMwd  访问密码

 

STM32F1资料:

https://yunpan.cn/crBUdUGdYKam2  访问密码 ca90

 

Ⅲ、STM32硬件SPI

    STM32所有系列芯片都带有SPI硬件控制器,根据芯片型号不同,SPI数量也不同,有些有一个SPI,有些有3个SPI。STM32的SPI控制器功能也是很强大的,只需要简单的配置就能高效的进行SPI通信。

 

1.SPI原理

上面是SPI的系统框图,来自STM32F1的参考手册.

 

A.引脚

MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。

MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。

SCK:串口时钟,为通信提供时钟。(作为主设备的输出,从设备的输入)。

NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。

 

B.缓冲区SPI->DR

发送缓冲区:只要往SPI1->DR写入数据,它自动将存入发送缓冲区,并执行发送操作。这就是高效的一点,而不像模拟SPI,还需要我们控制时钟,控制MOSI引脚输出高低电平。

 

接收缓冲区:原理和发送缓冲区差不多,只是这个是接收数据。接收满了,才通知我们需要去读取数据。

 

C.波特率发生器

STM32的硬件SPI还可以通过配置来控制通信的速度。

 

2.SPI引脚

该函数位于spi.c文件下面;

 

使用的SPI需与引脚对应,CS片选信号我们这里是通过普通IO来控制的,若不同请在spi.h里面修改为你开发板上的引脚。

 

 

3.SPI配置

该函数位于spi.c文件下面;

 

该函数是文章的重要一项,主要是对硬件SPI进行的一些初始化配置。

SPI为主模式,时钟线平时为高,上升沿采集数据,8位数据格式,软件控制片选,数据高位在前。

 

1.传输方向:SPI_Direction = SPI_Direction_2Lines_FullDuplex;

总共有四个方式:

两线全双工:SPI_Direction_2Lines_FullDuplex

两线只接收:SPI_Direction_2Lines_RxOnly

单线只接收:SPI_Direction_1Line_Rx

单线只发送:SPI_Direction_1Line_Tx

 

2.模式:SPI_Mode = SPI_Mode_Master;

总共有两种模式:

主机模式:SPI_Mode_Master

从机模式:SPI_Mode_Slave

 

3.数据:SPI_DataSize = SPI_DataSize_8b;

8位数据长度:SPI_DataSize_8b

16位数据长度:SPI_DataSize_16b

 

4.时钟极性:SPI_CPOL = SPI_CPOL_High;

也就是我们平时不操作时,时钟的电平。

低电平:SPI_CPOL_Low

高电平:SPI_CPOL_High

 

5.时钟相位:SPI_CPHA = SPI_CPHA_2Edge;

也就是我们需要等多少个“时钟”操作通信口MOSI、MISO。

1个时钟:SPI_CPHA_1Edge

2个时钟:SPI_CPHA_2Edge

 

6.片选信号:SPI_NSS = SPI_NSS_Soft;

也就是我们如果控制NSS片选引脚;

软件控制:SPI_NSS_Soft

硬件控制:SPI_NSS_Hard

 

7.波特率(时钟)分频:SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

也就是我们控制SPI通信的速率,和USART串口的波特率类似。

这里的参数有很多种,请见源代码。

 

8.第一位传输数据:SPI_FirstBit = SPI_FirstBit_MSB;

在一根通信线上一字节(8Bit)数据分8次传输才能完成,这里是高位先传输,还是低位先传输的意思。

高位:SPI_FirstBit_MSB

低位:SPI_FirstBit_LSB

 

9.校验:SPI_CRCPolynomial = 7;

校验的数据位长度。

 

4.SPI读写数据

函数位于spi.c文件下面;

 

这两个函数就是我们使用到的接口,在上面SPI配置好之后,操作这两个函数就可以控制其引脚读写了。

这两个函数就是我们上面说的“发送缓冲区”和“接收缓冲区”所需要使用到的部分。

这里需要注意:发送和接收数据都是通过SPI->DR寄存器,读、写操作会控制数据的流向。

 

Ⅳ、软件模拟SPI

从51学习过来的朋友就应该知道,51的资源很少,没有SPI硬件控制器,要想使用SPI通信方式,就需要使用IO口模拟的方式来实现SPI通信。只需要按照通信的时序就能控制其通信。

 

使用软件模拟SPI通信有优点,也有缺点。

优点:移植很方便,代码只需要简单修改就可以使用在其他芯片上;

缺点:控制IO麻烦,对时序要求高;

 

1.模拟SPI引脚

该函数位于spi.c文件下面;

 

这个主要配置模拟SPI引脚。(如果你板子上使用的引脚不同,请修改spi.h文件的定义即可)

 

 

2.模拟SPI初始化

该函数位于spi.c文件下面;

 

这里初始化需要把状态定好,不然第一次操作会有问题。

 

 

3.模拟SPI写函数(时序)

该函数位于spi.c文件下面;

 

这种时序的写法在学习过51的朋友来看再熟悉不过了。

注意:

1、高字节在前,说以上面红色标记的的部分就是将高位先输出,依次移位输出。

2、在时钟的上升沿将数据输出,所以在“时钟-高”之前将数据输出。

 

 

4.模拟SPI读函数(时序)

该函数位于spi.c文件下面;

 

读时序和写时序原理类似,但还是存在差异。

注意:

1、高位先输出来(从机输出),所以,需要将读取的数据依次移向高位。

2、在时钟的下降沿读出数据,所以,我红色标记的部分可以看得出来,是在时钟为低之后才去读取数据。

 

 

Ⅴ、修改代码,适应开发板

       看见这篇文章,你可能觉得芯片型号(STM32F103ZE)不是你的芯片芯片型号,硬件接口(SPI1)、(USART1)也不是板子上的接口,那怎么办呢,其实很简单,适当修改一下就行。

 

1.修改芯片型号

该工程适合STM32F1系列的所有芯片,只需要修改一下型号。修改芯片型号,可以看我的另外一篇文章:如何将工程(修改来)运行在自己开发板上;

 

当然,其他系列(F0、F2、F3、F4等)也可以使用该配置,但需要更换外设库。

 

2.修改硬件接口

笔者提供的工程源代码,在个人看来整理的还算比较整洁(名称清晰、排版整齐、文件分类明确)、相比很多开发板卖家提供的例程来说,要好的多。所以,看了之后,你应该知道如何修改。

 

1、LED灯的IO,位于bsp.h下,修改为你的LED灯IO口就行了。

 

2、USART,本文是使用USART1,如果你使用USART2的话,需要usart.c文件下“USART_GPIO_Configuration”引脚配置、USART_Configuration串口配置、发送接收函数USART1 改为USART2等。

 

3、SPI接口

这个在上面讲述中都提及了修改,就是修改spi.c和spi.h文件里面的配置。

 

Ⅵ、说明

该文有点面向应用的朋友,但为提及W25Q16相关的内容,如有需要了解可以在微信留言。

 

关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。

 

以上总结仅供参考,若有不对之处,敬请谅解。


关键字:STM32F10x_SPI  硬件接口  软件模拟  读写Flash 引用地址:STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)

上一篇:STM32F10x_硬件I2C主从通信(轮询发送,中断接收)
下一篇:SPI_FLASH时序描述及驱动编程

推荐阅读最新更新时间:2024-03-16 15:32

STM32 SPI读写FLASH
一、SPI协议   Serial Peripheral Interface,串行外围设备接口。SPI 是串行同步全双工通信协议。一般用于控制器和控制器之间的数据传输。 1.物理层   每个从机都有四条线和主机相连,不同从机的 MISO MOSI SCK 连接的是主机统一个端口,SS 线,连接不同端口 SS :(Slave Select)从机选择。当主机想和某个从机通讯时,就把从机的 SS 条线的电平拉低。 SCK :(Serial Clock)时钟信号线。由主机产生,f103的SPI挂载在不同的总线上,最大频率为 f p l k / 2 f_{plk}/2f plk /2 ,因此时钟最高频率是不一样的。 MO
[单片机]
STM32 SPI<font color='red'>读写</font><font color='red'>FLASH</font>
MSP430单片机对片内FLASH读写操作程序范例
// 参数: wAddr 为地址 , 范围 0x1000~0xFFFF void ReadFlash(U16 wAddr,U8 *bBuf,U8 bLen) { while (bLen--) *bBuf++=*(U8 *)wAddr++; return; } void WriteFlash(U16 wAddr,U8 *bBuf,U8 bLen) { U8 reg1,reg2; reg1=_BIC_SR(GIE); reg2=IE1;IE1=0; // 保护原来中断标志,并关闭有关中断。 // 写一个字节数据到指定flash地址 while (bLen--)
[单片机]
PCF8591硬件接口(电路图引脚图)
PCF8591 是一个单电源低功耗的8位 CMOS 数据采集器件,具有4路模拟输入,1路模拟输出和一个串行 I2C 总线接口用来与单片机通信。与前面讲过的 24C02 类似,3个地址引脚 A0、A1、A2 用于编程硬件地址,允许最多8个器件连接到 I2C 总线而不需要额外的片选电路。器件的地址、控制以及数据都是通过 I2C 总线来传输,我们先看一下 PCF8591 的原理图,如图17-3所示。 图17-3 PCF8591 原理图 其中引脚1、2、3、4是4路模拟输入,引脚5、6、7是 I2C 总线的硬件地址,8脚是数字地 GND,9脚和10脚是 I2C 总线的 SDA 和 SCL。12脚是时钟选择引脚,如果接高电平表示用外部时
[单片机]
PCF8591<font color='red'>硬件接口</font>(电路图引脚图)
X86软件模拟器面世 弥补ARM服务器芯片短板
  在智能手机和平板电脑占据大半江山的处理器巨头ARM意欲挺进服务器市场早已成定局。在今年7月,国外厂商Boston就采用ARM架构,推出内置192核心,整体功耗却只有300瓦的2U服务器产品Viridis。Viridis采用48个Calxeda 四核SoC模块,能够在2U的机箱里提供192个计算内核的绿色服务器(12个Calxeda ECX-1000计算节点)。该SoC包含有内存、10GbE网络InterConnect Fabric、外部10GbE网络接口,管理接口和SATA磁盘接口。根据Boston的介绍,Viridis能体统比传统X86服务器更优的功耗性价比,在性能不变的前提下,功耗只有之前的十分之一。   ARM芯片低功耗是
[单片机]
ARM9(2440)对nand flash读写操作
s3c2440对nandflash的操作(K9F2G08) nandflash在对大容量的数据存储中发挥着重要的作用。相对于norflash,它具有一些优势,但它的一个劣势是很容易产生坏块,因此在使用nandflash时,往往要利用校验算法发现坏块并标注出来,以便以后不再使用该坏块。nandflash没有地址或数据总线,如果是8位nandflash,那么它只有8个IO口,这8个IO口用于传输命令、地址和数据。nandflash主要以page(页)为单位进行读写,以block(块)为单位进行擦除。每一页中又分为main区和spare区,main区用于正常数据的存储,spare区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内
[单片机]
MSP430---FLASH 读写
MSP430 FLASH型单片机的FLASH存储器模块根据不同的容量分为若干段,其中信息存储器SegmengA及SegmentB各有128字节,其他段有512字节。SegmentB的地址是:0x01000h到0x107F,SegmentA的地址是:0x01080h到0x010FFh。其他段的地址根据容量不同,从0xFFFFh开始,每512字节为一段进行分配。 FLASH存储器写入数据时,每一位只能由“1”变成“0”,不能由“0”变成“1“,因此,当我们有数据要保存到FLASH存储器时,要先对目标段进行整段擦除操作,擦除操作使的对应段FLASH存储器变成全“1”。下面是擦除FLASH段的子程序,配置好必要的寄存器后,向段中任意地址
[单片机]
关于MSP430-Flash超过64K的读写操作方法
关于MSP430-Flash超过64K的读写操作方法 #include msp430xG46x.h void WriteFlashErrorNum(void); //---------------------------------------------------------------------- //功能:从flash中读出数据,只需给出首地址和取出数据的数量 //输入:waddr为flash的地址,length为数据长度 //输出:无 //---------------------------------------------------------------------- void Read
[单片机]
AVR(Mega8)的 IO口模拟SPI,读写FLASH
现在串行SPI接口的FLASH,许多厂商都在生产,一般用于扩展储存程序,读写的速度一般可达30多M,快的有50多M。本例讲一个使用Mega8的IO口模拟SPI读写Spansion生产的串行FLASH芯片(s25fl004a),大小为4Mbit,即是512K字节。想要PDFDATASHEET的朋友可以去21IC下。 程序如下: /*************************************************** flash.h ***************************************************/   #ifndef _flash_ #define _flassh_   #
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved