STM32.SPI(25Q16)

1.首先认识下W25Q16DVSIG,

  • SOP8
  • SPI FLASH
  • 16MBIT  2MB(4096个字节)

(里面可以放字库,图片,也可以程序掉电不丢失数据放里面)

例程讲解:

1.用到SPI库;conf.h里打开头文件

2.2M串行FLASH  W25Q16初始化

SPI_FLASH_Init();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);  //注意挂载的时钟线

注意片选,SPI也可以多片工作的;(这里用了一片)

切记:端口要一个个定义

②读器件ID(此处不能出错)

    /* Get SPI Flash Device ID */
    DeviceID = SPI_FLASH_ReadDeviceID();
u32 SPI_FLASH_ReadDeviceID(void)
{
  u32 Temp = 0;

  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();   //片选拉低,选中该设备

  /* Send "RDID " instruction */
  SPI_FLASH_SendByte(W25X_DeviceID);//先发送一个器ID,告诉它我们要读你的器件ID了(这是一个命令) 0XAB
  SPI_FLASH_SendByte(Dummy_Byte);     //发送3个字节的空地址,25X16的地址是24位的,最后再发一个字节的话,就返回了一个字节的DEVICEID!
  SPI_FLASH_SendByte(Dummy_Byte);
  SPI_FLASH_SendByte(Dummy_Byte);

  /* Read a byte from the FLASH */
  Temp = SPI_FLASH_SendByte(Dummy_Byte);

  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  return Temp;
}

看如图:

0xAB 对应 ID7-ID0

③读取FLASHID

    /* Get SPI Flash ID */
    FlashID = SPI_FLASH_ReadID();

函数如下:

/*******************************************************************************
* Function Name  : SPI_FLASH_ReadID
* Description    : Reads FLASH identification.
* Input          : None
* Output         : None
* Return         : FLASH identification
*******************************************************************************/
u32 SPI_FLASH_ReadID(void)
{
  u32 Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0;

  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();

  /* Send "RDID " instruction */
  SPI_FLASH_SendByte(W25X_JedecDeviceID);   //发送9F过去,将返回一个字节的ID(M7-M0)然后再返回来连个字节的deviceID (ID15-ID8/ID7-ID0)

  /* Read a byte from the FLASH */
  Temp0 = SPI_FLASH_SendByte(Dummy_Byte);    //读取M7-M0

  /* Read a byte from the FLASH */
  Temp1 = SPI_FLASH_SendByte(Dummy_Byte);    //读取ID15-ID8

  /* Read a byte from the FLASH */
  Temp2 = SPI_FLASH_SendByte(Dummy_Byte);   //读取ID7-ID0
/* Deselect the FLASH: Chip Select high */ SPI_FLASH_CS_HIGH(); Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2; return Temp; }   //数据组合

ID:

对于 Manufacturer  和  Memory Type  对应的数据时根据不同的型号而不同的(如图)

华邦公司不同型号表:

对于25Q16

只是器件地址不一样,他们都是华邦公司的嘛

特殊语法:

(sizeof(a) / sizeof(*(a)))

a的总字节数除以每个变量的字节数等于有多少个变量(成员)

时间: 2024-10-05 05:07:10

STM32.SPI(25Q16)的相关文章

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

Ⅰ.写在前面 SPI(Serial Perripheral Interface)串行外设通信接口,主要实现设备(主从)之间的通信.硬件上由CS.SCK.MISO.MOSI四根通信线连接而成.关于SPI更多介绍不再详细描述,本文主要以STM32F103为主机.W25Q16为从机进行SPI通信实验. 本文将提供STM32硬件SPI.软件模拟SPI两实例工程代码供大家参考.掌握两种方式的区别. STM32硬件SPI:控制简单.运行效率高.使用方便等. 软件模拟SPI:移植性强,只需要简单修改接口,就能

3_认识STM32芯片(1)

