///**
// ******************************************************************************
// * @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
// */
关键字:STM32 SST25VF016B 驱动程序
引用地址:STM32 SST25VF016B驱动程序
#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 107 CAN过滤器和掩码 设置函数
- 获奖名单公布——晒创意,赢QuickSense红外感应模块
- 芯灵思SinA33开发板虚拟机中Linux的常用命令
- Tkinter学习笔记——by 常见泽1
- CircuitPython 6.0.0-alpha.3 发布了
- IAR堆栈溢出的问题
- TI最新LDO产品LP5907概述
- 利用C51接收10位UART,使用51汇编集成开发系统仿真时为什么显示定时器1未启动?那怎么启动?谢谢,程序如下
- 在vs.net2003中用C#,mscomm32控件编写通信程序如何与SQL Server2000同步更新
- 请教关于TL431参教电压的问题,与理论值相差很大