文档库 最新最全的文档下载
当前位置:文档库 › STM32_MX25Lxx05D_C

STM32_MX25Lxx05D_C

#include // stm32f10x definitions

#define FLASH_ENABLE GPIOA->BRR |= GPIO_Pin_4
#define FLASH_DISABLE GPIOA->BSRR |= GPIO_Pin_4

//----------- Flash Operation Command Definition -------
#define SPI_Flash_Read_CMD 0x03
#define SPI_Flash_Sector_Erase 0x20
#define SPI_Flash_Block_Erase 0xD8
#define SPI_Flash_Chip_Erase 0x60
#define SPI_Flash_Page_Program 0x02
#define SPI_Flash_Read_Status 0x05
#define SPI_Flash_Write_Status 0x01
#define SPI_Flash_Write_Enable 0x06
#define SPI_Flash_Write_Disable 0x04
#define SPI_Flash_Read_ID 0x9F
#define SPI_Flash_Read 0x03
#define SPI_Flash_Fast_Read 0x0B
#define SPI_Flash_Power_Down 0xB9
#define SPI_Flash_Release_DP 0xAB
#define SPI_Flash_Enter_4K 0xA5
#define SPI_Flash_Exit_4K 0xB5
#define SPI_Flash_Read_ES 0xAB
#define SPI_Flash_Read_EMS 0x90
#define SPI_Flash_Parallel_Mode 0x55

//----------- Flash Status Port Definition ----------
#define C_Flash_Busy 0x01
#define C_Flash_WEL 0x02 // Write Enable Latch
#define C_Flash_BP0 0x04
#define C_Flash_BP1 0x08
#define C_Flash_BP2 0x10
#define C_Flash_BP3 0x20
#define C_Flash_PEE 0x40 // Program Erase Error
#define C_Flash_SRWP 0x80 // Status Register Write Protect

#define DummyData 0x00

#define SET 0x01
#define RESET 0x00

typedef struct
{
u8 MXIC_ID; // Producer
u8 MemType_ID; // FLASH type
u8 MemDensity_ID; // indentify Size of the FLASH

}FLASH_ID;

void SPI1_Init(void)
{
RCC->APB2ENR |= RCC_APB2Periph_SPI1|RCC_APB2Periph_GPIOA;

GPIOA->CRL = 0x99934444;

SPI1->CR1 |= SPI_Direction_2Lines_FullDuplex;
SPI1->CR1 |= SPI_Mode_Master;
SPI1->CR1 |= SPI_DataSize_8b;
SPI1->CR1 |= SPI_CPOL_Low;
SPI1->CR1 |= SPI_CPHA_1Edge;
SPI1->CR2 |= (1<<2); //SSOE
SPI1->CR1 |= SPI_FirstBit_MSB;
SPI1->CR1 |= SPI_BaudRatePrescaler_32;

FLASH_DISABLE;

SPI1->CR1 |= (1<<6);
}

u8 SPI1_WriteRead_Data(u8 dat)
{
while((SPI1->SR&SPI_I2S_FLAG_TXE) == RESET); //TX Buffer is empty

SPI1->DR = dat; //sent the TX Buffer's data out

while((SPI1->SR&SPI_I2S_FLAG_RXNE) == RESET); //RX Buffer is not empty

return(SPI1->DR); //return the RX Buffer's data
}

FLASH_ID Flash_Read_ID(void)
{
FLASH_ID Flash_id;

FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Read_ID);
Flash_id.MXIC_ID = SPI1_WriteRead_Data(DummyData);
Flash_id.MemType_ID = SPI1_WriteRead_Data(DummyData);
Flash_id.MemDensity_ID = SPI1_WriteRead_Data(DummyData);
FLASH_DISABLE;

return Flash_id;
}

void Flash_Write_Enable(void)
{
FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Write_Enable);
FLASH_DISABLE;
}

void Flash_Write_Disable(void)
{
FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Write_Disable);
FLASH_DISABLE;
}

u8 Flash_Read_Status_Register(void)
{
u8 data;

FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Read_Status);
data = SPI1_WriteRead

_Data(DummyData);
FLASH_DISABLE;

return data;
}

void Flash_Write_Status_Register(u8 dat)
{
FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Write_Status);
SPI1_WriteRead_Data(dat);
FLASH_DISABLE;
}

void Flash_Sector_Erase(u16 Sector_idx)
{
u8 Sector_Addr_H;
u8 Sector_Addr_M;
u8 Sector_Addr_L;

Sector_Addr_H = (u8)(((Sector_idx*0x1000)&0x00ff0000)>>16);
Sector_Addr_M = (u8)(((Sector_idx*0x1000)&0x0000ff00)>>8);
Sector_Addr_L = 0x00;

Flash_Write_Enable();
FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Sector_Erase);
SPI1_WriteRead_Data(Sector_Addr_H);
SPI1_WriteRead_Data(Sector_Addr_M);
SPI1_WriteRead_Data(Sector_Addr_L);
FLASH_DISABLE;

