204 lines
4.3 KiB
C
204 lines
4.3 KiB
C
#include "stm32f10x_spi.h"
|
|
#include "FRAM.h"
|
|
|
|
u8 FRAMReadWriteByte(u8 data)
|
|
{
|
|
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==RESET);
|
|
SPI_I2S_SendData(SPI3, data);
|
|
|
|
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE)==RESET);
|
|
return (u8)(SPI_I2S_ReceiveData(SPI3));
|
|
}
|
|
|
|
void FRAM_GPIO_config(void)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
|
|
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | SPI_FLASH_GPIO_CLK | FRAM_SPI_SCK_GPIO_CLK | FRAM_SPI_MISO_GPIO_CLK | FRAM_SPI_MOSI_GPIO_CLK , ENABLE);
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5;
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|
|
|
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
|
|
|
|
// DGFLASH_CS_HIGH();
|
|
FRAM_CS_HIGH();
|
|
}
|
|
|
|
void FRAM_sRF_SPI_Config(void)
|
|
{
|
|
SPI_InitTypeDef SPI_InitStructure;
|
|
|
|
// RCC_APB2PeriphClockCmd(FRAM_SPI_CLK, ENABLE);
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
|
|
FRAM_CS_HIGH();
|
|
|
|
/* Disable sRF_SPI */
|
|
SPI_Cmd(SPI3, DISABLE);
|
|
|
|
/*!< SPI configuration */
|
|
SPI_I2S_DeInit(SPI3);
|
|
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_Low;
|
|
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
|
|
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
|
|
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
|
|
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
|
|
SPI_InitStructure.SPI_CRCPolynomial = 7;
|
|
SPI_Init(SPI3, &SPI_InitStructure);
|
|
|
|
/*!< Enable the sRF_SPI */
|
|
SPI_Cmd(SPI3, ENABLE);
|
|
}
|
|
|
|
void FRAM_init(void)
|
|
{
|
|
FRAM_GPIO_config();
|
|
FRAM_sRF_SPI_Config();
|
|
}
|
|
|
|
|
|
void spiFlash_FRAMFlash_init(void)
|
|
{
|
|
FRAM_init();
|
|
}
|
|
|
|
void set_write_enable_latch(void)
|
|
{
|
|
FRAM_CS_LOW();
|
|
FRAMReadWriteByte(0x06);
|
|
FRAM_CS_HIGH();
|
|
}
|
|
|
|
void reset_write_enable_latch(void)
|
|
{
|
|
FRAM_CS_LOW();
|
|
FRAMReadWriteByte(0x04);
|
|
FRAM_CS_HIGH();
|
|
}
|
|
|
|
u8 read_status_reg(void)
|
|
{
|
|
u8 retVal;
|
|
FRAM_CS_LOW();
|
|
FRAMReadWriteByte(0x05);
|
|
retVal = FRAMReadWriteByte(0xAA);
|
|
FRAM_CS_HIGH();
|
|
return retVal;
|
|
}
|
|
|
|
void write_status_reg(u8 val)
|
|
{
|
|
FRAM_CS_LOW();
|
|
FRAMReadWriteByte(0x01);
|
|
FRAMReadWriteByte(val);
|
|
FRAM_CS_HIGH();
|
|
}
|
|
|
|
void read_memory_code(u16 addr, u8 *buf, u16 length)
|
|
{
|
|
FRAM_CS_LOW();
|
|
FRAMReadWriteByte(0x03);
|
|
|
|
FRAMReadWriteByte((u8)(addr/256));
|
|
FRAMReadWriteByte((u8)(addr%256));
|
|
|
|
for (u16 i = 0; i < length; i++)
|
|
{
|
|
buf[i] = FRAMReadWriteByte(0xAA);
|
|
}
|
|
FRAM_CS_HIGH();
|
|
}
|
|
|
|
void write_memory_code(u16 addr, u8 *buf, u16 length)
|
|
{
|
|
if ((read_status_reg() & 0x02) == 0)
|
|
{
|
|
set_write_enable_latch();
|
|
}
|
|
|
|
FRAM_CS_LOW();
|
|
FRAMReadWriteByte(0x02);
|
|
FRAMReadWriteByte((u8)(addr/256));
|
|
FRAMReadWriteByte((u8)(addr%256));
|
|
for (u16 i = 0; i < length; i++)
|
|
{
|
|
FRAMReadWriteByte(buf[i]);
|
|
}
|
|
FRAM_CS_HIGH();
|
|
|
|
reset_write_enable_latch();
|
|
|
|
}
|
|
|
|
void fill_FRAM_area(u16 start, u8 value, u16 length)
|
|
{
|
|
if ((read_status_reg() & 0x02) == 0)
|
|
{
|
|
set_write_enable_latch();
|
|
}
|
|
|
|
FRAM_CS_LOW();
|
|
FRAMReadWriteByte(0x02);
|
|
FRAMReadWriteByte((u8)(start/256));
|
|
FRAMReadWriteByte((u8)(start%256));
|
|
for (u16 i = 0; i < length; i++)
|
|
{
|
|
FRAMReadWriteByte(value);
|
|
}
|
|
FRAM_CS_HIGH();
|
|
|
|
reset_write_enable_latch();
|
|
}
|
|
|
|
void read_device_ID(u8 *buf)
|
|
{
|
|
FRAM_CS_LOW();
|
|
FRAMReadWriteByte(0x9F);
|
|
buf[0] = FRAMReadWriteByte(0xAA);
|
|
buf[1] = FRAMReadWriteByte(0xAA);
|
|
buf[2] = FRAMReadWriteByte(0xAA);
|
|
buf[3] = FRAMReadWriteByte(0xAA);
|
|
FRAM_CS_HIGH();
|
|
}
|
|
|
|
void fast_read_memory_code(u16 addr, u8 *buf, u16 length)//fast to 33M
|
|
{
|
|
FRAM_CS_LOW();
|
|
FRAMReadWriteByte(0x0B);
|
|
FRAMReadWriteByte((u8)(addr/256));
|
|
FRAMReadWriteByte((u8)(addr%256));
|
|
FRAMReadWriteByte(0xAA);
|
|
for (u16 i = 0; i < length; i++)
|
|
{
|
|
buf[i] = FRAMReadWriteByte(0xAA);
|
|
}
|
|
FRAM_CS_HIGH();
|
|
}
|
|
|
|
void FRAM_test(void)
|
|
{
|
|
u8 framTest[] = "I am a girl";
|
|
u8 ffff[15];
|
|
|
|
FRAM_init();
|
|
|
|
read_device_ID(framTest);
|
|
// GDflash_erase(0, 0);
|
|
//GDflash_128KByte_erase();
|
|
write_memory_code(0 , framTest, sizeof(framTest));
|
|
|
|
fast_read_memory_code(0, ffff, sizeof(framTest));
|
|
}
|
|
|