0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术JAVA操作英创主板I2C接口简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-06 11:06 次阅读

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设备,如下图所示。

图1I2C挂载设备示意图

图2I2C时序图

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;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接口对键盘扫描芯片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 包名.类名”运行,如下图所示:

图2运行I2C键盘测试程序

以上就是使用Java操作英创主板I2C接口的介绍,感兴趣的客户可以通过电话或者邮件联系英创工程师。我们将提供Java示例程序源码供客户参考。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11225

    浏览量

    208904
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6085

    浏览量

    35210
收藏 人收藏

    评论

    相关推荐

    雅特力AT32F402/F405 I2C使用指南

    I2C接口简介I2C接口是由数据线SDA和时钟线SCL构成,在标准模式下通信速度可达到100kHz,快速模式下则可以达到400kHz,增强快
    的头像 发表于 11-20 01:03 74次阅读
    雅特力AT32F402/F405 <b class='flag-5'>I2C</b>使用指南

    RISC V的I2C操作

    :RISC V的I2C操作 文章出处:【微信公众号:易灵思FPGA技术交流】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 11-01 11:06 128次阅读

    中科达荣获2024年软件和信息技术服务优秀企业

    及前百家企业”名单。中科达凭借非凡的技术实力与持续的创新能力,成功入选“2024年度软件和信息技术服务竞争力百强企业”以及“2024年软件和信息技术服务优秀企业”。
    的头像 发表于 10-30 11:44 379次阅读

    I2C基本指南

    电子发烧友网站提供《I2C基本指南.pdf》资料免费下载
    发表于 09-10 09:40 0次下载
    <b class='flag-5'>I2C</b>基本指南

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

    Addr_,但我只需要发送一条命令,如复位命令等。 根据 ads1119 的手册。 如何通过 cyusb3014 的 i2c 操作界面操作 ads1119 的 i2c
    发表于 05-23 07:30

    I2C通讯为什么要用开漏输出和上拉电阻?

    一、I2C总线简介I2C(Inter-IntegratedCircuit)总线是一种双向串行通信总线,由两根线组成:SDA(数据线)和SCL(时钟线)。这两根线都是双向的,并且是开漏输出的,这意味着
    的头像 发表于 05-16 08:10 5848次阅读
    <b class='flag-5'>I2C</b>通讯为什么要用开漏输出和上拉电阻?

    什么是I2C协议 I2C总线的控制逻辑

    在实际使用过程中,I2C比较容易出现的一个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。
    发表于 03-12 09:17 952次阅读
    什么是<b class='flag-5'>I2C</b>协议 <b class='flag-5'>I2C</b>总线的控制逻辑

    详解I2C接口协议

    I2C总线是由荷兰皇家飞利浦Philips公司(现恩智浦NXP半导体)开发的一种简单的双向两线制总线协议标准。
    发表于 03-07 10:22 1947次阅读
    详解<b class='flag-5'>I2C</b><b class='flag-5'>接口</b>协议

    i2c接口由哪几根线组成 i2c接口可以接哪些器件

    I2C接口的线路可以适应不同的系统需求和器件规格,因此具体的线路配置可能会有所不同。但通常来说,时钟线(SCL)和数据线(SDA)是I2C接口的核心线路。
    的头像 发表于 03-05 16:55 3653次阅读
    <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?来看看红枫派开发版的硬件I2C驱动如何做到稳得一批

    在一个评论中,看到网友对硬件I2C的讨论,硬件I2C Busy找不到原因、软件I2C稳得一批。
    的头像 发表于 02-23 09:37 2698次阅读
    GD32 MCU硬件<b class='flag-5'>I2C</b>不可靠不如软件<b class='flag-5'>I2C</b>?来看看红枫派开发版的硬件<b class='flag-5'>I2C</b>驱动如何做到稳得一批

    雅特力AT32F423 I2C使用指南

    I2C接口简介I2C接口是由数据线SDA和时钟线SCL构成,在标准模式下通信速度可达到100kHz,快速模式下则可以达到400kHz,增强快
    的头像 发表于 02-19 13:26 538次阅读
    雅特力AT32F423 <b class='flag-5'>I2C</b>使用指南

    什么是I2C接口?什么是I3C接口I2CI3C的区别

    I2C接口是一种串行通信协议,全称为Inter-Integrated Circuit,即集成电路间总线。它是一种双向、两线制(SCL和SDA)的串行通信接口,主要用于连接微控制器和其他外围设备,如传感器、存储器、显示器等。
    的头像 发表于 02-17 14:39 5536次阅读
    什么是<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>的区别

    PCB企业力三期项目顺利投产

    近日,PCB企业四川力电子科技股份有限公司三期(载板厂和特种板厂)顺利投产。通过这个项目,力公司成功地将业务范围从单一的普通通孔多层板扩展到了高端的IC载板、MiniLED基板
    的头像 发表于 01-15 14:20 569次阅读

    XV4001BC车载用SPI/I2C输出接口的数字输出

    XV4001BC车载用SPI/I2C输出接口的数字输出,可实现角速度输出和温度传感器输出,满足汽车导航和通讯系统的要求。SPI / I2C 输出接口角速度输出(16bit)、温度传感
    发表于 01-02 16:33 0次下载

    i2c接口和spi接口区别

    I2C(Inter-Integrated Circuit)和SPI(Serial Peripheral Interface)都是用于设备间通信的串行接口标准。它们在很多方面有着相似之处,但也有一些
    的头像 发表于 12-25 15:02 3779次阅读