2017年9月,英創(chuàng)在Linux的文件系統(tǒng)中移植了針對(duì)嵌入式Linux的JRE(Java Runtime Environment),能夠支持Java應(yīng)用程序的運(yùn)行。由于Java語(yǔ)言不能直接訪問(wèn)硬件資源,英創(chuàng)提供了Java硬件支持包,主要支持的工控接口有:以太網(wǎng)、串口、CAN、GPIO、SPI、I2C、RTC等。本文主要介紹使用Java語(yǔ)言調(diào)用英創(chuàng)Java硬件支持包,操作英創(chuàng)主板SPI接口的過(guò)程。
1、SPI簡(jiǎn)介
SPI(Synchronous Peripheral Interface)是一種同步串行數(shù)據(jù)通訊總線接口,常用于連接ADCs、EPROMs、Sensors或者是其他一些微控制器,SPI具有兩種工作模式:master和slave模式,其中master模式提供時(shí)鐘信號(hào)。
圖1SPI主從設(shè)備信號(hào)連接
SPI有四種數(shù)據(jù)傳輸模式,如表1所示,主要差別在于:輸出串行同步時(shí)鐘極性(CPOL)和相位(CPHA)可以進(jìn)行配置。
SPI mode | CPOL | CPHA | Comments |
0 | 0 | 0 | 時(shí)鐘的空閑狀態(tài)為低電平;上升沿采樣 |
1 | 0 | 1 | 時(shí)鐘的空閑狀態(tài)為低電平;下降沿采樣 |
2 | 1 | 0 | 時(shí)鐘的空閑狀態(tài)為高電平;下降沿采樣 |
3 | 1 | 1 | 時(shí)鐘的空閑狀態(tài)為高電平;上升沿采樣 |
表1SPI四種數(shù)據(jù)傳輸模式
2、SPI傳輸數(shù)據(jù)結(jié)構(gòu)
英創(chuàng)提供的SPI傳輸數(shù)據(jù)結(jié)構(gòu)源文件為emtronix.hardware.SPITransfer.java。每一個(gè)SPITransfer類實(shí)例代表一次SPI傳輸,其主要成員變量如下所示:
public class SPITransfer {
/*寫(xiě)數(shù)據(jù)緩存,只讀模式時(shí)為null*/
public byte[] tx_buf;
/*讀數(shù)據(jù)緩存,只寫(xiě)模式時(shí)為null */
public byte[] rx_buf;
/* 緩存長(zhǎng)度
* 全雙工時(shí),讀寫(xiě)緩存應(yīng)該長(zhǎng)度相同;
* 半雙工時(shí),非工作狀態(tài)的緩存為null
*/
public int len;
/*SPI時(shí)鐘頻率*/
public int speed_hz;
/*兩個(gè)SPITransfer之間的延時(shí)*/
public char delay_usecs;
/*SPI傳輸字寬*/
public byte bits_per_word;
/*本次傳輸完成之后,是否改變片選*/
public byte cs_change;
public int pad;
}
SPI傳輸使用同步時(shí)鐘,在發(fā)送的同時(shí),也在接收數(shù)據(jù)。因此其傳輸數(shù)據(jù)結(jié)構(gòu)要同時(shí)擁有寫(xiě)數(shù)據(jù)緩存tx_buf和讀數(shù)據(jù)緩存rx_buf才能支持這種全雙工工作模式,并且兩個(gè)緩存區(qū)域長(zhǎng)度都為len字節(jié)。當(dāng)然,如果要使用半雙工讀/寫(xiě),只需要讓tx_buf/rx_buf等于null就可以了。speed_hz為SPI的時(shí)鐘頻率,esm335x最大時(shí)鐘頻率48MHz,esm6800最大時(shí)鐘頻率60MHz;delay_usecs表示連續(xù)傳輸?shù)腡ransfer之間的間隔,單位為微秒;bits_per_word表示一個(gè)字有幾個(gè)比特組成,最大32;cs_change表示本次傳輸完成后是否修改片選信號(hào);pad暫時(shí)不用設(shè)置,保留。
3、SPI傳輸接口函數(shù)
英創(chuàng)提供的SPI傳輸接口源文件為emtronix.hardware.SPI.java。用戶在實(shí)例化SPI類后可以調(diào)用Open、SetSPI、Transfer、Close對(duì)SPI硬件接口進(jìn)行操作。SPI類的具體信息如下,其中mFd為設(shè)備描述符,用戶不用設(shè)置,由接口函數(shù)自動(dòng)修改。
public class SPI {
private int mFd;
/**
*打開(kāi)spi主設(shè)備,返回fd.自動(dòng)修改mFd
*@paramdev "/dev/spidev1.0"
*@return成功返回spi主設(shè)備描述符,失敗返回-1
*/
publicnativeintOpen(String dev);
/**
*設(shè)置SPI的工作參數(shù)
*@paramargs "S16000000-M1-B16-D100" S為時(shí)鐘速率,M為數(shù)據(jù)傳輸模式(0-3),B為數(shù)據(jù)位寬,D發(fā)送完后的延時(shí)
* 四個(gè)參數(shù)之間不分順序“M1-D100-B16-S16000000”與之前的相同
*@return成功返回0;失敗返回-1
*/
publicnativeintSetSPI(String args);
/**
* SPI一次傳輸,trans.tx_buf=null,trans.rx_buf != null, only receive;
* trans.tx_buf!=null,trans.rx_buf=null,only send;
* trans.tx_buf!=null,trans.rx_buf!=null, send&receive
*@paramtrans,一次spi傳輸參數(shù)
*@paramntrans,進(jìn)行ntrans次spitransfer
*@return成功返回0;失敗返回-1
*/
publicnativeintTransfer(SPITransfer[] trans,intntrans);
/**
*關(guān)閉SPI主設(shè)備
*@return成功返回0;失敗返回-1
*/
publicnativeintClose() ;
}
4、SPI測(cè)試程序
SPI傳輸接口中操作SPI的接口函數(shù)聲明都有native的前綴,表明其實(shí)現(xiàn)部分在本地的庫(kù)當(dāng)中。英創(chuàng)將所有英創(chuàng)主板的硬件接口訪問(wèn)函數(shù)的實(shí)現(xiàn)部分編譯成了動(dòng)態(tài)鏈接庫(kù)libemtronixhardware.so,放在了文件系統(tǒng)/lib目錄下。
在編寫(xiě)SPI傳輸主程序的時(shí)候,首先需要加載該庫(kù),如下所示:
publicclasstestSPIMain {
static{
System.loadLibrary("emtronixhardware");
}
publicstaticvoidmain(String[] args) {
...
}
}
然后,就可以在main函數(shù)中實(shí)例化SPI類,并打開(kāi)主板的SPI設(shè)備:
SPI spi = new SPI();
spi.Open("/dev/spidev1.0");
接著,初始化SPI傳輸數(shù)據(jù)結(jié)構(gòu),發(fā)送數(shù)據(jù):
int transcnt = 1;
SPITransfer[] trans = new SPITransfer[transcnt];
trans[0] = new SPITransfer();
trans[0].tx_buf = tArray;
trans[0].rx_buf = rArray;
trans[0].len = bytes;
trans[0].speed_hz = speed;
trans[0].bits_per_word = (byte) bitspw;
if(spi.Transfer(trans, transcnt) == 0) {
//傳輸成功,處理數(shù)據(jù)
}
其中,transcnt表示SPITransfer的個(gè)數(shù),每一個(gè)SPITransfer需要用戶自己實(shí)例化。
最后,使用完畢后關(guān)閉SPI設(shè)備:
spi.Close();
5、SPI測(cè)試程序運(yùn)行結(jié)果
運(yùn)行SPI傳輸Java主程序需要把編譯結(jié)果bin文件中的所有目錄文件拷貝到主板/mnt/nandflash,或者通過(guò)nfs掛載到主板/mnt/nfs目錄下。然后,使用“java 包名.類名”運(yùn)行,如下圖所示:
圖2運(yùn)行SPI測(cè)試程序
以上就是使用Java操作英創(chuàng)主板SPI接口的介紹,感興趣的客戶可以通過(guò)電話或者郵件聯(lián)系英創(chuàng)工程師。我們將提供Java示例程序源碼供客戶參考。
-
Linux
+關(guān)注
關(guān)注
87文章
11329瀏覽量
209975 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6086瀏覽量
35490
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論