while(Flash_Read_Status_Register()&C_Flash_Busy != RESET);
}

void Flash_Block_Erase(u16 Block_idx)
{
u8 Block_Addr_H;
u8 Block_Addr_M;
u8 Block_Addr_L;

Block_Addr_H = (u8)(((Block_idx*0x10000)&0x00ff0000)>>16);
Block_Addr_M = 0x00;
Block_Addr_L = 0x00;

Flash_Write_Enable();
FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Block_Erase);
SPI1_WriteRead_Data(Block_Addr_H);
SPI1_WriteRead_Data(Block_Addr_M);
SPI1_WriteRead_Data(Block_Addr_L);
FLASH_DISABLE;

while(Flash_Read_Status_Register()&C_Flash_Busy != RESET);
}

void Flash_Chip_Erase(void)
{
Flash_Write_Enable();
FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Chip_Erase);
FLASH_DISABLE;

while(Flash_Read_Status_Register()&C_Flash_Busy != RESET);
}

void Flash_WriteByte(u32 data_addr, u8 data)
{
u8 Data_Addr_H;
u8 Data_Addr_M;
u8 Data_Addr_L;

Data_Addr_H = (u8)(((data_addr*0x10000)&0x00ff0000)>>16);
Data_Addr_M = (u8)(((data_addr*0x10000)&0x0000ff00)>>8);
Data_Addr_L = (u8)((data_addr*0x10000)&0x000000ff);

Flash_Write_Enable();
FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Page_Program);
SPI1_WriteRead_Data(Data_Addr_H);
SPI1_WriteRead_Data(Data_Addr_M);
SPI1_WriteRead_Data(Data_Addr_L);
SPI1_WriteRead_Data(data);
FLASH_DISABLE;

while(Flash_Read_Status_Register()&C_Flash_Busy != RESET);
}

void Flash_WriteBytes(u32 data_addr, u8* ptdata, u16 count)
{
u8 Data_Addr_H;
u8 Data_Addr_M;
u8 Data_Addr_L;

Data_Addr_H = (u8)(((data_addr*0x10000)&0x00ff0000)>>16);
Data_Addr_M = (u8)(((data_addr*0x10000)&0x0000ff00)>>8);
Data_Addr_L = (u8)((data_addr*0x10000)&0x000000ff);

Flash_Write_Enable();
FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Page_Program);
SPI1_WriteRead_Data(Data_Addr_H);
SPI1_WriteRead_Data(Data_Addr_M);
SPI1_WriteRead_Data(Data_Addr_L);

for(;count!=0;count--)
{
SPI1_WriteRead_Data(*(ptdata++));
}

FLASH_DISABLE;

while(Flash_Read_Status_Register()&C_Flash_Busy != RESET);
}

void Flash_ReadBytes(u32 data_addr,u8* ptdata, u16 count)
{
u8 Data_Addr_H;
u8 Data_Addr_M;
u8 Data_Addr_L;

Data_Addr_H = (u8)(((data_addr*0x10000)&0x00ff0000)>>16);
Data_Addr_M = (u8)(((data_addr*0x10000)&0x0000ff00)>>8);
Data_Addr_L = (u8)((data_addr*0x10000)&0x000000ff);


FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Fast_Read);
SPI1_WriteRead_Data(Data_Addr_H);
SPI1_WriteRead_Data(Data_Addr_M);
SPI1_WriteRead_Data(Data_Addr_L);
SPI1_WriteRead_Data(DummyData);

for(;count!=0;count--)
{
*(ptdata++) = SPI1_WriteRead_Data(DummyData);
}

FLASH_DISABLE;
}

u8 Flash_ReadByte(u32 data_addr)
{
u8 data;
u8 Data_Addr_H;
u8 Data_Addr_M;
u8 Data_Addr_L;

Data_Addr_H = (u8)(((data_addr*0x10000)&0x00ff0000)>>16);
Data_Addr_M = (u8)(((data_addr*0x10000)&0x0000ff00)>>8);
Data_Addr_L = (u8)((data_addr*0x10000)&0x000000ff);

FLASH_ENABLE;
SPI1_WriteRead_Data(SPI_Flash_Read);
SPI1_WriteRead_Data(Data_Addr_H);
SPI1_WriteRead_Data(Data_Addr_M);
SPI1_WriteRead_Data(Data_Addr_L);
data = SPI1_WriteRead_Data(DummyData);
FLASH_DISABLE;

return data;
}

相关文档