英創公司的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字節,感興趣的客戶可向英創索要相關源代碼。
-
WINDOWS
+關注
關注
4文章
3569瀏覽量
89300 -
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35612
發布評論請先 登錄
相關推薦
評論