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

工控主板支持铁电存储器的简易方案

工控主板支持铁电存储器的简易方案

英创公司的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格式下载
好啊楼主,没想到啊,太好了
返回列表