📄 fram.c
字号:
/**********************************************************
*文件名称:fram.c(CPU)
*作 者:szb
*完成日期:2006.1.20
*摘 要:实现对FRAM的读写
***********************************************************/
#ifndef _FRAM
#define _FRAM
#include "datastru.h"
#include "func.h"
#endif
/*初始化Fram中的参量值*/
void FramInit(void)
{
unsigned char TempData[4];
int i;
FM_wrsr_cmd(0);//解除FRAM对数据段的写保护
FM25L256_Read(0x0000,4,TempData);//读取首地址的标志字符
if (TempData[0] != 7 || TempData[1] != 8 || TempData[2] != 9 || TempData[3] != 10)//标志字符非预定值,证明此FRAM是第一次被使用,需要初始化
{
//由于FRAM是第一次被使用,需要初始化标志字符为预定值
for (i = 0;i < 4;i++)
{
TempData[i] = i + 7;
}
FM25L256_Write(0x0000,4,TempData); //调试
//初始化SOEPosition=0,SOEamount=0
TempData[0] = 0;
TempData[1] = 8;
TempData[2] = 0;
TempData[3] = 0;
FM25L256_Write(FRAM_POINT_SOE,4,TempData);
//FM25L256_Write(0x0006,2,TempData+2);
}
SOEPosition = FM_word_read(FRAM_POINT_SOE);//读取SOE指针位置 低地址存的是数据的高位
SOEamount = FM_word_read(FRAM_NUM_SOE);//读取当前未发送的SOE记录数 低地址存的是数据的高位
}
void Delay(unsigned int n) //延迟函数
{
unsigned int i;
for (i=0; i<n; i++) {;}
}
//=====================================================================
//
// Name: OUTBYT
// Description: Sends byte to FM25L256
// Function: This routine shifts out a byte, starting with the MSB, to the FM25040
// Calls: None
// Input: outbyte= byte to be sent
// Outputs: None
// Notes: The pin is sampled on the rising edge of SCK and is ignored at other times.
//=====================================================================
void FM_outbyt(unsigned char outbyte)
{
unsigned int i;
for(i=0; i<8; i++)
{
if(outbyte & 0x80)
FRAM_SIMO_HIGH;
else
FRAM_SIMO_LOW;
outbyte = outbyte << 1;
FRAM_CLK_LOW; //产生上升沿,发送数据
//Delay(1);//延迟,调试
FRAM_CLK_HIGH;
//Delay(1);//延迟
}
}
//=====================================================================
//
// Name: INPUTBYT
// Description: Recieves byte from FM25640
// Function: This routine recieves a byte, MSB first, from the FM25040
// Calls: None
// Input: None
// Outputs: bbyte= recieved byte
// Notes: Data transitions are driven on the falling edge of the serial clock.
//=====================================================================
unsigned char FM_inputbyt(void)
{
unsigned int i;
unsigned char rdata = 0;
for(i=0; i<8; i++)
{
FRAM_CLK_HIGH;
//Delay(1);//延迟,调试
FRAM_CLK_LOW; //产生上升沿,发送数据
Delay(1);//延迟
rdata = (rdata<<1) | ((P3IN & BIT2)>>2); //获得当前输入电平
}
return rdata;
}
void FM_wren_cmd(void) //发送写使能命令
{
FRAM_CLK_LOW; //CLK为低电平时才能片选
//Delay(1);//延迟,调试
FRAM_CS_LOW; // Bring /CS low 选定FRAM
FM_outbyt(WREN_INST); //Send WREN instruction 写使能
FRAM_CLK_LOW;
//Delay(1);//延迟,调试
FRAM_CS_HIGH;
}
void FM_wrdi_cmd(void) //发送写使能取消命令
{
FRAM_CLK_LOW; //CLK为低电平时才能片选
//Delay(1);//延迟,调试
FRAM_CS_LOW; // Bring /CS low 选定FRAM
FM_outbyt(WRDI_INST); //Send WREN instruction 写使能
FRAM_CLK_LOW;
//Delay(1);//延迟,调试
FRAM_CS_HIGH;
}
unsigned char FM_rdsr_cmd (void)
{
unsigned char rstruction;
FRAM_CLK_LOW; //CLK为低电平时才能片选
//Delay(1);//延迟,调试
FRAM_CS_LOW; // Bring /CS low 选定FRAM
FM_outbyt(RDSR_INST);
rstruction=FM_inputbyt();
FRAM_CLK_LOW;
//Delay(1);//延迟,调试
FRAM_CS_HIGH;
return rstruction;
}
void FM_wrsr_cmd(unsigned char status)
{
FM_wren_cmd();
FRAM_CLK_LOW; //CLK为低电平时才能片选
//Delay(1);//延迟,调试
FRAM_CS_LOW; // Bring /CS low 选定FRAM
FM_outbyt(WRSR_INST) ;// Send WRSR instruction
FM_outbyt(status);// Send status register
FRAM_CLK_LOW;
//Delay(1);//延迟,调试
FRAM_CS_HIGH;
}
void FM_byte_write(unsigned int Addrress,unsigned char Data)
{
FM_wren_cmd(); //write enable
FRAM_CLK_LOW; //CLK为低电平时才能片选
//Delay(1);//延迟,调试
FRAM_CS_LOW; // Bring /CS low 选定FRAM
FM_outbyt(WRITE_INST);// Send WRITE instruction including MSB of address
FM_outbyt((unsigned char)(Addrress>>8));
FM_outbyt((unsigned char)(Addrress));
FM_outbyt(Data);
FRAM_CLK_LOW;
//Delay(1);//延迟,调试
FRAM_CS_HIGH;
}
//======================================
void FM_word_write(unsigned int Addr,unsigned int Data)
{
unsigned char Tempdata[2];
Tempdata[1] = Data;
Tempdata[0] = Data>>8;
//FM_byte_write(Addrress,Tempdata[0]);
//FM_byte_write(Addrress+1,Tempdata[1]);
//unsigned char i;
FM_wren_cmd(); //write enable
FRAM_CLK_LOW; //CLK为低电平时才能片选
//Delay(1);//延迟,调试
FRAM_CS_LOW; // Bring /CS low 选定FRAM
FM_outbyt(WRITE_INST);// Send WRITE instruction including MSB of address
FM_outbyt((unsigned char)(Addr>>8));
FM_outbyt((unsigned char)(Addr));
//for(i=0;i<Length;i++)
//{
FM_outbyt(Tempdata[0]);
FM_outbyt(Tempdata[1]);
//}
FRAM_CLK_LOW;
//Delay(1);//延迟,调试
FRAM_CS_HIGH;
}
//======================================
void FM25L256_Write(unsigned int Addr,unsigned int Length,unsigned char *Data)
{
unsigned char i;
FM_wren_cmd(); //write enable
FRAM_CLK_LOW; //CLK为低电平时才能片选
//Delay(1);//延迟,调试
FRAM_CS_LOW; // Bring /CS low 选定FRAM
FM_outbyt(WRITE_INST);// Send WRITE instruction including MSB of address
FM_outbyt((unsigned char)(Addr>>8));
FM_outbyt((unsigned char)(Addr));
for(i=0;i<Length;i++)
{
FM_outbyt(*(Data+i));
}
FRAM_CLK_LOW;
//Delay(1);//延迟,调试
FRAM_CS_HIGH;
}
void SOE_Write(unsigned char *Data)
{
//int i;
SOEPosition = FM_word_read(FRAM_POINT_SOE);
if(SOEPosition + SOEamount * 8 > 0x7FF8) //当FRAM的空间写完时,重新从首地址开始写
FM25L256_Write(SOEPosition + SOEamount * 8 - 0x7FF8,8,Data);
else
FM25L256_Write(SOEPosition + SOEamount * 8,8,Data);
SOEamount = SOEamount + 1;//未发送记录数加1
if(SOEamount > 4095)//FRAM中最多能存4095条不相互覆盖的数据,
{//当超过4095条数据时最早的数据被覆盖,SOEPosition后移8位,仍然指向最“老”的数据
SOEamount = 4095;
if(SOEPosition + 8 > 0x7FF8) //当FRAM的空间写完时,重新从首地址开始写
FM_word_write(FRAM_POINT_SOE,SOEPosition - 0x7FF0);//0x7FF0=0x7FF8-8
else
FM_word_write(FRAM_POINT_SOE,SOEPosition + 8);
}
FM_word_write(FRAM_NUM_SOE,SOEamount);
}
unsigned char FM_byte_read(unsigned int Address)
{
unsigned char temp;
FRAM_CLK_LOW; //CLK为低电平时才能片选
//Delay(1);//延迟,调试
FRAM_CS_LOW; // Bring /CS low 选定FRAM
FM_outbyt(READ_INST);// Send READ_INST instruction including MSB of address
FM_outbyt((unsigned char)(Address>>8));
FM_outbyt((unsigned char)(Address));
temp=FM_inputbyt();
FRAM_CLK_LOW;
//Delay(1);//延迟,调试
FRAM_CS_HIGH;
return(temp);
}
unsigned int FM_word_read(unsigned int Address)
{
unsigned int Data;
Data = FM_byte_read(Address);
Data = (Data<<8) + FM_byte_read(Address+1);
return(Data);
}
void FM25L256_Read(unsigned int Addr,unsigned int Length,unsigned char *Data)
{
unsigned char i;
FRAM_CLK_LOW; //CLK为低电平时才能片选
//Delay(1);//延迟,调试
FRAM_CS_LOW; // Bring /CS low 选定FRAM
FM_outbyt(READ_INST);// Send READ_INST instruction including MSB of address
FM_outbyt((unsigned char)(Addr>>8));
FM_outbyt((unsigned char)Addr);
for(i=0;i<Length;i++)
{
*(Data+i)=FM_inputbyt();
}
FRAM_CLK_LOW;
//Delay(1);//延迟,调试
FRAM_CS_HIGH;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -