EM9170提供了一路硬件I2C總線,與GPIO6和GPIO7復用。系統啟動后,引腳狀態默認為GPIO輸入狀態。當打開I2C后,系統重新設置GPIO引腳為I2C總線模式。在使用時需要注意,I2C的兩條信號線上均要加上拉電阻才能正常使用I2C功能。
在CE6.0操作系統中,I2C資源的使用,需要系統驅動程序作為支持。所以使用時,可以反復調用DeviceIoControl來實現。為了方便使用,英創公司基于驅動程序,封裝了4個I2C的操作函數便于應用程序調用,在這4個函數內都是調用DeviceIoControl來實現,相關源碼在例程文件夾的I2C.CPP文件中。由于I2C操作時,需要傳輸的參數量較多,所以在I2C的API函數中使用了一個統一的數據結構來作為參數傳遞載體,該數據結構的定義如下:
typedef struct
{
BYTE SlaveAddr; // 要操作的I2C器件的設備物理地址
WORD RegAddr; // 要操作的設備的存貯器起始地址
BYTE *pDataBuff; // 要寫入/讀出的數據BUFF
int iDLen; // 要寫入/讀出的數據的字節長度
} I2CParameter , *pI2CParameter;
在進行I2C操作之前,需要設置I2C設備的物理地址、要操作的存貯器起始地址,數據長度及數據。即定義一個I2CParameter類型的變量并設置相應參數,在調用I2CWrite和I2CRead時,將該變量傳遞給pI2CParameter類型的指針即可。如:
I2CParameter I2C1; // 定義一個I2CParameter結構類型的變量
I2C1.SlaveAddr=0xa0; // I2C設備物理地址設置為0xA0
I2C1.RegAddr=0; // 要操作的I2C設備的寄存器起始地址是0
I2C1.pDataBuff = InBuffer; // I2C操作所分配的BUFF
I2C1.iDLen=50; // 要操作的數據長度是50字節
EM9170的I2C驅動只支持主機工作模式、最高400KHz的工作時鐘,可以多個I2C設備并聯,由I2C設備的物理地址來進行區分。封裝后的I2C操作函數說明如下:
//----------------------------------------------------------------------------
// I2COpen:該函數主要是打開I2C端口并設置好I2C的工作模式。
// 主要任務是:
// 打開I2C,復位I2C控制器,設置I2C工作在Master模式,設置I2C工作時鐘為400KHz
//----------------------------------------------------------------------------
HANDLE I2COpen( );
//----------------------------------------------------------------------------
// I2CWrite:通過已打開的I2C設備進行數據寫操作
// 輸入參數:
// hDevice:已打開設備的HANDLE值
// pI2CPar:操作I2C設備時I2CParameter類型的指針
// 返回:
// 操作成功 TRUE
// 操作失敗 FALSE
//----------------------------------------------------------------------------
bool I2CWrite(HANDLE hDevice , pI2CParameter pI2CPar);
/*----------------------------------------------------------------------------
// I2CRead:通過已打開的I2C設備進行數據讀操作
// 輸入參數:
// hDevice:已打開設備的HANDLE值
// pI2CPar:操作I2C設備時I2CParameter類型的指針
// 返回:
// 操作成功 TRUE
// 操作失敗 FALSE
// ------------------------------------------------------------------------------*/
bool I2CRead(HANDLE hDevice , pI2CParameter pI2CPar);
// ------------------------------------------------------------------------------*/
// I2CClose:關閉I2C端口。
// 在不使用I2C時,需要關閉已打開的I2C端口以對話釋放相關資源。
// 輸入參數:
// 成功打開的I2C設備的HANDLE值
// 返回:
// 操作成功 TRUE
// 操作失敗 FALSE
// ------------------------------------------------------------------------------*/
bool I2CClose( HANDLE hDevice );
下面是基于上述API函數,對FM24L256鐵電存貯器進行測試的例程:
HANDLE hI2C;
I2CParameter I2C1;
BYTE InBuffer[50],OutBuffer[50];
int i1;
// 初始化I2C設備參數
I2C1.SlaveAddr=0xa0; // I2C設備物理地址設置,每種器件應有對應的物理地址
I2C1.RegAddr=0; // 要操作的I2C設備的寄存器地址
I2C1.iDLen=50; // 要操作讀/寫的數據長度
I2C1.pDataBuff = InBuffer; // 數據緩沖區,這里為寫入緩沖區
for(i1=0;i1<50;i1++) // 產生測試用的隨機數據
{
InBuffer[i1] = rand() & 0xff;
}
hI2C = I2COpen(); // 打開I2C端口
if( hI2C == NULL )
{
printf('I2C Open ERR!\r\n');
return 0;
}
if( I2CWrite( hI2C , &I2C1 ) ) // 向已打開的I2C設備進行寫操作
{
printf('I2C Write Ok:len=%d\r\n',I2C1.iDLen);
I2C1.pDataBuff = OutBuffer; // 重新設定數據緩沖區,這里為讀出緩沖區
if( I2CRead( hI2C , &I2C1 ) ) // 從已開打的I2C設備讀取數據
{
printf('I2C Read Ok:len=%d\r\n',I2C1.iDLen);
for(i1=0;i1<50;i1++) // 寫入數據和讀出數據進行比較
{
if( InBuffer[i1] != OutBuffer[i1] )
{
break;
}
}
if(i1 == 50)
printf('All Test Data OK!\r\n');
else
printf('Test Data Error:%d\r\n',i1);
}
}
I2CClose( hI2C ); // 關閉已打開的I2C端口
-
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35497
發布評論請先 登錄
相關推薦
評論