EM9170提供了一路硬件I2C總線,與GPIO6和GPIO7復(fù)用。系統(tǒng)啟動(dòng)后,引腳狀態(tài)默認(rèn)為GPIO輸入狀態(tài)。當(dāng)打開(kāi)I2C后,系統(tǒng)重新設(shè)置GPIO引腳為I2C總線模式。在使用時(shí)需要注意,I2C的兩條信號(hào)線上均要加上拉電阻才能正常使用I2C功能。
在CE6.0操作系統(tǒng)中,I2C資源的使用,需要系統(tǒng)驅(qū)動(dòng)程序作為支持。所以使用時(shí),可以反復(fù)調(diào)用DeviceIoControl來(lái)實(shí)現(xiàn)。為了方便使用,英創(chuàng)公司基于驅(qū)動(dòng)程序,封裝了4個(gè)I2C的操作函數(shù)便于應(yīng)用程序調(diào)用,在這4個(gè)函數(shù)內(nèi)都是調(diào)用DeviceIoControl來(lái)實(shí)現(xiàn),相關(guān)源碼在例程文件夾的I2C.CPP文件中。由于I2C操作時(shí),需要傳輸?shù)膮?shù)量較多,所以在I2C的API函數(shù)中使用了一個(gè)統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)來(lái)作為參數(shù)傳遞載體,該數(shù)據(jù)結(jié)構(gòu)的定義如下:
typedef struct
{
BYTE SlaveAddr; // 要操作的I2C器件的設(shè)備物理地址
WORD RegAddr; // 要操作的設(shè)備的存貯器起始地址
BYTE *pDataBuff; // 要寫(xiě)入/讀出的數(shù)據(jù)BUFF
int iDLen; // 要寫(xiě)入/讀出的數(shù)據(jù)的字節(jié)長(zhǎng)度
} I2CParameter , *pI2CParameter;
在進(jìn)行I2C操作之前,需要設(shè)置I2C設(shè)備的物理地址、要操作的存貯器起始地址,數(shù)據(jù)長(zhǎng)度及數(shù)據(jù)。即定義一個(gè)I2CParameter類(lèi)型的變量并設(shè)置相應(yīng)參數(shù),在調(diào)用I2CWrite和I2CRead時(shí),將該變量傳遞給pI2CParameter類(lèi)型的指針即可。如:
I2CParameter I2C1; // 定義一個(gè)I2CParameter結(jié)構(gòu)類(lèi)型的變量
I2C1.SlaveAddr=0xa0; // I2C設(shè)備物理地址設(shè)置為0xA0
I2C1.RegAddr=0; // 要操作的I2C設(shè)備的寄存器起始地址是0
I2C1.pDataBuff = InBuffer; // I2C操作所分配的BUFF
I2C1.iDLen=50; // 要操作的數(shù)據(jù)長(zhǎng)度是50字節(jié)
EM9170的I2C驅(qū)動(dòng)只支持主機(jī)工作模式、最高400KHz的工作時(shí)鐘,可以多個(gè)I2C設(shè)備并聯(lián),由I2C設(shè)備的物理地址來(lái)進(jìn)行區(qū)分。封裝后的I2C操作函數(shù)說(shuō)明如下:
//----------------------------------------------------------------------------
// I2COpen:該函數(shù)主要是打開(kāi)I2C端口并設(shè)置好I2C的工作模式。
// 主要任務(wù)是:
// 打開(kāi)I2C,復(fù)位I2C控制器,設(shè)置I2C工作在Master模式,設(shè)置I2C工作時(shí)鐘為400KHz
//----------------------------------------------------------------------------
HANDLE I2COpen( );
//----------------------------------------------------------------------------
// I2CWrite:通過(guò)已打開(kāi)的I2C設(shè)備進(jìn)行數(shù)據(jù)寫(xiě)操作
// 輸入?yún)?shù):
// hDevice:已打開(kāi)設(shè)備的HANDLE值
// pI2CPar:操作I2C設(shè)備時(shí)I2CParameter類(lèi)型的指針
// 返回:
// 操作成功 TRUE
// 操作失敗 FALSE
//----------------------------------------------------------------------------
bool I2CWrite(HANDLE hDevice , pI2CParameter pI2CPar);
/*----------------------------------------------------------------------------
// I2CRead:通過(guò)已打開(kāi)的I2C設(shè)備進(jìn)行數(shù)據(jù)讀操作
// 輸入?yún)?shù):
// hDevice:已打開(kāi)設(shè)備的HANDLE值
// pI2CPar:操作I2C設(shè)備時(shí)I2CParameter類(lèi)型的指針
// 返回:
// 操作成功 TRUE
// 操作失敗 FALSE
// ------------------------------------------------------------------------------*/
bool I2CRead(HANDLE hDevice , pI2CParameter pI2CPar);
// ------------------------------------------------------------------------------*/
// I2CClose:關(guān)閉I2C端口。
// 在不使用I2C時(shí),需要關(guān)閉已打開(kāi)的I2C端口以對(duì)話釋放相關(guān)資源。
// 輸入?yún)?shù):
// 成功打開(kāi)的I2C設(shè)備的HANDLE值
// 返回:
// 操作成功 TRUE
// 操作失敗 FALSE
// ------------------------------------------------------------------------------*/
bool I2CClose( HANDLE hDevice );
下面是基于上述API函數(shù),對(duì)FM24L256鐵電存貯器進(jìn)行測(cè)試的例程:
HANDLE hI2C;
I2CParameter I2C1;
BYTE InBuffer[50],OutBuffer[50];
int i1;
// 初始化I2C設(shè)備參數(shù)
I2C1.SlaveAddr=0xa0; // I2C設(shè)備物理地址設(shè)置,每種器件應(yīng)有對(duì)應(yīng)的物理地址
I2C1.RegAddr=0; // 要操作的I2C設(shè)備的寄存器地址
I2C1.iDLen=50; // 要操作讀/寫(xiě)的數(shù)據(jù)長(zhǎng)度
I2C1.pDataBuff = InBuffer; // 數(shù)據(jù)緩沖區(qū),這里為寫(xiě)入緩沖區(qū)
for(i1=0;i1<50;i1++) // 產(chǎn)生測(cè)試用的隨機(jī)數(shù)據(jù)
{
InBuffer[i1] = rand() & 0xff;
}
hI2C = I2COpen(); // 打開(kāi)I2C端口
if( hI2C == NULL )
{
printf('I2C Open ERR!\r\n');
return 0;
}
if( I2CWrite( hI2C , &I2C1 ) ) // 向已打開(kāi)的I2C設(shè)備進(jìn)行寫(xiě)操作
{
printf('I2C Write Ok:len=%d\r\n',I2C1.iDLen);
I2C1.pDataBuff = OutBuffer; // 重新設(shè)定數(shù)據(jù)緩沖區(qū),這里為讀出緩沖區(qū)
if( I2CRead( hI2C , &I2C1 ) ) // 從已開(kāi)打的I2C設(shè)備讀取數(shù)據(jù)
{
printf('I2C Read Ok:len=%d\r\n',I2C1.iDLen);
for(i1=0;i1<50;i1++) // 寫(xiě)入數(shù)據(jù)和讀出數(shù)據(jù)進(jìn)行比較
{
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 ); // 關(guān)閉已打開(kāi)的I2C端口
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6102瀏覽量
36308
發(fā)布評(píng)論請(qǐng)先 登錄
I2C總線通信原理 如何設(shè)計(jì)I2C總線電路
I2C總線的優(yōu)缺點(diǎn)分析
I2C總線與Arduino的接口示例
I2C總線的工作模式介紹
I2C總線協(xié)議詳細(xì)解析
I2C總線故障排除技巧
I2C總線與單片機(jī)的連接
I2C總線應(yīng)用實(shí)例分析
I2C總線與SPI總線的比較
I2C總線上拉電阻阻值如何確定?

I2C總線的技術(shù)特性介紹

評(píng)論