STM32 SST25VF016B驱动程序

发布者:书卷气息最新更新时间:2016-10-17 来源: eefocus关键字:STM32  SST25VF016B  驱动程序 手机看文章 扫描二维码
随时随地手机看文章
///**
//  ******************************************************************************
//  * @file    stm32f10x_SST25VF016B.c 
//  * @brief   SST25VF10B驱动程序
//  ******************************************************************************
//  * @
//  * 接口定义(STM32 SPI1)
// * CE--PA4  SO--PA6  SCK--PA5  SI--PA7  
//  * 
//  * 应用函数  
//  * SST25_Init(void);//SST25VF016B初始化函数
//  * SST25_Read_ID(u8 ID_addr);//读取厂商ID和设备ID  
//  * SST25_Block_Erase(u16 Block);//擦除块上的数据 Block:0x00~0x1FF
//  * SST25_WriteBlock(u16 Block,u8 *Data,u16 Len);//写数据到块上 Block:0x00~0x1FF Len:3~4096  
//  * SST25_ReadBlock(u8 Block,u16 Len);//读取块上的数据 Block:0x00~0x1FF Len:1~128
//  */
#include "stm32f10x_SST25VF016B.h"
 
#define SST25_CE GPIO_Pin_4
#define GPIO_SST25  GPIOA
 
/* Select SPI FLASH: ChipSelect pin low  */
#define Select_Flash()     GPIO_ResetBits(GPIO_SST25, SST25_CE)
/* Deselect SPI FLASH: ChipSelect pin high */
#define NotSelect_Flash()  GPIO_SetBits(GPIO_SST25, SST25_CE)
 
u8 SST25_Data[128];//存取读到的数据
 
/*******************************************************************************/
void SST25_WREN(void);//写使能
void SST25_WRDI(void);//写禁止
u8 SST25_Read(u32 Dst);//读取一个地址内一个字节的数据,返回读取的数据
void SST25_Wait_Busy(void);//等待芯片空闲
 
void SST25_Sector_Erase(u32 Dst);//擦除块数据
void SST25_Bolck_Erase_32K(u32 Dst);//擦除32K数据
 
void SST25_Byte_Program(u32 Dst,u8 byte);//写一个字节的数据到Dst地址
void SST25_Auto_Add_IncA(u32 Dst, u8 byte1, u8 byte2);
void SST25_Auto_Add_IncB(u8 byte1, u8 byte2);
/*******************************************************************************
* Function Name  : SST25_Init
* Description    : SST25VF016B初始化函数
* Input          : None
* Output         : None
* Return         : None
* Example        :None
*******************************************************************************/
void SST25_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE);
 
  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);
 
  /* Configure PA.4 as Output push-pull, used as Flash Chip select */
  GPIO_InitStructure.GPIO_Pin = SST25_CE;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIO_SST25, &GPIO_InitStructure);
 
  NotSelect_Flash();
 
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
 
  SPI_Init(SPI1, &SPI_InitStructure);
 
  SPI_Cmd(SPI1, ENABLE);
}
/*******************************************************************************
* Function Name  : SST25_Block_Erase
* Description    : 擦除块上的数据
* Input          : Block  0x00~0x1FF
* Output         : None
* Return         : None
* Example        :None
*******************************************************************************/
void SST25_Block_Erase(u16 Block)
{
  SST25_WREN();
  SST25_Wait_Busy();
  SST25_Sector_Erase(Block*4096);
  SST25_Wait_Busy();
}

/*******************************************************************************
* Function Name  : SST25_WriteBlock
* Description    : 写数据到块上
* Input          : Block  块号
      Data  数据
      Len  数据长度
* Output         : None
* Return         : None
* Example        :SST25_WriteBlock(0,&Data[0],254);
*******************************************************************************/
void SST25_WriteBlock(u16 Block,u8 *Data,u16 Len)
{
  u32 addr;
  u8 i=0,temp=0;
 
  addr=Block*4096;
  temp=Len%2;//判断Len是否为偶数
 
  SST25_WREN();
  SST25_Sector_Erase(addr);
  SST25_Wait_Busy();
 
  SST25_WREN();
  SST25_Auto_Add_IncA(addr,Data[i],Data[i+1]);
  SST25_Wait_Busy();
  for(i=1;i
  {
   SST25_Auto_Add_IncB(Data[2*i],Data[2*i+1]);
SST25_Wait_Busy();
  }
  if(temp)
   SST25_Auto_Add_IncB(Data[2*i],0x00);
  SST25_Wait_Busy();
  SST25_WRDI();
}
/*******************************************************************************
* Function Name  : SST25_ReadBlock
* Description    : 读取块上的数据
* Input          : Block 块号
      Len  数据长度
* Output         : None
* Return         : None
* Example        :SST25_ReadBlock(0x00,128);
*******************************************************************************/
void SST25_ReadBlock(u8 Block,u16 Len)
{
  SST25_Read_Cont(Block*4096,Len);
}
 
/*******************************************************************************
* Function Name  : SST25_Send_Byte
* Description    : 写入一位数据,写满一个字节
* Input          : u8 out
* Output         : None
* Return         : None
* Example        :None
*******************************************************************************/
u8 SST25_Send_Byte(u8 out)
{
  /* Loop while DR register in not emplty */
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  /* Send byte through the SPI2 peripheral */
  SPI_I2S_SendData(SPI1, out);
 
  /* Wait to receive a byte */
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
 
  /* Return the byte read from the SPI bus */
  return SPI_I2S_ReceiveData(SPI1);
}
 
/*******************************************************************************
* Function Name  : SST25_Get_Byte
* Description    : 读取数据
* Input          : None
* Output         : None
* Return         : None
* Example        :None
*******************************************************************************/
u8 SST25_Get_Byte(void)
{
  return (SST25_Send_Byte(0x00));
}

关键字:STM32  SST25VF016B  驱动程序 引用地址:STM32 SST25VF016B驱动程序

上一篇:关于STM32F107x STM32F10X_CL错误解决方法
下一篇:STM32-FSMC-LCD详解

小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved