⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fram.c

📁 原创的msp430单片机的整套编码 包括通信,红外检测,软件计时等多种功能
💻 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 + -