[cpp] view plaincopy
/*****************************************************************************
** 文件名称:flash.h (芯片为W25Q128)
** 功 能:
** 修改日志:
******************************************************************************/
#ifndef __FLASH_H
#define __FLASH_H
typedef unsigned char uint8_t; /* 8 bits */
typedef unsigned short int uint16_t; /* 16 bits */
typedef unsigned int uint32_t; /* 32 bits */
/******************************************************************************
** SPI_FLASH
********************************************************************************/
typedef enum
{
RET_SUCCESS = 0,
RET_FlashRead_ERROR,
RET_WriteCmd_ERROR,
RET_WaitBusy_ERROR
}
}SpiRetValueType;
/*****************************************************************************
** 管脚定义
*****************************************************************************/
#define SPIFlash_Enable_CS (P8OUT &= 0XFE) //CS CS = 1 //打开spiflash片选使能
#define SPIFlash_Disable_CS (P8OUT |= 0X01) //CS CS = 0 //关闭spiflash片选使能
#define SPIFlash_Set_SCLK (P7OUT |= 0X08) //CLK //上升沿写入 ,下降沿输出(读) //拉高spiflash时钟线
#define SPIFlash_Clr_SCLK (P7OUT &= 0Xf7) //CLK //拉低spiflash时钟线
#define SPIFlash_Set_DO (P8OUT |= 0X04) //D0 D0 = 1 //MOSI数据线置1,即输出1高电平
#define SPIFlash_Clr_DO (P8OUT &= 0XFB) //D0 D0 = 0 //MOSI数据线清0,即输出0低电平
/*
#define SPIFlash_Enable_CS 7引脚 = 1 //CS = 1 //打开spiflash片选使能
#define SPIFlash_Disable_CS 7引脚 = 0 //CS CS = 0 //关闭spiflash片选使能
#define SPIFlash_Set_SCLK 16引脚 = 1 //CLK //上升沿写入 ,下降沿输出(读) //拉高spiflash时钟线
#define SPIFlash_Clr_SCLK 16引脚 = 0 //CLK //拉低spiflash时钟线
#define SPIFlash_Set_DO 8引脚 = 1 //D0 D0 = 1 //MOSI数据线置1,即输出1高电平
#define SPIFlash_Clr_DO 8引脚 = 0 //D0 D0 = 0 //MOSI数据线清0,即输出0低电平
*/
#define SPIFlash_Get_DI SPIFlash_GPIO_GetBit()
#define SPIFLASH_CMD_LENGTH 0x03
#define SPIFLASH_WRITE_BUSYBIT 0X01 //状态寄存器Busy位(状态寄存器的0位为 BUSY位)
#define SPIFlash_ReadData_CMD 0x03 //读数据
#define SPIFlash_WriteEnable_CMD 0x06 //写使能 会使“状态寄存器”WEL为置位。在执行“擦除”前,需要置位WEL
#define SPIFlash_WriteDisable_CMD 0x04 //写使能关闭
#define SPIFlash_PageProgram_CMD 0x02 //页编程指令 (页256字节)
#define SPIFlash_WriteSR_CMD 0x01 //写状态寄存器
#define SPIFlash_ReadSR_CMD 0x05 //读状态寄存器 当CS低位,05H送入引脚,在CLK上升沿数据被芯片采集,芯片会把“状态寄存器”的值从DO输出,数据在CLK下降沿输出,高位在前.
#define SPIFlash_SecErase_CMD 0x20 //扇区擦除指令 (一扇区 4K)
#define SPIFlash_BlockErase_CMD 0xD8 //块擦除指令 将一块区(64K)全部变成1,即FFH
#define SPIFlash_ChipeErase_CMD 0xC7 //芯片擦除指令
#define SPIFLASH_ReadChipId_CMD 0x90 //读芯片ID
#define SPIFlash_PAGEBYTE_LENGTH 256
#define SPIFlash_SECBYTE_LENGTH (1024*4)
/*******************************************************************************
** 函数声明
*******************************************************************************/
void SpiFlash_WriteOneByte(uint8_t DataBuffer); //写入Flash一个字节(byte),DataBuffer为要写入的内容
uint8_t SpiFlash_Write_Page(uint8_t *pBuffer, uint32_t WriteAddr, uint32_t WriteBytesNum);
uint8_t SpiFlash_Write_MorePage(uint8_t *pBuffer, uint32_t WriteAddr, uint32_t WriteBytesNum);
uint8_t SpiFlash_Write_MoreSector(uint8_t *pBuffer, uint32_t WriteAddr, uint32_t WriteBytesNum);
void SpiFlash_Write_Sector_Data(char *pBuffer,uint8_t Block_Num,uint8_t Sector_Num,uint32_t WriteBytesNum);
void SpiFlash_Write_Data(char *pBuffer,uint8_t Block_Num,uint8_t Page_Num,uint32_t WriteBytesNum);
uint8_t SpiFlash_ReadOneByte(void); //从Flash读出一个字节(Byte),返回值为 retValue(uint8_t)
uint8_t SpiFlash_Read(uint8_t *pBuffer,uint32_t ReadAddr,uint32_t ReadBytesNum);
void SpiFlash_Read_Data(uint8_t *pBuffer,uint8_t Block_Num ,uint8_t Page_Num ,uint32_t ReadBytesNum);
void SpiFlash_Read_Sector_Data(char *pBuffer,uint8_t Block_Num ,uint8_t Sector_Num,uint32_t ReadBytesNum);
void SPIFlash_Erase_Block(uint8_t BlockNum);
void SPIFlash_Erase_Sector(uint8_t Block_Num,uint8_t Sector_Number);
void SPIFlash_Erase_Chip(void); //擦除整个芯片
void Spi_Flash_Init(void);
uint16_t SPIFlash_GPIO_GetBit(void);
#endif
/*****************************************************************************
** 文件名称:flash.c
** 功 能:
** 修改日志:
******************************************************************************/
#include "includes.h"
/*****************************************************************************
** 文件名称:uint8_t SpiFlash_ReadOneByte(void)
** 功 能:从Flash读出一个字节(Byte),返回值为 retValue(uint8_t)
** 修改日志:
** 附 录:先把CLK = 1 ,CLK = 0 下降沿 读取
******************************************************************************/
uint8_t SpiFlash_ReadOneByte(void)
{
uint8_t BitCount = 0;
uint8_t retValue = 0;
SPIFlash_Set_SCLK; //时钟线拉高,恢复时钟线为高电平 cs = 1
for(BitCount = 0;BitCount < 8; BitCount++)
{
retValue <<= 1;
SPIFlash_Set_SCLK; //时钟线拉高,恢复时钟线为高电平
if(SPIFlash_Get_DI)
{
retValue |= 0x01;
}
else
{
retValue &= 0xFE;
}
SPIFlash_Clr_SCLK; //时钟线拉低,产生下降沿读出数据 // cs = 0 产生下降沿 读出数据
}
SPIFlash_Set_SCLK;
return (retValue);
}
/*****************************************************************************
** 文件名称:void SpiFlash_WriteOneByte(uint8_t DataBuffer)
** 功 能:写入Flash一个字节(byte),DataBuffer为要写入的内容
** 修改日志:
** 附 录:先把CS拉低(拉低选中)CS = 0 设备被选中,可以写入和读取
******************************************************************************/
void SpiFlash_WriteOneByte(uint8_t DataBuffer)
{
uint8_t BitCount = 0;
SPIFlash_Clr_SCLK; //时钟线拉低,恢复时钟线为低电平
for(BitCount = 0;BitCount < 8; BitCount++)
{
SPIFlash_Clr_SCLK; //时钟线拉低,恢复时钟线为低电平
if(DataBuffer & 0x80)
{
SPIFlash_Set_DO; //MOSI数据线置1,即输出1高电平
}
else
{
SPIFlash_Clr_DO;
}
DataBuffer <<= 1;
SPIFlash_Set_SCLK; //时钟线拉高,产生上升沿写入数据
}
SPIFlash_Clr_SCLK;
SPIFlash_Set_DO; //一字节数据传送完毕,MOSI数据线置高表示空闲状态
}
/*****************************************************************************
** 文件名称:static uint8_t SpiFlash_Write_CMD(uint8_t *CMD)
** 功 能:写入 “读数据” 命令
** 修改日志:
** 附 录:当CS拉低之后,把03H从DI引脚输入到Flash芯片,之后送入24位地址,这些数据在CLK上升沿,数据写入Flash。当芯片接收完24位地址后,会把相应地
评论1