微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SST25VF080B SPI接口FLASH STM32驱动

SST25VF080B SPI接口FLASH STM32驱动

时间:12-03 来源:互联网 点击:
所有的FLASHA 都一样只能从1变0,要想从0变1 只有擦除一个页扇,SST25VF080B 最小可以擦除4KB的页速度也不错 50MHz 容量1MB 挺够用的 10万次的擦写寿命。最低2.7V 就可正常工作。

Flexible Erase Capability

– Uniform 4 KByte sectors

– Uniform 32 KByte overlay blocks

– Uniform 64 KByte overlay blocks

先记下 这些个7788的命令

SST25VF080B 的各种命令比较繁琐

Status Register这个设置写保护多点 我这里只用它的判忙BUSY

一样先配置SPI与GPIO口上图~~

在这也就是CE有用片选嘛~~

#defineSST_SELECT()GPIO_ResetBits(GPIOC, GPIO_Pin_13)/* SST CS = L */
#defineSST_DESELECT()GPIO_SetBits(GPIOC, GPIO_Pin_13)/* SST CS = H */

/***********************************************
**函数名:FLASH_SPI_Config
**功能:初始化串行FLASH的SPI接口
**注意事项:串行FLASH使用了SPI1接口
***********************************************/
void FLASH_SPI_Config(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |
RCC_APB2Periph_AFIO |
RCC_APB2Periph_SPI1,
ENABLE);

/* SCK, MISO and MOSI A5=CLK,A6=MISO,A7=MOSI*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* PC.13 作片选*/
GPIO_SetBits(GPIOC, GPIO_Pin_13);//预置为高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/* SPI1 configuration */
SPI_Cmd(SPI1, DISABLE); //必须先禁能,才能改变MODE
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//两线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//主
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//CPOL=0 时钟悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//CPHA=0 数据捕获第1个
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//软件NSS
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//2分频=36M SST25VF说是50M没事
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC7 我不解的是如果出错要如何处理

SPI_Init(SPI1, &SPI_InitStructure);
//SPI_SSOutputCmd(SPI1, ENABLE); //使能NSS脚可用 我这就一个SPI 器件
SPI_Cmd(SPI1, ENABLE);

}

/***************************************
**函数名:SPIByte
**功能:读写SPI总线
**注意事项:对于SPI来说,主机的读也需要先写,
**使用此函数,读的时候建议参数设置为0xff,写的时候则写参数.这里使用直接操作寄存器的办法实现SPI硬件层读写,是为了加快速写速度 在说LCD 的时候我用的就是库函数 比如

SPI_I2S_SendDataSPI_I2S_ReceiveData SPI_I2S_GetFlagStatus
***************************************/
static u8 SPIByte(u8 byte)
{
/*等待发送寄存器空*/
while((SPI1->SR & SPI_I2S_FLAG_TXE)==RESET);
/*发送一个字节*/
SPI1->DR = byte;
/* 等待接收寄存器有效*/
while((SPI1->SR & SPI_I2S_FLAG_RXNE)==RESET);
return(SPI1->DR);
}

//咱用模式0

/*****************************************
**函数名:SSTCmd1/2/4
**功能:写一个SST命令/写一个命令后接一个数据/写一个命令后再写3个数据
**注意事项:这是一个完整的单命令操作,不返回
*****************************************/
void SSTCmd1(u8 cmd)
{
SST_SELECT();
SPIByte(cmd);
SST_DESELECT();
}

void SSTCmd2(u8 cmd,u8 data)
{
SST_SELECT();
SPIByte(cmd);
SPIByte(data);
SST_DESELECT();
}

void SSTCmd4(u8 cmd,u8 *addr)
{
SST_SELECT();
SPIByte(cmd);//首命令
SPIByte(*addr++);
SPIByte(*addr++);
SPIByte(*addr);
SST_DESELECT();
}

/****************************************
**函数名:SSTCmdb1b/SSTCmd4bs
**功能:写一个SST命令,返回1字节数据/写1个命令字,3个地址字,返回多个字节
**更多使用在读出上的
****************************************/
u8 SSTCmdb1b(u8 cmd)
{
u8 tmp;
SST_SELECT();
SPIByte(cmd);
tmp=SPIByte(0xff);
SST_DESELECT();
return(tmp);
}
void SSTCmd4bs(u8 cmd,u8* addr,u8* data,u32 no)
{
SST_SELECT();
SPIByte(cmd);//首命令
SPIByte(*addr++);
SPIByte(*addr++);
SPIByte(*addr);
for(;no>0;no--)
{
*data++=SPIByte(0xff);
}
SST_DESELECT();
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top