0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)JAVA操作英創(chuàng)主板I2C接口簡介

英創(chuàng)信息技術(shù) ? 來源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2020-02-06 11:06 ? 次閱讀

2017年9月,英創(chuàng)在Linux的文件系統(tǒng)中移植了針對(duì)嵌入式Linux的JRE(Java Runtime Environment),能夠支持Java應(yīng)用程序的運(yùn)行。由于Java語言不能直接訪問硬件資源,英創(chuàng)提供了Java硬件支持包,主要支持的工控接口有:以太網(wǎng)、串口、CAN、GPIO、SPI、I2C、RTC等。本文主要介紹使用Java語言調(diào)用英創(chuàng)Java硬件支持包,操作英創(chuàng)主板I2C接口的過程。

1、I2C簡介

I2C(Inter-Integrated Circuit)總線是一種2線制(串行數(shù)據(jù)SDA、串行時(shí)鐘頻率SCL)的主從通訊協(xié)議,主要運(yùn)用于器件之間的數(shù)據(jù)通訊。SDA和SCL雙向漏極開路(Open Drain)并利用電阻將電位上拉,同一個(gè)I2C總線上可以掛載多個(gè)I2C設(shè)備,如下圖所示。

圖1I2C掛載設(shè)備示意圖

圖2I2C時(shí)序圖

I2C總線是電平有效,在SCL信號(hào)為高電平的時(shí)候采樣SDA信號(hào)。如上圖所示,其通信過程為:SDA從1變動(dòng)到0,而SCL還是1時(shí),表示開始數(shù)據(jù)傳輸。接下來的7位,就是設(shè)備的地址。緊接著的是讀寫標(biāo)志,其為1時(shí)是讀取,為0則是寫。如果I2C總線上存在著和請(qǐng)求的地址相對(duì)應(yīng)的設(shè)備,則從設(shè)備會(huì)發(fā)送一個(gè)ACK信號(hào)通知主設(shè)備,可以發(fā)送數(shù)據(jù)了。接到ACK信號(hào)后,主設(shè)備則發(fā)送一個(gè)8位的數(shù)據(jù),然后等待ACK。當(dāng)傳輸完畢之后,SCL保持為1,SDA從0變換到1時(shí),表明傳輸結(jié)束。

2、I2C傳輸數(shù)據(jù)結(jié)構(gòu)

英創(chuàng)提供的I2C傳輸數(shù)據(jù)結(jié)構(gòu)源文件為emtronix.hardware.I2CParam.java。每一個(gè)I2CParam類實(shí)例代表一次I2C通信,其主要成員變量如下所示:

public class I2CParam {

public byte SlaveAddr; //I2C從設(shè)備地址

public char RegAddr; //要訪問的I2C從設(shè)備寄存器地址

public byte[] Databuf; //寫入/讀出的數(shù)據(jù)緩存

}

其中,SlavaAddr是要訪問的從設(shè)備的地址,RegAddr是要訪問的從設(shè)備的寄存器地址,Databuf是用戶申請(qǐng)好的緩存區(qū)域,讀寫的長度由此緩存區(qū)域的長度(Databuf.length)決定。

3、I2C傳輸接口函數(shù)

英創(chuàng)提供的I2C傳輸接口源文件為emtronix.hardware.I2C.java。用戶在實(shí)例化I2C類后可以調(diào)用Open、Read、Write、Close對(duì)I2C硬件接口進(jìn)行操作。I2C類的具體信息如下,其中mFd為設(shè)備描述符,用戶不用設(shè)置,由接口函數(shù)自動(dòng)修改。

public class I2C {

private int mFd;

public I2C() {

mFd = -1;

}

public void info() {

System.out.println("mfd " + mFd);

}

/**

* 打開/dev/i2c-0設(shè)備

* @return 成功返回非負(fù)設(shè)備描述符;失敗返回-1

*/

public native int Open();

/**

* 從I2C總線發(fā)送一幀數(shù)據(jù),從設(shè)備的地址和寄存器地址由i2cparam指定

* @param i2cparam 指定發(fā)送從設(shè)備的地址和寄存器地址,以及攜帶的數(shù)據(jù),數(shù)據(jù)長度由i2cParam.DataBuf.length決定

* @return 成功返回非負(fù);失敗返回-1

*/

public native int Write(I2CParam i2cparam);

/**

* 從I2C總線讀一幀數(shù)據(jù),從設(shè)備地址和寄存器地址由i2cparam指定

* @param i2cparam 指定發(fā)送從設(shè)備的地址和寄存器地址,以及攜帶的數(shù)據(jù),數(shù)據(jù)長度由i2cParam.DataBuf.length決定

* @return 成功返回非負(fù);失敗返回-1

*/

public native int Read(I2CParam i2cparam);

/**

* 關(guān)閉I2C設(shè)備

* @return 成功返回0;失敗返回-1

*/

public native int Close();

}

