spiFLASH芯片WQ的单片机驱动代码

合集下载

SPI_flash代码分析

SPI_flash代码分析

SPI_flash代码分析

以下是主函数

int main(void)

{

Xuint8 send_data[16], recv_data[16];

Xuint8 error, SF_sr;

Xuint16 sector_select, page_select;

Xuint32 i, j;

xil_printf("Serial Flash Test\r\n");

/* 初始化 FLASH_SPI控制器 */

//1、初始化SPI

//2、设这控制寄存器CR为主MASTER transaction inhibit disable,人工选择从设备以及设置SPI为master

//3、初始化SSR(从设备选择寄存器)为不选择任何一个从设备。

Initialize_Spi_Controller(XPAR_SPI_FLASH_BASEADDR);

/* 使能SPI控制器 */

// Description : 设置SPICR寄存器的SPI System Enable位

//1、设置SPE=1,SPI SYSTEM ENABLE

XSpi_Set_Enable(XPAR_SPI_FLASH_BASEADDR);

/* 设置FLASH的WRSR寄存器,设置成功说明FLASH控制已经OK */

do

{

//设置FLASH以使FLASH任何一部分都受保护protected

SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x7c);

SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR);

spi_flash (stm32 spi_flash的编程)

spi_flash (stm32  spi_flash的编程)

本帖最后由orange-208 于2012-5-28 10:05 编辑

void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) SPI_FLASH_Write_SR(0x02);//使能状态寄存器中的写存储器

SST25V_DBSY();

SPI_FLASH_Write_SR(0x02);//使能状态寄存器中的写存储器 SST25V_DBSY();

实验目的:将数据写入外部FLASH中,然后再读出来显示在LCD上实验平台:基于STM32F103C8T6的彩屏开发板

FLASH:SST25VF016B

flash_SST.c

#include "flash_SST.h"

#include "spi.h"

#include "delay.h"

//4Kbytes为一个Sector

//16个扇区为1个Block

//SST25VF016B

//容量为2M字节,共有32个Block(块),512个Sector(扇区)

//初始化SPI FLASH的IO口

//修改状态寄存器,允许芯片存储器被写

void SPI_Flash_Init(void)

{

RCC->APB2ENR|=1<<2; //PORTA时钟使能

GPIOA->CRH&=0XFFFFFF0F;

GPIOA->CRH|=0X00000030; //PA9 推挽

GPIOA->ODR|=1<<9; //PA9上拉

SPIx_Init(); //初始化SPI

spi驱动代码

spi驱动代码
//这里只针对SPI口初始化
GPIOB->CRH&=0X000FFFFF;
GPIOB->CRH|=0XBBB00000;//PB13/14/15复用
GPIOB->ODR|=0X7<<13;//PB13/14/15上拉
SPI2->CR1|=0<<10;//全双工模式
SPI2->CR1|=1<<9;//软件nss管理
// SPI总线速度设置
#define SPI_SPEED_20
#define SPI_SPEED_41
#define SPI_SPEED_82
#define SPI_SPEED_163
#define SPI_SPEED_324
#define SPI_SPEED_645
#define SPI_SPEED_1286
//APB1时钟一般为36Mhz
voidSPI2_SetSpeed(u8SpeedSet)
{
SpeedSet&=0X07;//限制范围
SPI2->CR1&=0XFFC7;
SPI2->CR1|=SpeedSet<<3;//设置SPI2速度
SPI2->CR1|=1<<6;//SPI设备使能
}
//SPI2读写一个字节

FLASH_W25Q64驱动简介

FLASH_W25Q64驱动简介

FLASH_W25Q64驱动简介

W25Q64FV是⼀款FLASH存储芯⽚,由32768页组成的存储芯⽚,其中每⼀页有256字节。

每次最多可以⼀次写⼊256字节(⼀页);擦除则可以按扇区进⾏擦除(⼀个扇区16页,4KB字节),或者可以按128个页进⾏擦除(32KB),或者可以按256个页(64KB)进⾏擦除,以及整个芯⽚擦除⽅式进⾏擦除。

W25Q64FV⽀持标准的同步串⾏通信协议(SPI),下⾯简单举例介绍其常⽤的驱动程序:

数据定义:

1 #ifndef __W25Q64Driver_H

2#define __W25Q64Driver_H

3

4//ID

5#define W25Q64 0xEF16

6

7// W25Q64 Registors

8#define W25Q64_WRITE_ENABLE_CMD 0X06

9#define W25Q64_WRITE_DISABLE_CMD 0x04

10#define W25Q64_rSTATUS_REG_CMD 0x05

11#define W25Q64_wSTATUS_REG_CMD 0x01

12#define W25Q64_READ_DARA_CMD 0x03

13#define W25Q64_FAST_READ_DATA_CMD 0x0B

14#define W25Q64_FAST_READ_DUAL_CMD 0x3B

15#define W25Q64_PAGE_WRITE_CMD 0x02

16#define W25Q64_BLOCK_ERASE_CMD 0xD8

单片机驱动步进电机程序代码

单片机驱动步进电机程序代码

/

实现功能:正转程序

使用芯片:AT89S52

晶振:

编译环境:Keil

作者:

声明此程序仅用于学习与参考,引用请注明版权和作者信息/

include<> //库文件

define uchar unsigned char //字符型宏定义

define uint unsigned int //整型宏定义

uchar tcnt; //定时器计数初值定义uint sec; //速度值定义

uchar buf11;

uchar bai,shi,ge;

/控制位定义/

sbit shi_neng=P1^0; // 使能控制位

sbit fang_shi=P1^1; // 工作方式控制位

sbit fang_xiang=P1^2;// 旋转方向控制位

sbit mai_chong=P1^3; // 脉冲控制位

/延时函数/

void delay1msuchar z

{

uchar x,y;

forx=0;x<z;x++

fory=0;y<110;y++;

}

/定时中断服务函数/

void t0void interrupt 1 using 0 //定时中断服务函数{

tcnt++; //每过250ust tcnt 加一

iftcnt==1 //当tcnt满足条件时

{

tcnt=0; //计满重新再计

sec++;

ifsec==6 //括号内数值越小,电机转动速度越快

{

sec=0; //计满重新再计

mai_chong=~mai_chong; //脉冲输出

}

}

}

