英創EM9160 ARM9工業主板具有豐富的GPIO資源,通過GPIO來實現SPI,I2C的數據傳輸,具有使用非常靈活的優點,同時最高波特率還可達到1Mbps以上。I2C在智能終端中的應用非常普遍,如I2C總線時鐘芯片,I2C總線存貯器等。之前已對I2C總線操作鐵電存貯器有過說明,相關文章請參考《工控主板支持鐵電存儲器的簡易方案》。英創公司的EM9160工業主板的高性價比與高可靠性,使其在智能終端中的應用中越來越具優勢。為了更進一步說明EM9160工業主板使用GPIO來摸擬I2C總線的應用,本文對具有自動溫度補償的實時鐘RX8025的操作為例來說明。對于I2C總來來說,最重要的是同步時鐘與數據之間的時間關系,為了便于用戶直接使用,英創公司將GPIO摸擬I2C的操作過程進行了封裝,提供最簡潔的函數作為接口,被定義在I2C的頭文件GPIO_I2C.h中,如下所示:
// 初始化I2C總線,主要是設置所使用的GPIO的輸出狀態
int I2C_Init ( );
// 通過I2C寫數據
// 輸入參數
// uDevAddr I2C器件的物理地址
// uRegIdx 要操作的I2C器件內部的寄存器地址
// abyte 要寫入到I2C的數據
// 返回值:>=0 操作成功
// =-1 操作失敗
int I2C_ByteWrite(UCHAR uDevAddr, UCHAR uRegIdx, UCHAR abyte);
// 通過I2C讀取數據
// 輸入參數
// uDevAddr I2C器件的物理地址
// uRegIdx 要操作的I2C器件內部的寄存器地址
// pBuf 所讀取的數據的輸出BUFF
// DataLen 要讀數據的個數
// 返回值:>=0 操作成功 即讀取出來的有效數據
// =-1 操作失敗
int I2C_ByteRead(UCHAR uDevAddr, UCHAR uRegIdx, UCHAR* pBuf, int DataLen);
實現I2C通訊過程控制的源代碼在GPIO_I2C.cpp中,同時在該文件中定義了I2C總線能夠使用的引腳資源及I2C總線SCL、SDA所使用的信號定義:
#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 SCL GPIO6 // GPIO6 被定義為I2C時鐘信號線
#define SDA GPIO7 // GPIO7 被定義為I2C數據線
在使用EM9160工業主板的GPIO來實現I2C總線通訊時,同步時鐘能穩定地工作在250KHz。要注意I2C的兩個信號線,分別為同步時鐘信號線SCL與雙向通訊數據線SDA,這兩條信號線所使用的GPIO被定義在GPIO_I2C.CPP文件中,如上面所示。在使用時根據實際情況,只需重新定義SCL和SDA信號所使用的GPIO即可。下面是調用GPIO_I2C中的操作函數實現時實鐘RX8025操作的調用方法:
// 時鐘寄存器數據讀取
int RTC_ByteRead( unsigned char REG_Addr , unsigned char *pBuf , int iLen)
{
UCHAR cRByte;
int i1 ;
cRByte = REG_Addr<<4; // 根據RX8025的要求,寄存器地址放在高4位
i1 = I2C_ByteRead( RX8025_ADDR , cRByte , pBuf , iLen );
return i1;
}
// 時鐘寄存器數據設置
int RTC_ByteWrite( unsigned char REG_Addr, unsigned char Value )
{
UCHAR cRByte;
int i1;
cRByte = REG_Addr<<4;
i1 = I2C_ByteWrite( RX8025_ADDR , cRByte , Value );
if( i1 == -1 )
return -1;
return 1;
}
再次調用以上兩個實時鐘讀寫操作函數則可輕實現現對RX8025的操作,如下:
// 只讀取控制寄存器2
i1 = RTC_ByteRead ( Reg_Contor2 , &cTmp , 1 );
// 從秒地址開始將年、月、日、時、分、秒、星期的數據一次性讀出
i1 = RTC_ByteRead( Reg_Second , cTmp , 7 );
// 設置時間寄存器“年”為10年
i1 = RTC_ByteWrite( Reg_Year , 0x10 );
對于I2C總線協議,請參考相關的參考資料。英創公司提供的GPIO摸擬I2C總線的程序適用于英創公司所有的嵌入式主板,感興趣的客戶可向英創索要相關源代碼。
-
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35613
發布評論請先 登錄
相關推薦
評論