Files
HBshuiwuConcentrator/shuangjia/FRAM.c
2025-12-15 16:07:49 +08:00

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));
}