基于STM32F401RET6字库烧录(SPI&W25Q64驱动)

目录

一、SPI&W25Q64

1-SPI介绍

2-初始化SPI

3-SPI数据接收和发送函数

4-验证SPI是否配置正确(读W25Q64的ID)

二、W25Q64简介与API函数

1 - W25Q64芯片介绍

2- W25Q64芯片管脚说明

3- W25Q64芯片工作原理

4- W25Q64芯片操作时序

三、字库烧录

1-烧录字库准备工作

1 什么是字库

2 制作字库

2-利用串口烧录字库到Flash

总结


一、SPI&W25Q64

1-SPI介绍

     SPI(Serial Peripheral interface):是由Motorola公司开发的串行外围设备接口,是一种高速的,全双工同步的通信总线。主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器等器件。

SPI通信特征:同步串行全双工   25Mhz

FLASH:具备掉电不丢失数据  读写速度快   特征:只能写0(将1变为0)不能写1(不能将0变为1)

写之前必须要擦除要写的区域    擦除之后的区域每个位都会变成1

反正说白了就是要调通SPI,在这个例程里用IO模拟SPI的模式3,SPI模式三的时序自己去看看吧QAQ

SPI工作原理:

主机拉低片选(激活从机)

主机控制时钟线产生上升沿(下降沿)发送方发送数据

主机控制时钟线产生下降沿(上升沿)接收方采集数据

….

主机拉高片选(通信结束)

2-初始化SPI

硬件分析:

 从图上可知需要初始化4个管脚,初始化之前需要去找到相对应的GPIO口:

从图上可得对应GPIO:

FLASH_SPI1_CS --- PA4 --- 通用推挽输出
FLASH_SPI1_SCLK --- PA5 --- 通用推挽输出
FLASH_SPI1_MISO --- PA6 --- 输入模式
FLASH_SPI1_MOSI --- PA7 --- 通用推挽输出

W25Q64 SPI初始化代码如下:文件名为w25q64.c

void W25q64_Init(void)
{
	GPIO_InitTypeDef gpio_InitTypeDef;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	
	gpio_InitTypeDef.GPIO_Mode = GPIO_Mode_OUT;
	gpio_InitTypeDef.GPIO_OType = GPIO_OType_PP;
	gpio_InitTypeDef.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
	GPIO_Init(GPIOA,&gpio_InitTypeDef);
	
	gpio_InitTypeDef.GPIO_Mode = GPIO_Mode_IN;
	gpio_InitTypeDef.GPIO_Speed = GPIO_Speed_100MHz;
	gpio_InitTypeDef.GPIO_Pin = GPIO_Pin_6;
	GPIO_Init(GPIOA,&gpio_InitTypeDef);
	
	W25Q64_CS = 1;
	W25Q64_CLK = 1;
	
}

这里用了位带宏定义了片选、时钟线和数据线,大家注意一下,最后再给大家w25q64.h的代码吧,我们继续往下

3-SPI数据接收和发送函数

根据模式三时序写数据交换函数:

u8 W25q64_DataTransfer(u8 data)
{
	u8 i;
	u8 buf = 0;
	W25Q64_CLK = 1;
	for(i=0;i<8;i++)
	{
		W25Q64_CLK = 0;
		if(data & (0x80 >> i))
		{
			W25Q64_MOSI = 1;
		}
		else
		{
			W25Q64_MOSI = 0;
		}
		W25Q64_CLK = 1;
		buf <<= 1;
		if(W25Q64_MISO)
		
			buf |= 1;
		
	}
	return buf;
}

注意:SPI高位先发,数据长度为8bit

4-验证SPI是否配置正确(读W25Q64的ID)

看图

 根据W25Q64参考手册步骤编写代码:

void W25q64_ReadID(void)
{
	u16 id = 0;
	W25Q64_CS = 0;
	W25q64_DataTransfer(0x90);
	
	W25q64_DataTransfer(0x00);
	W25q64_DataTransfer(0x00);
	W25q64_DataTransfer(0x00);
	
	id = W25q64_DataTransfer(0xff);
	id = id << 8 | W25q64_DataTransfer(0xff);
	W25Q64_CS = 1;
	
	printf("ID:%#x\r\n",id);
	
//	return id;
}

main.c

int main(void)
{
	
	Usart1_Init(115200);
	LED_Config();
	W25q64_Init();
	Dma_Init();
	printf("初始化成功!!!\r\n");
	W25q64_ReadID();


    while(1)
    {

    }
}

读取ID效果:

 得出W25Q64ID为0XEF16,证明SPI配置正确,能正常与W25Q64通信啦,到这一步头文件自己写应该没什么问题,但也放出来吧,给大家参考一下:

w25q64.h

#ifndef _W25Q64_H
#define _W25Q64_H

#include "stm32f4xx.h"
#include "io_bit.h"
#include "stdio.h"

#define W25Q64_CS PAout(4)
#define W25Q64_CLK PAout(5)
#define W25Q64_MISO PAin(6)
#define W25Q64_MOSI PAout(7)

void W25q64_Init(void);
void W25q64_ReadID(void);



#endif

二、W25Q64简介与API函数

1 - W25Q64芯片介绍

大小:8Mbyte  =  8388608byte  =  8192kbyte

一页:256byte

标准通信速度:80Mhz

Sector Erase:扇区擦除   4K(最小的擦除单位) 给它擦除的首地址(只能是4096的倍数 0  4096  8192)

1Kbyte = 1024字节   4K = 4096byte   10  (0 ~ 4095)   5000 (4096 – 8191)

Block Erase:块擦除:32K – 64K

最多擦除:10W次  

数据保存:20年

2- W25Q64芯片管脚说明

3- W25Q64芯片工作原理

利用SPI发送指令来操作W25Q64

     EF16

读ID:可以验证芯片的真伪,检验SPI通信正常不正常

4- W25Q64芯片操作时序

  1. 写使能

  1. 读状态寄存器

  1. 页写

页写最多写256字节的数据(不会自动换页)

  1. 扇区擦除

  1. 读ID

读到0xEF16表示SPI驱动成功

  1. 读数据

大家先看上面的吧,代码晚点补,大家可以多催催我,要资料的留邮箱吧

三、字库烧录

1-烧录字库准备工作

1 什么是字库

2 制作字库

2-利用串口烧录字库到Flash

软件代码连接

链接:https://pan.baidu.com/s/1paV-HYv9ZatbRvOKMl6tRg?pwd=4cxm 
提取码:4cxm 
 


  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值