4、I2C從設(shè)備(鍵盤)程序

測試SPI接口的時(shí)候可以直接將MISO和MOSI短接就可以測試發(fā)送和接收數(shù)據(jù),但I(xiàn)2C的測試不能,需要連接到真正的I2C從設(shè)備,根據(jù)其工作時(shí)序,完成I2C通信的測試。這里選擇英創(chuàng)ETA202 I2C鍵盤擴(kuò)展模塊。英創(chuàng)已經(jīng)封裝好了一個(gè)I2CKeypad.java類,對(duì)外提供OpenKeypad、ReadKeypad、CloseKeypad等接口來操作I2C鍵盤。這些接口的內(nèi)部實(shí)現(xiàn)是通過I2C類的接口函數(shù)來完成對(duì)I2C鍵盤的操作。I2CKeyPad類的OpenKeypad接口主要內(nèi)容如下:

public int OpenKeypad()

{

I2CParam i2cparam = new I2CParam();

......

mI2C = new I2C();

mIrq = new IRQ();

//1. open i2c bus

if(mI2C.Open() < 0)

{

System.out.println("I2C open failed\n");

return -1;

}

// 2. config tca8418

i2cparam.SlaveAddr = TCA8418_ADDR;

for(i=0;ilength;i++) {

i2cparam.RegAddr = (char) (TCA8418Config[i].ControlReg & 0x0ffff);

i2cparam.Databuf = new byte[1];

i2cparam.Databuf[0] = TCA8418Config[i].Command;

if(mI2C.Write(i2cparam) < 0) {

System.out.println("I2C write failed\n");

return -1;

}

}

//3. open irq1

if(mIrq.Open("/dev/esm6800_irq1") < 0) {

System.out.println("can not open irq");

return -1;

}

...

//4. 開啟中斷處理線程

scanThread = new Thread(new Runnable() {

public void run() {

mIrq.setTimeout(1000);

while(!Thread.currentThread().isInterrupted()) {

if(mIrq.WaitForIrq()>0) {

KeyScan();

}

}

System.out.println("scanThread exit");

}

});

scanThread.start();

}

I2CKeypad類在OpenKeyPad接口中使用I2C的Write接口對(duì)鍵盤掃描芯片tca8418進(jìn)行了初始化設(shè)置,并開啟了監(jiān)聽中斷處理線程。中斷處理線程中的KeyScan函數(shù)調(diào)用了I2C的Read接口去讀取事件信息,更新按鍵值。tca8418的各個(gè)寄存器功能,請(qǐng)參考模塊ETA202中的數(shù)據(jù)手冊(cè)。I2CKeypad類具體實(shí)現(xiàn)請(qǐng)結(jié)合tca8418的數(shù)據(jù)手冊(cè)參考源碼。

5、I2C鍵盤測試程序

I2C傳輸接口中操作I2C的接口函數(shù)聲明都有native的前綴,表明其實(shí)現(xiàn)部分在本地的庫當(dāng)中。英創(chuàng)將所有英創(chuàng)主板的硬件接口訪問函數(shù)的實(shí)現(xiàn)部分編譯成了動(dòng)態(tài)鏈接庫libemtronixhardware.so,放在了文件系統(tǒng)/lib目錄下。

在編寫I2C傳輸主程序的時(shí)候,首先需要加載該庫,如下所示:

public class testI2CMain {

static {

System.loadLibrary("emtronixhardware");

}

public static void main(String[] args) {

...

}

}

然后,就可以在main函數(shù)中實(shí)例化I2CKeypad類,先調(diào)用OpenKeypad接口初始化鍵盤,接著可調(diào)用I2CKeypad的ReadKeypad接口讀取按鍵信息:

public static void main(String[] args) {

I2CKeypad pad = new I2CKeypad();

int i1 = pad.OpenKeypad();

int key;

if(i1 < 0)

{

System.out.println("open keypad failed");

return;

}

for(i1 = 0; i1 < 10; ) {

key = pad.ReadKeypad();

if(key > 0) {

i1++;

System.out.println("-----key: 0x" + Integer.toHexString(key));

}

}

pad.CloseKeypad();

return ;

}

6、I2C鍵盤測試程序運(yùn)行結(jié)果

運(yùn)行I2C傳輸Java主程序需要把編譯結(jié)果bin文件中的所有目錄文件拷貝到主板/mnt/nandflash,或者通過nfs掛載到主板/mnt/nfs目錄下。然后,使用“java 包名.類名”運(yùn)行,如下圖所示:

圖2運(yùn)行I2C鍵盤測試程序

以上就是使用Java操作英創(chuàng)主板I2C接口的介紹,感興趣的客戶可以通過電話或者郵件聯(lián)系英創(chuàng)工程師。我們將提供Java示例程序源碼供客戶參考。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209535
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6085

    瀏覽量

    35344
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    BTB擴(kuò)展接口:LCD、Camera、UART、I2C等|詳解篇

    今天我們來學(xué)習(xí)的是BTB擴(kuò)展接口的LCD、Camera、UART、I2C詳解,特別分享Air201硬件BTB擴(kuò)展接口相關(guān)內(nèi)容。
    的頭像 發(fā)表于 11-30 09:39 ?323次閱讀
    BTB擴(kuò)展<b class='flag-5'>接口</b>:LCD、Camera、UART、<b class='flag-5'>I2C</b>等|詳解篇

    雅特力AT32F402/F405 I2C使用指南

    I2C接口簡介I2C接口是由數(shù)據(jù)線SDA和時(shí)鐘線SCL構(gòu)成,在標(biāo)準(zhǔn)模式下通信速度可達(dá)到100kHz,快速模式下則可以達(dá)到400kHz,增強(qiáng)快
    的頭像 發(fā)表于 11-20 01:03 ?191次閱讀
    雅特力AT32F402/F405 <b class='flag-5'>I2C</b>使用指南

    RISC V的I2C操作

    :RISC V的I2C操作 文章出處:【微信公眾號(hào):易靈思FPGA技術(shù)交流】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
    的頭像 發(fā)表于 11-01 11:06 ?206次閱讀

    中科創(chuàng)達(dá)榮獲2024年軟件和信息技術(shù)服務(wù)優(yōu)秀企業(yè)

    及前百家企業(yè)”名單。中科創(chuàng)達(dá)憑借非凡的技術(shù)實(shí)力與持續(xù)的創(chuàng)新能力,成功入選“2024年度軟件和信息技術(shù)服務(wù)競爭力百強(qiáng)企業(yè)”以及“2024年軟件和信息技術(shù)服務(wù)優(yōu)秀企業(yè)”。
    的頭像 發(fā)表于 10-30 11:44 ?486次閱讀

    I2C基本指南

    電子發(fā)燒友網(wǎng)站提供《I2C基本指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-10 09:40 ?0次下載
    <b class='flag-5'>I2C</b>基本指南

    如何通過cyusb3014的i2c操作界面操作ads1119的i2c接口?

    Addr_,但我只需要發(fā)送一條命令,如復(fù)位命令等。 根據(jù) ads1119 的手冊(cè)。 如何通過 cyusb3014 的 i2c 操作界面操作 ads1119 的 i2c
    發(fā)表于 05-23 07:30

    I2C通訊為什么要用開漏輸出和上拉電阻?

    一、I2C總線簡介I2C(Inter-IntegratedCircuit)總線是一種雙向串行通信總線,由兩根線組成:SDA(數(shù)據(jù)線)和SCL(時(shí)鐘線)。這兩根線都是雙向的,并且是開漏輸出的,這意味著
    的頭像 發(fā)表于 05-16 08:10 ?6610次閱讀
    <b class='flag-5'>I2C</b>通訊為什么要用開漏輸出和上拉電阻?

    什么是I2C協(xié)議 I2C總線的控制邏輯

    在實(shí)際使用過程中,I2C比較容易出現(xiàn)的一個(gè)問題就是死鎖 ,死鎖在I2C中主要表現(xiàn)為:I2C死鎖時(shí)表現(xiàn)為SCL為高,SDA一直為低。
    發(fā)表于 03-12 09:17 ?1073次閱讀
    什么是<b class='flag-5'>I2C</b>協(xié)議 <b class='flag-5'>I2C</b>總線的控制邏輯

    詳解I2C接口協(xié)議

    I2C總線是由荷蘭皇家飛利浦Philips公司(現(xiàn)恩智浦NXP半導(dǎo)體)開發(fā)的一種簡單的雙向兩線制總線協(xié)議標(biāo)準(zhǔn)。
    發(fā)表于 03-07 10:22 ?2137次閱讀
    詳解<b class='flag-5'>I2C</b><b class='flag-5'>接口</b>協(xié)議

    i2c接口由哪幾根線組成 i2c接口可以接哪些器件

    I2C接口的線路可以適應(yīng)不同的系統(tǒng)需求和器件規(guī)格,因此具體的線路配置可能會(huì)有所不同。但通常來說,時(shí)鐘線(SCL)和數(shù)據(jù)線(SDA)是I2C接口的核心線路。
    的頭像 發(fā)表于 03-05 16:55 ?3814次閱讀
    <b class='flag-5'>i2c</b><b class='flag-5'>接口</b>由哪幾根線組成 <b class='flag-5'>i2c</b><b class='flag-5'>接口</b>可以接哪些器件

    GD32 MCU硬件I2C不可靠不如軟件I2C?來看看紅楓派開發(fā)版的硬件I2C驅(qū)動(dòng)如何做到穩(wěn)得一批

    在一個(gè)評(píng)論中,看到網(wǎng)友對(duì)硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩(wěn)得一批。
    的頭像 發(fā)表于 02-23 09:37 ?2793次閱讀
    GD32 MCU硬件<b class='flag-5'>I2C</b>不可靠不如軟件<b class='flag-5'>I2C</b>?來看看紅楓派開發(fā)版的硬件<b class='flag-5'>I2C</b>驅(qū)動(dòng)如何做到穩(wěn)得一批

    雅特力AT32F423 I2C使用指南

    I2C接口簡介I2C接口是由數(shù)據(jù)線SDA和時(shí)鐘線SCL構(gòu)成,在標(biāo)準(zhǔn)模式下通信速度可達(dá)到100kHz,快速模式下則可以達(dá)到400kHz,增強(qiáng)快
    的頭像 發(fā)表于 02-19 13:26 ?603次閱讀
    雅特力AT32F423 <b class='flag-5'>I2C</b>使用指南

    什么是I2C接口?什么是I3C接口I2CI3C的區(qū)別

    I2C接口是一種串行通信協(xié)議,全稱為Inter-Integrated Circuit,即集成電路間總線。它是一種雙向、兩線制(SCL和SDA)的串行通信接口,主要用于連接微控制器和其他外圍設(shè)備,如傳感器、存儲(chǔ)器、顯示器等。
    的頭像 發(fā)表于 02-17 14:39 ?6376次閱讀
    什么是<b class='flag-5'>I2C</b><b class='flag-5'>接口</b>?什么是<b class='flag-5'>I3C</b><b class='flag-5'>接口</b>?<b class='flag-5'>I2C</b>與<b class='flag-5'>I3C</b>的區(qū)別

    PCB企業(yè)創(chuàng)力三期項(xiàng)目順利投產(chǎn)

    近日,PCB企業(yè)四川創(chuàng)力電子科技股份有限公司三期(載板廠和特種板廠)順利投產(chǎn)。通過這個(gè)項(xiàng)目,創(chuàng)力公司成功地將業(yè)務(wù)范圍從單一的普通通孔多層板擴(kuò)展到了高端的IC載板、MiniLED基板
    的頭像 發(fā)表于 01-15 14:20 ?621次閱讀

    XV4001BC車載用SPI/I2C輸出接口的數(shù)字輸出

    XV4001BC車載用SPI/I2C輸出接口的數(shù)字輸出,可實(shí)現(xiàn)角速度輸出和溫度傳感器輸出,滿足汽車導(dǎo)航和通訊系統(tǒng)的要求。SPI / I2C 輸出接口角速度輸出(16bit)、溫度傳感
    發(fā)表于 01-02 16:33 ?0次下載