首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

【晒FRAM铁电存储器样片】+ MB85RS64 试用心得--收到东西啦

【晒FRAM铁电存储器样片】+ MB85RS64 试用心得--收到东西啦

本帖最后由 harvardx 于 2014-8-21 12:01 编辑

开篇:
【晒FRAM铁电存储器样片】+ MB85RS64 试用心得--收到东西啦. 很惊喜.

试用过程:


              比较巧合,申请的时候没有特别在意接口和容量, 拿到手一看是RS64,就呵呵了 .刚好跟手头在用的FRAM25CL64基本兼容,于是现成利用现有平台.果断焊接上新的芯片.驱动几乎没怎么动.于是各位看官看到的代码,函数名居然是FM25cxxxx开头,无意为ramtron打广告,他的东西可不便宜. 是富士Fujitsu给了我们不二的选择.让我们在性价比上多了一个更好的选择.






             简要介绍一下,板子的构成一个主控单片机,51的.你懂的 ,然后是日历芯片,FRAM,各种ad采集.io输入输出.
FRAM的目的是存储20组故障记录,每组10条,每条是16字节;也就是3200字节的存储, 写入读出可能都比较频繁;
上位机来要数据,直接发送20条读取命令,就一下子,一批批,把3200字节读完了.



下面上一下测试代码: 来源于网络,写的不错.加入到项目里面 没怎么调试都ok了 ,当然我芯片的wp和hold引脚都没有去涉及,在我们的系统不是十分重要.重点参数都是放在单片机内部的.外部的就是做一个故障记录

测试代码:

1 底层驱动:


/*


*   函数: void FM25CL64_init( void )

*   输入:
*   输出:
*   说明: 对于没有WP保护和HOLD控制需求的应用,初始化wp hold 2引脚.
*/
void FM25CL64_init( void )
{
    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;
        _nop_();
        _nop_();
        _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;
        _nop_();
        _nop_();
        _nop_();
        FM25CL64_SI=(bit)(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);
    _nop_();
    _nop_();
    _nop_();
    r=In_FM25CL64_Byte();
    FM25CL64_SCK=0;
    _nop_();
    _nop_();
    _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()
{
    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;
    _nop_();
    Out_FM25CL64_Byte(FM25CL64_READ_INST);
    _nop_();
    _nop_();
    Out_FM25CL64_Byte((address&0xff00)>>8);
    _nop_();
    _nop_();
    Out_FM25CL64_Byte(address&0x00ff);
    _nop_();
    _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;
    _nop_();
    Out_FM25CL64_Byte(FM25CL64_READ_INST);
    _nop_();
    _nop_();
    Out_FM25CL64_Byte((address&0xff00)>>8);
    _nop_();
    _nop_();
    Out_FM25CL64_Byte(address&0x00ff);
    _nop_();
    _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);
    _nop_();
    _nop_();
    Out_FM25CL64_Byte((address&0xff00)>>8);
    _nop_();
    _nop_();
    Out_FM25CL64_Byte(address&0x00ff);
    _nop_();
    _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);
    _nop_();
    _nop_();
    Out_FM25CL64_Byte((address&0xff00)>>8);
    _nop_();
    _nop_();
    Out_FM25CL64_Byte(address&0x00ff);
    _nop_();
    _nop_();
    for(i=0;i<number;i++)
    {
        Out_FM25CL64_Byte(*(dat+i));
    }

    FM25CL64_SCK=0;
    FM25CL64_CS=1;
    wip_poll();
    return;
}


//////////////////////////////////////////////////////////////////////////////////////////
// 读取故障记录部分:
/////////////////////////////////////////////////////////////////////////////////////////
\

/***************************************************************************  


** 函数:  void fault_rec_read( u08 n )
** 功能:  读取某组的故障记录
** 输入:  n,第n组记录
** 输出:  无
***************************************************************************/
u08 SYS_fault_rec[10][16]; /* 定义需要传送的一组故障记录,共10条,每条16字节 */

void fault_rec_read( u08 n )
{

u08 i,j;

u16 rec_ptr;

/* 记录合理性检测 */


if( n >= 19) n = 19;

/* 获取改组记录的首地址:m组,第0条 */

rec_ptr = REC_GROUPm_INDEXn_FRAM_ADR(n,0);


/* 利用循环开始读取FRAM中的记录到内存 */

for( i=0; i< REC_INDEX_LEN; i++ )
    {
        /* 读一条记录的10个字节*/
        for( j=0; j < REC_BYTE_LEN ; j++ )
        {

            SYS_fault_rec [ j ]=Read_FM25CL64_Byte(rec_ptr );
            rec_ptr++;
        }
    }
}

/////////////////////////////////////////////////////////////////////////////////////////////
// fram驱动对外的函数声明和常数定义
////////////////////////////////////////////////////////////////////////////////////////////

#ifndef _DRV_FRAM_H
#define _DRV_FRAM_H

/*
*  定义FRAM操作的端口
*/
sbit FM25CL64_SCK  = P3^7;
sbit FM25CL64_SI   = P3^6;
sbit FM25CL64_CS   = P3^3;
sbit FM25CL64_SO   = P3^4;

sbit FM25CL64_WP   = P3^5;

sbit FM25CL64_HOLD   = P2^0;



/* 定义FM25CL64常用的数据命令 */
#define FM25CL64_WREN_INST 0x06
#define FM25CL64_WRDI_INST 0x04
#define FM25CL64_RDSR_INST 0x05
#define FM25CL64_WRSR_INST 0x01
#define FM25CL64_WRITE_INST 0x02
#define FM25CL64_READ_INST 0x03
#define FM25CL64_STATUS_REG 0x0
#define FM25CL64_INIT_STATE 0x09

/* 供系统应用调用的函数声明 */
void FM25CL64_init( void );
void Read_FM25CL64_nByte (unsigned int address,unsigned char  *dat,unsigned char number);
void Write_FM25CL64_nByte(unsigned int address,unsigned char  *dat,unsigned char number);
void Write_FM25CL64_Byte(unsigned int address,unsigned char dat);
unsigned char Read_FM25CL64_Byte(unsigned int address);
void WriteEnable();


#endif
QQ图片20140821001129.jpg

RE: 【晒FRAM铁电存储器样片】+ MB85RS64 试用心得--收到东西啦

1# harvardx
期待奖品 还没有收到嘛
返回列表