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

推荐

分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!但愿你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang微信

 

个人网站:https://www.strongerhuang.com函数

个人知乎:https://www.zhihu.com/people/strongerHuang.com学习

 

Ⅰ、写在前面测试

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

 

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

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

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

 

实例实验效果.net

两个实例SPI通讯控制方式不同,但实验效果是同样的。3d

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的朋友来看再熟悉不过了。

注意:

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

二、在时钟的上升沿将数据输出,因此在“时钟-高”以前将数据输出。

 

 

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

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

 

读时序和写时序原理相似,但仍是存在差别。

注意:

一、高位先输出来(从机输出),因此,须要将读取的数据依次移向高位。

二、在时钟的降低沿读出数据,因此,我红色标记的部分能够看得出来,是在时钟为低以后才去读取数据。

 

 

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

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

 

1.修改芯片型号

该工程适合STM32F1系列的全部芯片,只须要修改一下型号。修改芯片型号,能够看个人另一篇文章:如何将工程(修改来)运行在本身开发板上;

 

固然,其余系列(F0、F二、F三、F4等)也可使用该配置,但须要更换外设库。

 

2.修改硬件接口

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

 

一、LED灯的IO,位于bsp.h下,修改成你的LED灯IO口就好了。

 

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

 

三、SPI接口

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

 

Ⅵ、说明

该文有点面向应用的朋友,但为说起W25Q16相关的内容,若有须要了解能够在微信留言。

 

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

 

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

 

Ⅶ、最后

个人网站:https://www.strongerhuang.com

个人微信公众号(ID:strongerHuang)还在分享STM八、STM3二、Keil、IAR、FreeRTOS、UCOS、RT-Thread、CANOpen、Modbus…等更多精彩内容,若是想查看更多内容,能够关注个人微信公众号。

微信公众号