/********************************************************************************
* 项目名称: SCC290
* 文件名称: drv_FM25CL64.c
* DATE: 2014
* AUTHOR: Shine
* 要点:
*
* -----------------------------------------------------------------------------*
*********************************************************************************/
#include "config.h"
void FM25CL64_NOP(void )
{
u08 i = 0 ;
for( i=0; i<200;i++ )
{
;
}
}
/*
* 函数: void FM25CL64_init( void )
* 输入:
* 输出:
* 说明: 对于没有WP保护和HOLD控制需求的应用,初始化wp hold 2引脚.
*/
void FM25CL64_init( void )
{
_delay_ms(2);
FM25CL64_WP = 1 ;
FM25CL64_HOLD= 1;
}
/*
* 向FM25CL64写入一个字节
*/
unsigned char In_FM25CL64_Byte()
{
unsigned char in=0,i;
for(i=0;i<8;i++)
{
FM25CL64_SCK=0;
FM25CL64_NOP();
FM25CL64_NOP();
FM25CL64_NOP();
FM25CL64_SCK=1;
in=in<<1;
if( FM25CL64_SO )
{
in|=0x01;
}
}
return(in);
}
/*
* 从FRAM读取一个字节
*/
void Out_FM25CL64_Byte(unsigned char byte)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
FM25CL64_SCK=0;
FM25CL64_NOP();
FM25CL64_NOP();
FM25CL64_NOP();
FM25CL64_SI= (byte&0x80);
FM25CL64_SCK=1;
byte<<=1;
}
FM25CL64_SCK=0;
FM25CL64_SI=0;
return;
}
/*
* 读取FRAM的状态
*
*/
unsigned char ReadState()
{
unsigned char r;
FM25CL64_SCK=0;
FM25CL64_CS=0;
Out_FM25CL64_Byte(FM25CL64_RDSR_INST);
FM25CL64_NOP();
FM25CL64_NOP();
FM25CL64_NOP();
r=In_FM25CL64_Byte();
FM25CL64_SCK=0;
FM25CL64_NOP();
FM25CL64_NOP();
FM25CL64_NOP();
FM25CL64_CS=1;
return(r);
}
/*
* 检查读状态
*/
void wip_poll()
{
unsigned char i=0,r;
do
{
r=ReadState();
i++;
}
while((r&0x01)&&i<0x99);
}
/* 写入使能 */
void WriteEnable( void )
{
FM25CL64_SCK=0;
FM25CL64_CS=0;
Out_FM25CL64_Byte(FM25CL64_WREN_INST);
FM25CL64_SCK=0;
FM25CL64_CS=1;
return;
}
/*
*
*/
void WriteState(void)
{
WriteEnable();
FM25CL64_SCK=0;
FM25CL64_CS=0;
Out_FM25CL64_Byte(FM25CL64_WRSR_INST);
Out_FM25CL64_Byte(FM25CL64_STATUS_REG);
FM25CL64_SCK=0;
FM25CL64_CS=1;
wip_poll();
}
/* 读取存储单元的内容,一个字节 */
unsigned char Read_FM25CL64_Byte(unsigned int address)
{
unsigned char dat;
FM25CL64_SCK=0;
FM25CL64_CS=0;
FM25CL64_NOP();
Out_FM25CL64_Byte(FM25CL64_READ_INST);
FM25CL64_NOP();
FM25CL64_NOP();
Out_FM25CL64_Byte((address&0xff00)>>8);
FM25CL64_NOP();
FM25CL64_NOP();
Out_FM25CL64_Byte(address&0x00ff);
FM25CL64_NOP();
FM25CL64_NOP();
dat=In_FM25CL64_Byte();
FM25CL64_SCK=0;
FM25CL64_CS=1;
return(dat);
}
/* 读取存储单元的内容,多个字节 */
void Read_FM25CL64_nByte(unsigned int address,unsigned char *dat,unsigned char number)
{
unsigned char i;
FM25CL64_SCK=0;
FM25CL64_CS=0;
FM25CL64_NOP();
Out_FM25CL64_Byte(FM25CL64_READ_INST);
FM25CL64_NOP();
FM25CL64_NOP();
Out_FM25CL64_Byte((address&0xff00)>>8);
FM25CL64_NOP();
FM25CL64_NOP();
Out_FM25CL64_Byte(address&0x00ff);
FM25CL64_NOP();
FM25CL64_NOP();
for(i=0;i<number;i++)
{
*(dat+i)=In_FM25CL64_Byte();
}
FM25CL64_SCK=0;
FM25CL64_CS=1;
return;
}
/* 写入一个数据到指定位置 */
void Write_FM25CL64_Byte(unsigned int address,unsigned char dat)
{
WriteEnable();
FM25CL64_SCK=0;
FM25CL64_CS=0;
Out_FM25CL64_Byte(FM25CL64_WRITE_INST);
FM25CL64_NOP();
FM25CL64_NOP();
Out_FM25CL64_Byte((address&0xff00)>>8);
FM25CL64_NOP();
FM25CL64_NOP();
Out_FM25CL64_Byte(address&0x00ff);
FM25CL64_NOP();
FM25CL64_NOP();
Out_FM25CL64_Byte(dat);
FM25CL64_SCK=0;
FM25CL64_CS=1;
wip_poll();
return;
}
/* 写入多个字节到指定位置 */
void Write_FM25CL64_nByte(unsigned int address,unsigned char *dat,unsigned char number)
{
unsigned char i;
WriteEnable();
FM25CL64_SCK=0;
FM25CL64_CS=0;
Out_FM25CL64_Byte(FM25CL64_WRITE_INST);
FM25CL64_NOP();
FM25CL64_NOP();
Out_FM25CL64_Byte((address&0xff00)>>8);
FM25CL64_NOP();
FM25CL64_NOP();
Out_FM25CL64_Byte(address&0x00ff);
FM25CL64_NOP();
FM25CL64_NOP();
for(i=0;i<number;i++)
{
Out_FM25CL64_Byte(*(dat+i));
}
FM25CL64_SCK=0;
FM25CL64_CS=1;
wip_poll();
return;
}
|