打印

SST26VF064B驱动 求助

[复制链接]
1896|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
catcat123|  楼主 | 2017-6-28 11:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dirtwillfly| | 2017-6-28 11:34 | 只看该作者


//  * [url=home.php?mod=space&uid=72445]@[/url]
//  * 接口定义(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<Len/2;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));
}


使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
catcat123 + 1 神马都是浮云
板凳
dirtwillfly| | 2017-6-28 11:35 | 只看该作者
上面是stm驱动SST25VF016B的代码

使用特权

评论回复
地板
catcat123|  楼主 | 2017-7-28 09:29 | 只看该作者
貌似SST26VF064B 跟SST25VF016B区别还是蛮大的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