激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

JAVA操作英創主板I2C接口簡介

 2017-9-26     作者:陳昌龍         
文章標簽:JavaI2C

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


1、I2C簡介

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


JAVA操作英創主板I2C接口簡介.gif

圖1 I2C掛載設備示意圖


 JAVA操作英創主板I2C接口簡介.gif

圖2 I2C時序圖


  I2C總線是電平有效,在SCL信號為高電平的時候采樣SDA信號。如上圖所示,其通信過程為:SDA從1變動到0,而SCL還是1時,表示開始數據傳輸。接下來的7位,就是設備的地址。緊接著的是讀寫標志,其為1時是讀取,為0則是寫。如果I2C總線上存在著和請求的地址相對應的設備,則從設備會發送一個ACK信號通知主設備,可以發送數據了。接到ACK信號后,主設備則發送一個8位的數據,然后等待ACK。當傳輸完畢之后,SCL保持為1,SDA從0變換到1時,表明傳輸結束。


2、I2C傳輸數據結構

  英創提供的I2C傳輸數據結構源文件為emtronix.hardware.I2CParam.java。每一個I2CParam類實例代表一次I2C通信,其主要成員變量如下所示:

  public class I2CParam {

         public byte SlaveAddr;     //I2C從設備地址

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

         public byte[] Databuf;     //寫入/讀出的數據緩存

  }


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


3、I2C傳輸接口函數

  英創提供的I2C傳輸接口源文件為emtronix.hardware.I2C.java。用戶在實例化I2C類后可以調用Open、Read、Write、Close對I2C硬件接口進行操作。I2C類的具體信息如下,其中mFd為設備描述符,用戶不用設置,由接口函數自動修改。


  public class I2C {

         private int mFd;

         public I2C() {

                mFd = -1;

         }

         public void info() {

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

         }

         /**

          * 打開/dev/i2c-0設備

          * @return 成功返回非負設備描述符;失敗返回-1

          */

         public native int Open();

      

         /**

          * 從I2C總線發送一幀數據,從設備的地址和寄存器地址由i2cparam指定

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

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

          */

         public native int Write(I2CParam i2cparam);

      

         /**

          * 從I2C總線讀一幀數據,從設備地址和寄存器地址由i2cparam指定

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

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

          */

         public native int Read(I2CParam i2cparam);

      

         /**

          * 關閉I2C設備

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

          */

         public native int Close();

  }


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

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


  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;i<TCA8418Config.length;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接口對鍵盤掃描芯片tca8418進行了初始化設置,并開啟了監聽中斷處理線程。中斷處理線程中的KeyScan函數調用了I2C的Read接口去讀取事件信息,更新按鍵值。tca8418的各個寄存器功能,請參考模塊ETA202中的數據手冊。I2CKeypad類具體實現請結合tca8418的數據手冊參考源碼。


5、I2C鍵盤測試程序

  I2C傳輸接口中操作I2C的接口函數聲明都有native的前綴,表明其實現部分在本地的庫當中。英創將所有英創主板的硬件接口訪問函數的實現部分編譯成了動態鏈接庫libemtronixhardware.so,放在了文件系統/lib目錄下。


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

  public class testI2CMain {

         static {

                System.loadLibrary("emtronixhardware"); 

         }

         public static void main(String[] args) {

         ...

         }

  }


  然后,就可以在main函數中實例化I2CKeypad類,先調用OpenKeypad接口初始化鍵盤,接著可調用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鍵盤測試程序運行結果

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


JAVA操作英創主板I2C接口簡介.gif

圖2 運行I2C鍵盤測試程序


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

文章標簽:JavaI2C
主站蜘蛛池模板: 国产精品五月色六月婷婷| 精品一本久久中文字幕| 亚洲国产成人精彩精品| 久久88香港三级台湾三级中文| 在线精品国产| 欧美黑人换爱交换乱理伦片| 草啪啪| 7777sq国产精品| 国产亚洲欧洲日韩综合v| 日韩在线视频免费不卡一区| 在线色图| videosg最新欧美另类| 日本一级毛一级毛片短视频| 亚洲综合在线观看一区www| 欧美三级不卡视频| 国产在线观看91精品不卡| 美国三级在线| 精品一区二区久久久久久久网站 | 亚洲色图清纯唯美| 一级特黄特色aa大片| 日韩a级大片| 亚洲在线影院| 亚洲精品免费在线| 伊人精品综合| 欧美va视频| 欧美成人a大片| 国产a级网站| 国产日韩欧美三级| 国产高清视频网站| 国产精品第1页在线观看| 黄色一级性生活视频| 精品国产一区二区三区四| 大色综合| 不卡国产在线| 成人在线不卡视频| 国产精品ⅴ视频免费观看| 国产人妖自拍| 国产欧美日韩精品专区| 国产一区二区三区高清| 国产在线视频不卡| 九九九国产在线|