英创信息技术工控主板支持铁电存储器方案

英创公司的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)
本文是以em9160操作fm24l256为例,介绍如何构造i2c接口,这个方法也完全适合英创公司的其他嵌入式工控主板产品,如em9000、em9161、em9260、etr232i等。em9160与fm24l256连接十分简单,在需要频繁记录数据的场合,本文介绍的方案是一个不错的选择,经过测试,em9160对fm24l256的写入速度可达每秒56k字节,感兴趣的客户可向英创索要相关源代码。

海信发布两款ULED电视新品 真正的三好全面屏电视
一起聊聊PCB的阻抗控制
碳化硅在电动汽车车载充电器和电池管理解决方案中的应用
便宜好用的水银体温计将禁产!温度传感器全面替代!
mc34063降压电路及工作原理
英创信息技术工控主板支持铁电存储器方案
三代锐龙CPU Die艺术照图赏
电动晾衣架面板灯升压恒流调光方案H6911
中国移动公布2018年前三季度营业数据,比上年同期下降0.3%
第1部分:sparkfun的布局设计工具和开源硬件衍生工具
场效应管有哪些用途?
量子力学的哥本哈根解释
原料价格上涨,APS智能排产在锂电池行业的应用
光纤传输性能分析:非线性噪声来源简述
OPPOR11什么时候上市最新消息:OPPO R11拍照神器即将发布,现实生活真机曝光以及相机拍摄图片效果!
映射位到某个RAM变量的方法
空间转录组测序用于免疫治疗研究
如何防范钓鱼wifi
跨阻放大器电路的增益和动态特性的指导性示例
从芯出发 驱动未来 宏微科技倾情助力公益活动