/定时器0/1初始化/

void T0_Init

{

ET0 = 1;

单片机驱动步进电机程序代码

单片机驱动步进电机程序代码

单片机驱动步进电机程序代码

(总4页)

-CAL-FENGHAI.-(YICAI)-Company One1

-CAL-本页仅作为文档封面,使用请直接删除

/********************************************************

实现功能:正转程序

使用芯片:AT89S52

晶振:11.0592MHZ

编译环境:Keil

作者:

【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!********************************************************/ #include<reg52.h> //库文件

#define uchar unsigned char //字符型宏定义

#define uint unsigned int //整型宏定义

uchar tcnt; //定时器计数初值定义

uint sec; //速度值定义

uchar buf[11];

uchar bai,shi,ge;

/********************控制位定义*************************/

sbit shi_neng=P1^0; // 使能控制位

sbit fang_shi=P1^1; // 工作方式控制位

sbit fang_xiang=P1^2;// 旋转方向控制位

sbit mai_chong=P1^3; // 脉冲控制位

/********************延时函数***************************/

SPI接口的FLASH

SPI接口的FLASH

SPI接⼝的FLASH

SPI flash W25Qxx:

W25Q系列的spiflash。每页(Page)256B,每16个page为⼀个sector(扇区=4KB),每16个扇区为⼀个block(块=64KB)

W25Q16=16Mb=2MB=2048KB=32block=512sector=8192page;

操作:SPI flash写操作必须确保为0XFF才能写⼊,否则需要檫除操作,檫除的最⼩单位为Sector即4KB,所以有的会在单⽚机内部开⼀个4K的缓存(有点奢侈),写之前先读出来,檫除数据,合并数据(在檫除数据的同时进⾏操作,合并完了在检查檫除是否完成,不闲着;操作系统级的将因此进⼊挂起。要么设定⼀个合适的超时时间,要么有⼀个专门的轮训这些标志完成则发信号量),再写⼊。

SPI SPI flash驱动规范:

1 硬件SPI/软件SPI涉及的MOSI/MISO/SCK的IO设置、SPI设置读写⼀个字节。

2 存储器件IC涉及的⽚选、调⽤SPI读写⼀个字节操作在某个指定地址读写⼀个字节/多个字节,檫除等操作。

3业务层次的读写记录,APP升级等。

⼀主多从可以通过不同⽚选来发送(都⽚选则都会收到),但对接收,如果关闭某个⽚选则可能得不到及时相应;如果都打开则同时来时的处理。IO模拟SPI⼀主多从如右图,先操作译码器(速度要快)再操作SPI的其它三根⼝线即可。

GPIO模拟的SPI操作灵活,但效率不⾼。同时这种⽅法不适⽤于SPI的DMA传输,仅适合数据量少、对传输速度要求不同的场合。

硬件SPI的⽚选可以软件控制也能硬件控制(DMA传输时必须)

单片机驱动步进电机程序代码

单片机驱动步进电机程序代码

/********************************************************

实现功能:正转程序

使用芯片:A T89S52

编译环境:Keil

作者:

【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!********************************************************/ #include<reg52.h> //库文件

#define uchar unsigned char //字符型宏定义

#define uint unsigned int //整型宏定义

uchar tcnt; //定时器计数初值定义

uint sec; //速度值定义

uchar buf[11];

uchar bai,shi,ge;

/********************控制位定义*************************/

sbit shi_neng=P1^0; // 使能控制位

sbit fang_shi=P1^1; // 工作方式控制位

sbit fang_xiang=P1^2;// 旋转方向控制位

sbit mai_chong=P1^3; // 脉冲控制位

/********************延时函数***************************/

void delay1ms(uchar z)

{

uchar x,y;

for(x=0;x<z;x++)

for(y=0;y<110;y++);

}

/***************************定时中断服务函数*************/

基于FPGA的SPI Flash控制器的设计与实现

基于FPGA的SPI Flash控制器的设计与实现

基于FPGA的SPI Flash控制器的设计与实现

作者:陈炳成

来源:《电子世界》2013年第12期

【摘要】传统的Flash读写是通过CPU软件编程实现,其读写速度较慢,且占用CPU资源,另外由于Flash芯片本身功能指令较多,使得对芯片进行直接操作变得非常困难。本文提出一个基于FPGA的SPI Flash读写硬件实现方案,该方案利用硬件对SPI Flash进行控制,能够非常方便地完成Flash的读写、擦除、刷新及预充电等操作,同时编写的SPI Flash控制器IP 核能够进行移植和复用,作为SOC芯片的功能模块。SPI Flash控制器采用VHDL语言进行编写,在Modelsim 6.5g上通过功能仿真,并且在XUPV5-LX110T FPGA开发板上通过硬件测试,实现结果表明方案的可行性。

【关键词】FPGA;SPI Flash控制器;IP核;VHDL

1.引言

Flash是一种具有电可擦除的可编程ROM,按接口可以分为两大类:并行Flash和串行Flash。并行Flash存储量大,速度快;而串行Flash存储量相对较小,但体积小,连线简单,可减小电路面积,节约成本。SPI Flash是内嵌SPI总线接口的串行Flash,它比起传统的并行总线接口Flash,节省了很多的I/O口资源,从而为系统功能的扩展提供了更多的可能。

随着SPI Flash越来越多地应用到各种领域,其传统读写方式中读写速度不够快、占用CPU资源以及操作不够简便灵活的缺点表现得更为突出,如何解决以上问题成为大家关注的焦点。利用硬件对SPI Flash进行控制,能够非常方便地完成Flash的读写、擦除、刷新及预充电等操作,且不占用CPU资源,同时编写的SPI Flash控制器IP核能够进行移植和复用,作为SOC芯片的功能模块。因此提出了一种基于FPGA的SPI Flash控制器的设计方案,并用VHDL实现。编写的SPI Flash控制器IP核在Modelsim 6.5g上进行了功能仿真,在FPGA开发板上进行了测试验证,可作为功能模块应用于SOC芯片设计。

STM32-SPI方式读写外部Flash(W25Q64)

STM32-SPI方式读写外部Flash(W25Q64)

STM32-SPI⽅式读写外部Flash(W25Q64)⼀、⼯具

1、硬件:STM32F103VET6单⽚机(HAL库)

2、编译环境:Atollic TrueSTUDIO for STM32 9.3.0

3、辅助⼯具:STM32CubeMX

⼆、电路原理图

三、单⽚机系统时钟配置

1、时钟源选择:

2、时钟树:

四、SPI配置

1、选⽤的是SPI1,全双⼯主机模式(单⽚机是主机,外部FLASH做从机),⽚选引脚由软件控制。

2、再检查⼀下SPI1的引脚设置是否正确。

3、设置FLASH的⽚选引脚即PC0引脚为输出模式,因为SPI1上只有⼀个器件,默认输出低电平。

五、⽣成代码

1、SPI1初始化代码如下所⽰:

static void MX_SPI1_Init(void)

{

/* USER CODE BEGIN SPI1_Init 0 */

/* USER CODE END SPI1_Init 0 */

/* USER CODE BEGIN SPI1_Init 1 */

/* USER CODE END SPI1_Init 1 */

/* SPI1 parameter configuration*/

hspi1.Instance = SPI1;

hspi1.Init.Mode = SPI_MODE_MASTER;

hspi1.Init.Direction = SPI_DIRECTION_2LINES;

hspi1.Init.DataSize = SPI_DATASIZE_8BIT;

hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;

FLASH语音芯片选型指南

FLASH语音芯片选型指南
FLASH 语音芯片选型指南
FLASH 语音芯片,解释为:一颗语音芯片主控,外加一个 SPI FLASH 作语音存储 架构的语音播放系统,由 2 个芯片组成。这 2 个芯片的作用与分工可以理解如下:对于主控芯片,相当于电脑的 CPU+内存,主要用作运算、 起控制功能、接收外部信号、读写 SPI FLASH、播放语音、驱动 LED 和液晶之类的功能。 至于 SPI FLASH,则 相当于电脑中的硬盘,仅用作存储语音数据,部分场合下还存储少量的控制字节信息。
对于 MP3 编码格式的文件来讲是 法,可以进行
码率越高音质越好,反之同理。
8bit\5bit\4bit 的 采样,从而实
现小容量长时
间的做法。牺
牲音质来换取
时间长度。但
它的音质做到
最高时,音质
也是相当的可
以。
支持存储器容量越大,能存储语音 4-64M。最长可
时间越长,反之同理。
达 5120 秒。
GBW588 中
控制方式就是分为按键控制模式、 MCU 控制模式 2 种。按键模式一般 取决于主控芯片有多少个 I/O 口, 用一个 I/O 口来控制一段语音,多 数是这样应用。而 MCU 控制模式 则是通过 MCU 单片机来发指令给 语音芯片,语音芯片在接收到指令 后,播放相应语音段的功能,应用 方式最为广泛与灵活。
销量也很好。

SPI-FLASH驱动实现流程

SPI-FLASH驱动实现流程





#define rSPCON0 (*(volatile unsigned *)0x59000000) //SPI0 control #define rSPSTA0 (*(volatile unsigned *)0x59000004) //SPI0 status #define rSPPIN0 (*(volatile unsigned *)0x59000008) //SPI0 pin control #define rSPPRE0 (*(volatile unsigned *)0x5900000c) //SPI0 baud rate prescaler #define rSPTDAT0 (*(volatile unsigned *)0x59000010) //SPI0 Tx data #define rSPRDAT0 (*(volatile unsigned *)0x59000014) //SPI0 Rx data
100
// baud rate = PCLK/2/(rSPPRE value +1),
rSPSTA0
//In our case , we just care about the REDY bit. #define SPI_REDY #define SPI_READY 1 (rSPSTA0 & SPI_REDY)
Mode 0:

浅析spi flash驱动及其程序

浅析spi flash驱动及其程序

浅析spi flash驱动及其程序

SPI Flash 首先它是个Flash,Flash是什么东西就不多说了(非易失性存储介质),分为NOR和NAND两种(NOR和NAND的区别本篇不做介绍)。SPI一种通信接口。那么严格的来说SPI Flash是一种使用SPI通信的Flash,即,可能指NOR也可能是NAND。但现在大部分情况默认下人们说的SPI Flash指的是SPI NorFlash。早期Norflash 的接口是parallel的形式,即把数据线和地址线并排与IC的管脚连接。但是后来发现不同容量的Norflash不能硬件上兼容(数据线和地址线的数量不一样),并且封装比较大,占用了较大的PCB板位置,所以后来逐渐被SPI(串行接口)Norflash所取代。同时不同容量的SPI Norflash管脚也兼容封装也更小。,至于现在很多人说起NOR flash直接都以SPI flash来代称。 NorFlash根据数据传输的位数可以分为并行(Parallel,即地址线和数据线直接和处理器相连)NorFlash和串行(SPI,即通过SPI接口和处理器相连)NorFlash;区别主要就是:1、SPI NorFlash每次传输一bit位的数据,parallel连接的NorFlash每次传输多个bit位的数据(有x8和x16bit两种);2、SPI NorFlash比parallel便宜,接口简单点,但速度慢。 NandFlash是地址数据线复用的方式,接口标准统一(x8bit和x16bit),所以不同容量再兼容性上基本没什么问题。但是目前对产品的需求越来越小型化以及成本要求也越来越高,所以SPI NandFlash渐渐成为主流,并且采用SPI NANDFlash方案,主控也可以不需要传统NAND控制器,只需要有SPI接口接口操作访问,从而降低成本。另外SPI NandFlash封装比传统的封装也小很多,故节省了PCB板的空间。怎么用说白了对于Flash就是读写擦,也就是实现flash的驱动。先简单了解下spi flash的物理连接。之前介绍SPI的时候说过,SPI接口目前的使用是多种方式(具体指的是物理连线有几种方式),Dual SPI、Qual SPI和标准的SPI接口(这种方式肯定不会出现在连接外设是SPI Flash上,这玩意没必要全双工),对于SPI Flash来说,主要就是Dual和Qual这两种方式。具体项目具体看了,理论上在CLK一定的情况下,线数越多访问速度也越快。我们项目采用的Dual SPI方式,即两线。移植需要更改sendrcv函数里面内容,宏定义内容

基于SPI 总线FLASH 时序控制的FPGA 实现

基于SPI 总线FLASH 时序控制的FPGA 实现

基于SPI 总线FLASH 时序控制的FPGA 实现

薛宏亮 合肥工业大学仪器科学与光电工程学院 安徽合肥 230009

0 引言

FLASH 存储器作为一类新型存储器,因具有功耗低、速度快、容量大、成本低和非易失性等优点在各种嵌入式系统中得到越来越广泛地应用。随着技术的发展和需求的提高,数据的处理日益向着高速化的趋势发展,此时,通过普通的处理器来读取FLASH 中的数据已经达不到要求。而利用FPGA 控制FLASH 存储器的读取可以达到较高的处理速度,所以在高速数据处理领域,利用FPGA 实现FLASH 存储系统控制的工程应用相当广泛。本文以winbond 公司的SPI 接口FLAH 芯片W25Q128BV 和Altera 公司的Cyclone 系列FPGA 芯片EP4CE6F17C8为例,用Verilog 硬件描述语言实现了以SPI 总线协议为基础

的FLASH 读取控制时序,实现了FPGA 和FLASH 存储器的接口操作。

1 SPI 总线协议和W25Q128BV 芯

片介绍

1.1 SPI 总线协议

SPI(Serial Peripheral Interface)是一种高速的、全双工、同步的通信总线。由于其在芯片管脚上只占用4根线,节约了管脚资源的同时也为PCB 布局节省了空间,因而越来越多的芯片集成了这种通信协议。

SPI 的通信原理简单,它以主从模式工作,通常需要一个主设备和一个或者多个从设备,需要至少4根线,分别是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。其中SDI 用于主设备数据输入,从设备数据输出;SDO 用于主设备数据输出,从设备数据输入;SCLK 为时钟信号,必须由主设备提供;CS 为从设备使能信号,由主设备控制。SPI 是串行通信协议,SDI 和SDO 与SCLK 同步,是基于SCLK 提供的时钟脉冲完成数据的逐位传输。1.2 W25Q128BV 芯片介绍

用C8051F120单片机驱动FLASH芯片 AT45DB161D

用C8051F120单片机驱动FLASH芯片 AT45DB161D

用C8051F120单片机驱动FLASH芯片 AT45DB161D 用c8051f120单片机驱动flash芯片at45db161d

用c8051f120单片机驱动flash芯片at45db161d2021-11-2608:51//

//at45db161d驱动//

//pinout://

//p0.2-spisck(digitaloutput,push-pull)//p0.3-spimiso(digitalinput,open-drain)//p0.4-spimosi(digitaloutput,push-pull)//p0.5-nssmd0

//p1.6-led(digitaloutput,push-pull)//

//allotherportpinsunused.//

//#definesysclk22118400//internaloscillatorfrequencyinhz//#definespi_clock1105 9200//maximumspiclock//-----------------------------------------------------------------------------//includes

//-----------------------------------------------------------------------------#include#include\

//-----------------------------------------------------------------------------//globalconstants

单片机驱动步进电机程序代码

单片机驱动步进电机程序代码

单片机驱动步进电机程序代码

(总4页)

-CAL-FENGHAI.-(YICAI)-Company One1

-CAL-本页仅作为文档封面,使用请直接删除

/********************************************************

实现功能:正转程序

使用芯片:AT89S52

晶振:11.0592MHZ

编译环境:Keil

作者:

【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!********************************************************/ #include<reg52.h> //库文件

#define uchar unsigned char //字符型宏定义

#define uint unsigned int //整型宏定义

uchar tcnt; //定时器计数初值定义

uint sec; //速度值定义

uchar buf[11];

uchar bai,shi,ge;

/********************控制位定义*************************/

sbit shi_neng=P1^0; // 使能控制位

sbit fang_shi=P1^1; // 工作方式控制位

sbit fang_xiang=P1^2;// 旋转方向控制位

sbit mai_chong=P1^3; // 脉冲控制位

/********************延时函数***************************/

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

spiFLASH芯片WQ的单片机驱动代码

#include "w25q80.h"

// 注:W25Q80由256 BYTE 组成一个PAGE,不可PGAE擦除,可以进行BYTE PROGRAM 或者PAGE PROGRAM

// 由16 PAGE 组成一个SECTOR,可SECTOR擦除

// 由16 SECTOR组成一个BLOCK,可BLOCK 擦除

// 由16 BLOCK 组成一个FULL MEMEORY,可FULL MEMORY 擦除

// 所以,总容量是1M bytes

// W25Q80主要命令字

#define READ_ARRAY 0x03

#define SECTOR_ERASE 0x20

#define BYTE_OR_PAGE_PROGRAM 0x02

#define WRITE_ENABLE 0x06

#define WRITE_DISABLE 0x04

#define READ_STATUS_REGISTER 0x05

#define Manufacturer_DeviceID 0x9F

// 定义W25Q80的CS脚对应MCU的IO

#define W25Q80_CS P1_2

// SPI硬件初始化

void Spi_Init(void)

{

PERCFG |= 0x02; // SPI1映射到P1口

P1SEL |= 0xE0; // P15~P17作复用功能(clk mosi miso)

P1SEL &= ~0x04; // P12作GPIO

P1DIR |= 0x04; // P12作输出

P1_2 = 1; // P12输出高电平

U1CSR &= ~0xA0; // SPI主方式

U1GCR &= ~0xC0; // CPOL=0 CPHA=0

U1GCR |= 0x20; // MSB

U1BAUD = 0; // 波特率设为sysclk/8

U1GCR |= 0x11;

// SPI发送与接收字节

static u8 Spi_ReadWriteByte(u8 TxData)

{

U1DBUF = TxData; // 发送数据

while( !(U1CSR&0x02) ); // 等待发送完成

U1CSR &= 0xFD; // 清除发送完成标志

return U1DBUF;

}

// CS线拉低,使能芯片

static void W25Q80_Enable( void )

{

volatile u8 i;

W25Q80_CS = 0;

for ( i=5; i>0; i-- ); // 延时

}

// CS线拉高,禁能芯片

#define W25Q80_Disable() ( W25Q80_CS = 1 )

// 设置FLASH芯片"写使能"

static void SetW25Q80WriteEnable(void)

{

W25Q80_Enable();

Spi_ReadWriteByte(WRITE_ENABLE);

W25Q80_Disable();

}

// 设置FLASH芯片"写禁能"

//static void ClearW25Q80WriteEnable(void)

//{

// W25Q80_Enable();

// Spi_ReadWriteByte(WRITE_DISABLE);

// W25Q80_Disable();

//}

// 读取FLASH芯片的状态字节,可判断芯片是否busy

static u8 ReadW25Q80StatusRegister(void)

{

u8 temp;

W25Q80_Enable();

Spi_ReadWriteByte(READ_STATUS_REGISTER);

temp = Spi_ReadWriteByte(0xF0);

W25Q80_Disable();

return temp;

}

// 读取FLASH的内容,读取的字节数没有限制

void ReadW25Q80Operation(u32 addr,u8 *databuf,u32 len)

{

u32 i = 0;

u8 temp;

temp = ReadW25Q80StatusRegister();

while( temp&0x01 ) // 等待FLASH芯片结束BUSY状态{

temp = ReadW25Q80StatusRegister();

if ( ++i>1000000 ) return;

}

W25Q80_Enable();

Spi_ReadWriteByte(READ_ARRAY);

Spi_ReadWriteByte((u8)(addr >>16));

Spi_ReadWriteByte((u8)(addr >>8));

Spi_ReadWriteByte((u8)addr);

for ( i=0; i<len; i++ )

{

相关文档
最新文档