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