标题:
工控主板支持铁电存储器的简易方案
[打印本页]
作者:
emtronix20105
时间:
2010-5-13 09:08
标题:
工控主板支持铁电存储器的简易方案
英创公司的ARM9 系列工控主板产品,对数据的记录均采用了基于NandFlash的文件系统,但在实际应用中,客户经常需要频繁的记录一些小块的重要数据,同时要求数据在掉电情况下不丢失,这时如果采用文件系统就不能完全满足需求。通常的解决办法是将数据直接存储在非易性存储器中(NVRAM)。NVRAM有两种基本类型,一是基于SRAM的传统NVRAM,另一种是近些年广泛使用的铁电存储器,与传统的基于SRAM技术的存储器相比,铁电存储器在信号接口、操作功耗方面有无可比拟的优势。目前在市场流行的有4Kb-256Kb铁电存储器产品,并有多种接口类型可供选择,包括I2C、SPI接口等,本文以Ramtron公司的FM24L256为例,介绍英创主板EM9160操作FM24L256的方法。
FM24L256非易失铁电存储器结构容量为32,768 x 8位,读/写次数无限制,掉电数据保存10年,无延时写入操作,采用I2C总线接口,总线频率可高达1MHz。同时具有工业级温度范围,低功耗操作等特点。EM9160 是英创公司的一款预装Windows CE 实时操作系统的高性价比ARM9 工控主板产品。EM9160 最多可支持16 位方向可独立设置的GPIO,这些GPIO 均可被用来仿真作为I2C的信号。
FM24L256为SOP8封装芯片,只需把2位I2C总线信号与EM9160的GPIO相连,即完成扩展硬件的连接。
EM9160工控主板对铁电存储器FM24L256的驱动程序描述如下:
#include
'
EM9160_DIO_EX.h
'
#define
GPIO0 0x01
#define
GPIO1 0x02
#define
GPIO2 0x04
#define
GPIO3 0x08
#define
GPIO4 0x10
#define
GPIO5 0x20
#define
GPIO6 0x40
#define
GPIO7 0x80
#define
GPIO8 0x100
#define
GPIO9 0x200
#define
GPIO10 0x400
#define
GPIO11 0x800
#define
GPIO12 0x1000
#define
GPIO13 0x2000
#define
GPIO14 0x4000
#define
GPIO15 0x8000
#define
SCK GPIO6
// I2C时钟信号,可根据实际情况更改
#define
SDA GPIO7
// I2C数据信号,可根据实际情况更改
实现SCK和SDA信号的操作函数:
void
GPIO_i2c::SetSDADir(
int
Dir)
//设置SDA方向
{
if
(Dir)
PIO_OutEnableEx( SDA );
// set gpio7 to output (SDA)
else
PIO_OutDisableEx( SDA );
// set gpio7 to input (SDA)
}
void
GPIO_i2c::SetSCL(
int
Level)
//置高/置低SCK信号
{
if
(Level)
PIO_OutSetEx( SCK );
else
PIO_OutClearEx( SCK );
}
void
GPIO_i2c::SetSDA(
int
Level)
//置高/置低SDA信号
{
if
(Level)
PIO_OutSetEx( SDA );
else
PIO_OutClearEx( SDA );
}
int
GPIO_i2c::GetSDA()
//读取SDA状态
{
DWORD
dwSDAStatus = 0;
// put code here to get SDA status
PIO_StateEx( (
UINT16
*) &dwSDAStatus );
dwSDAStatus = dwSDAStatus & SDA;
if
(dwSDAStatus)
{
return
1;
}
return
0;
}
int
GPIO_i2c::I2C_InitController( )
//设置SCK,SDA,只初始化时执行一次
{
//set gpio6 and gpio7
PIO_OutEnableEx( SCK );
// set gpio6 to output (CLK)
PIO_OutSetEx( SCK );
// set CLK
SetSDADir(0);
// set SDA to input
return
0;
}
根据FM24L256的时序要求,构造相应的读写函数,EM24L256的读写时序如下图所示:
////////////////////////////////////////////////////////////////////////////
// 从I2C器件读取一个或多个字节
// 输入参数:
//
uDevAddr:器件地址
//
uRegIdx: 器件寄存器地址
//
ReadBuf: 数据缓存
//
ReadLen: 读取数据个数
// return = -1: 失败
// = ReadLen: read succeed!
////////////////////////////////////////////////////////////////////////////
int
GPIO_i2c::I2C_ByteRead(
UCHAR
uDevAddr,
UINT16
uRegIdx,
UCHAR
* ReadBuf,
int
ReadLen )
////////////////////////////////////////////////////////////////////////////
// 向I2C器件写入一个或多个字节
// 输入参数:
//
uDevAddr:器件地址
//
uRegIdx: 器件寄存器地址
//
ReadBuf: 数据缓存
//
ReadLen: 写入数据个数
// return = WriteLen: 写入成功
// = -1: 写入失败,没有应答信息
////////////////////////////////////////////////////////////////////////////
int
GPIO_i2c::I2C_ByteWrite(
UCHAR
uDevAddr,
UINT16
uRegIdx,
UCHAR
* WriteBuf,
int
WriteLen)
......
[
查看全文
]
[
关于英创
]
[
更多文章
]
[
技术论坛
]
本文PDF格式下载
作者:
老牛的父亲
时间:
2010-5-22 01:31
好啊楼主,没想到啊,太好了
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0