我所使用的STM32实验板芯片类型是STM32F103VBT6,下面详细介绍这个芯片的资源. 这里提供这款芯片的中文数据手册和英文数据手册:链接:http://pan.baidu.com/s/1eR7hW9W 密码:y6tx STM32F103VB:使用了高性能的ARM Cortex-M3 32位的RISC内核,工作频率为72MHZ,内置高速存储器(128KB的flash,20KB的RAM,CPU能以0等待周期读写),丰富的增强I/O端口和连接到两条APB总线的外设.3个通用定时器,1个高级定时

STM32 F407VG (二)DMA

根据ST公司提供的相关信息,DMA是STM32中一个独立与Cortex-M4核的模块:主要功能是通信"桥梁"的作用,可以将所有外设寄存器和内存空间"连接"起来,这样就可以高速问各寄存器,其传输不受CPU的支配,其间的通讯不占CPU资源,访问速度高,传输还是双向的(双AHB主总线结构):它可以将外设寄存器中的数据与储存器中变量建立绑定,还可以将一外设的寄存器或缓冲器与另外设的寄存器或缓冲器建立双向通讯. 1.DMA初始化 DMA_Init(DMAx_Streamy,

stm32—单总线(1-wire)

1-wire基本概念 这是美国的达拉斯半导体公司推出的一项特有的单总线(1-wire)技术.该技术与别的总线不同,它采用一根信号线,既可以传输时钟,又可以传输数据,而且数据传输是双向的.因此该总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点.该技术适用于单主机系统,能够控制一个或者多个从机设备. 1-wire工作原理 单总线(1-wire)即只使用这一根数据线进行数据交换.控制.设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而

STM32学习(1) 将外设封装成Arduino风格的类库

最近突然想研究研究STM32,看到几乎所有的教程上都是用C编单片机程序的,让一直研究C艹的我编写起来很不适应,今天研究了一中午,成功地将一个 单个LED的驱动封装成了一个Arduino风格的类库,使用起来非常方便,方法如下. 在开始之前,建议按照STM32模板建立方法此文中描述的方法将工程需要的基本库放到一个文件夹中,这样在添加.c和.h文件的时候会更加容易. 1. 为了将驱动封装到一个类中,首先定义驱动代码的头文件 led.h. #ifndef LED_H #define LED_H #inc

增量式PID的stm32实现(转)

源:增量式PID的stm32实现,整定过程 首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异. 资料上比较多的是: 还有一种是: 感觉第二种的Kp Ki Kd比较清楚,更好理解,下面介绍的就以第二种来吧.(比例.积分.微分三个环节的作用这里就详细展开,百度会有很多) 硬件部分: 控制系统的控制对象是4个空心杯直流电机,电机带光电编码器,可以反馈转速大小的波形.电机驱动模块是普通的L298N模块. 芯片型号,STM32F103

Dubbo源码解析之SPI(一):扩展类的加载过程

Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 2011 年开源,之后迅速成为国内该类开源项目的佼佼者,2018年2月,通过投票正式成为 Apache基金会孵化项目.目前宜信公司内部也有不少项目在使用Dubbo. 本系列文章通过拆解Dubbo源码,帮助大家了解Dubbo,做到知其然,并且知其所以然. 一.JDK SPI 1.1 什么是SPI? S

stm32 DMA数据搬运 [操作寄存器+库函数](转)

源:stm32 DMA数据搬运 [操作寄存器+库函数] DMA(Direct Memory Access)常译为“存储器直接存取”.早在Intel的8086平台上就有了DMA应用了. 一个完整的微控制器通常由CPU.存储器和外设等组件构成.这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成.如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的.如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据...这样的数据搬运工作将使CPU的负荷显

STM32学习经验(补充)

2016/3/23 1.      今天把普中开发板上的RS232芯片烧坏了,所以接下来要完成stlink的使用,来下载程序,同时也尝试调试程序,也算是被逼的去学一个很有用的工具,本来我都不想学stlink的. 2.      先学习一下stm32的定时器,过程中,加入stlink的下载和调试. 3.      定时器:stm32分高级定时器(TIM1和TIM8),通用定时器(TIM2-5),基本定时器(TIM6,7). 4.      通用定时器(TIM2-5):1)位于低速APB1总线上.2