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

发布者:天涯拾遗最新更新时间:2021-01-13 来源: eefocus关键字:STM32F10x_SPI  硬件接口  软件模拟  读写Flash 手机看文章 扫描二维码
随时随地手机看文章

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文件里面的配置。


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

上一篇:STM32_SPI读写Flash
下一篇:STM32_SPI主从通信

推荐阅读最新更新时间:2024-10-24 21:26

STM32F10x_SPI硬件接口 + 软件模拟读写Flash25Q16
Ⅰ、写在前面 SPI(Serial Perripheral Interface)串行外设通信接口,主要实现设备(主从)之间的通信。硬件上由CS、SCK、MISO、MOSI四根通信线连接而成。关于SPI更多介绍不再详细描述,本文主要以STM32F103为主机、W25Q16为从机进行SPI通信实验。 本文将提供STM32硬件SPI、软件模拟SPI两实例工程代码供大家参考、掌握两种方式的区别。 STM32硬件SPI:控制简单、运行效率高、使用方便等。 软件模拟SPI:移植性强,只需要简单修改接口,就能在其他MCU芯片(如:51、430等)上使用。 实例实验效果: 两个实例SPI通信控制方式不一样,但实验效果是一样的。 W25Q16设
[单片机]
<font color='red'>STM32F10x_SPI</font> (<font color='red'>硬件接口</font> + <font color='red'>软件</font><font color='red'>模拟</font>)<font color='red'>读写</font><font color='red'>Flash</font>(<font color='red'>25Q16</font>)
STM32F10x_SPI硬件接口 + 软件模拟读写Flash25Q16
Ⅰ、写在前面 SPI(Serial Perripheral Interface)串行外设通信接口,主要实现设备(主从)之间的通信。硬件上由CS、SCK、MISO、MOSI四根通信线连接而成。关于SPI更多介绍不再详细描述,本文主要以STM32F103为主机、W25Q16为从机进行SPI通信实验。 本文将提供STM32硬件SPI、软件模拟SPI两实例工程代码供大家参考、掌握两种方式的区别。 STM32硬件SPI:控制简单、运行效率高、使用方便等。 软件模拟SPI:移植性强,只需要简单修改接口,就能在其他MCU芯片(如:51、430等)上使用。 实例实验效果: 两个实例SPI通信控制方式不一样,但实验效果是一样的。 W2
[单片机]
<font color='red'>STM32F10x_SPI</font>(<font color='red'>硬件接口</font> + <font color='red'>软件</font><font color='red'>模拟</font>)<font color='red'>读写</font><font color='red'>Flash</font>(<font color='red'>25Q16</font>)
STM32F10x_SPI硬件接口 + 软件模拟读写Flash25Q16
Ⅰ、写在前面 SPI(Serial Perripheral Interface)串行外设通信接口,主要实现设备(主从)之间的通信。硬件上由CS、SCK、MISO、MOSI四根通信线连接而成。关于SPI更多介绍不再详细描述,本文主要以STM32F103为主机、W25Q16为从机进行SPI通信实验。 本文将提供STM32硬件SPI、软件模拟SPI两实例工程代码供大家参考、掌握两种方式的区别。 STM32硬件SPI:控制简单、运行效率高、使用方便等。 软件模拟SPI:移植性强,只需要简单修改接口,就能在其他MCU芯片(如:51、430等)上使用。 实例实验效果: 两个实例SPI通信控制方式不一样,但实验效果是一样的。 W25Q1
[单片机]
<font color='red'>STM32F10x_SPI</font>(<font color='red'>硬件接口</font> + <font color='red'>软件</font><font color='red'>模拟</font>)<font color='red'>读写</font><font color='red'>Flash</font>(<font color='red'>25Q16</font>)
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_   #
[单片机]
877A软件模拟I2C通信读写24C02
;该试验功能是 单片机 复位一次,自动从24C02中读取数据到 数码管 显示,然后对值加1再写入24C02,最终数码管中的数据就是开机的次数,具有一定的实用意义 ;本 电路 所使用24C02为ATMEL的,或不是该厂的,则烧写时间可能会有差异 ;必须调整本程序的DELAY时间 ;本实战的目的是让大家进上步熟悉I2C通信的时序,熟悉24CXX的读写,会用软件模拟I2C通信 ;硬件接法: ;1.24CXX的SDA接877A的RB5口,SCLK接877A的RB4口,WP接地,A0,A1,A2接地 ;2.实验本实验须将MCD-DEMO实验板上的93CXX系列芯片先取下,在实验过程中不要按动同样接在RB口的按键,以免影响通信时序. ;3.
[单片机]
877A软件模拟SPI通信读写93C46
;功能说明: ;1.做一个灯的左移,将左移的8个码建于TABLE中. ;2.从TABLE中取出数据并以16位的方式存入93C46中,地址00H-03H. ;3.将93C46的00H-03H地址中的数据码取出并存入877A的RAM(30H)-(37H),并输出至877A的RC口. ;当断电再复电,数据码不会消失. ;4.本 电路 所使用93C46为ATMEL或M IC RO Chip 的,或不是该厂的,则烧写时间会有差异 ;必须调整本程序的DELAY时间 ;本实战的目的是让大家进上步熟悉SPI通信的时序,熟悉93C46的读写,会用软件模拟SPI通信 ;硬件接法: ;1.93C46的CS接877A的RB1口;CLK接877A的RB2
[单片机]
pic16f877A软件模拟I2C通信读写24C02
;该试验功能是 单片机 复位一次,自动从24C02中读取数据到 数码管 显示,然后对值加1再写入24C02,最终数码管中的数据就是开机的次数,具有一定的实用意义 ;本 电路 所使用24C02为ATMEL的,或不是该厂的,则烧写时间可能会有差异 ;必须调整本程序的DELAY时间 ;本实战的目的是让大家进上步熟悉I2C通信的时序,熟悉24CXX的读写,会用软件模拟I2C通信 ;硬件接法: ;1.24CXX的SDA接877A的RB5口,SCLK接877A的RB4口,WP接地,A0,A1,A2接地 LIST P=16F877A, R=DEC include P16F877A.inc ;********************
[单片机]
PIC单片机软件模拟IIC读写例程
;I2C总线程序 ;this is eeprom read & write programm ;the special store ram unit w equ 0 f0 equ 0 rt CC equ 1 pc equ 2 f2 equ 2 f3 equ 3 f4 equ 4 ra equ 5 rb equ 6 rc equ 7 pclath equ 0ah i NTC on equ 0bh pir1 equ 0ch tmr1l equ 0eh tmr1h equ 0fh t1con equ 10h tmr2 equ 11h t2con equ 12h sspbuf equ 13h ss
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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