// * [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));
}
|