數(shù)據(jù)采集是工業(yè)控制系統(tǒng)中的重要環(huán)節(jié),較高的采樣率對數(shù)據(jù)處理環(huán)節(jié)提出了高的要求。當(dāng)數(shù)據(jù)量不大,采樣率不高時,使用CPU進行傳輸處理是非常簡單方便的;當(dāng)遇到大的數(shù)據(jù)容量,高的采樣率時,如果仍然使用CPU處理數(shù)據(jù)傳輸,將會帶來巨大的CPU負(fù)載,難以滿足高速大容量數(shù)據(jù)采集的要求。通常,在數(shù)據(jù)容量比較大,采樣率較高的場合,使用DMA技術(shù)將數(shù)據(jù)直接傳輸?shù)絻?nèi)存,不經(jīng)過CPU管理,是比較通用的方案。
英創(chuàng)公司針對英創(chuàng)主板ESM335x已有的硬件資源,在linux-4.1.6操作系統(tǒng)環(huán)境下,提出了一種基于SPI接口的大容量通用數(shù)據(jù)采集方案,其物理連接如圖1所示。這里用另一塊ESM335x作為主設(shè)備,模擬數(shù)采裝置,實際使用可以是任何支持SPI主模式的設(shè)備。使用時,連接SPI主從設(shè)備的公共地后,只需要連接ESM335x主板上對應(yīng)SPI_SCLK、SPI_MOSI、SPI_CS0N的 3個管腳,見表1。

圖1 SPI接口大容量通用數(shù)據(jù)采集連接圖
表1 ESM335x工控主板SPI接口數(shù)采方案管腳說明
| 信號名稱 | CN2(管腳標(biāo)號) | 說明 |
| GPIO29/SPI_MOSI | F14 | SPI數(shù)據(jù)信號,主設(shè)備輸出,從設(shè)備輸入 |
| GPIO30/SPI_SCLK | F15 | SPI時鐘信號,主設(shè)備輸出,從設(shè)備輸入 |
| GPIO31/SPI_CS0N | F16 | SPI片選信號,低有效,主設(shè)備輸出,從設(shè)備輸入 |
該方案使用SPI作為傳輸協(xié)議,采用雙buffer的DMA技術(shù),能夠達(dá)到1Msps(一個采樣點數(shù)據(jù)位寬8-16位)。ESM335x工作在SPI從模式,能夠接收的最高時鐘為16MHz(最低不限制),即最高數(shù)據(jù)傳輸率為2MBytes/s。當(dāng)DMA緩存buffer1裝滿數(shù)據(jù)后,會觸發(fā)DMA中斷,通知CPU將數(shù)據(jù)讀出DMA緩存,然后繼續(xù)將新傳輸進入的數(shù)據(jù)存儲在buffer2;buffer2裝滿數(shù)據(jù)后,也產(chǎn)生DMA中斷通知CPU取出數(shù)據(jù),然后將新數(shù)據(jù)存儲到buffer1,如此循環(huán),如圖2所示。當(dāng)主機傳輸完成不再提供時鐘信號后,ESM335x(從設(shè)備)通過定時器超時讀出DMA緩存中剩余的數(shù)據(jù)。

圖2 DMA雙buffer示意圖

圖3 使用DMA技術(shù)的SPI數(shù)據(jù)采集CPU負(fù)載
如圖3所示,使用此方案后,CPU負(fù)載率很低,此例中不到1%。用戶使用時,需要按如下步驟進行操作:
1、加載SPI從模式驅(qū)動。在linux操作系統(tǒng)中,使用insmod spi-slave.ko命令,會創(chuàng)建設(shè)備節(jié)點/dev/spi-slave。

2、應(yīng)用程序打開設(shè)備:
fd = open ( "/dev/spi-slave", O_RDWR, S_IRUSR | S_IWUSR );
3、設(shè)定傳輸參數(shù):
//configure info transfer to driver
structspi_slave_transfer
{
unsignedintclk; //驅(qū)動根據(jù)不同clk,設(shè)定不同長度的dma buffer,滿足填滿一個buffer的時間不超過10ms(雙buffer)
unsignedintmode; //SPI mode: 0,1,2,3
unsignedintbits_per_word; //每個采樣點的位數(shù)
};
structspi_slave_transfer transfer;
transfer.clk =16000000; //16M clk ---16KB every buffer
transfer.mode = 1;
transfer.bits_per_word = 16;
4、傳入?yún)?shù)至內(nèi)核,啟動傳輸:
if(ioctl ( fd, SPI_SLAVE_START, &transfer )<0)
{
printf ( "START WRONG!!!!!!!!!!!!!!!!\n" );
exit ( 1 );
}
此時,主板上的SPI已經(jīng)進入從模式,有數(shù)據(jù)傳入時,將存入DMA緩存,存滿一個buffer就通知CPU讀出數(shù)據(jù)到CPU維護的一個內(nèi)存區(qū)域(256個kfifo組成鏈表,kfifo大小與buffer相同,使用完后會覆蓋第一個kfifo)。同時,當(dāng)一次傳輸完成后,通過定時器讀出剩余在DMA buffer中的數(shù)據(jù)。應(yīng)用程序應(yīng)及時使用read函數(shù)從CPU維護的區(qū)域讀出數(shù)據(jù),以免CPU維護太多內(nèi)存。
count_in_byte = 0;
read_count = 0;
while(1)
{
FD_ZERO(&fdRead);
FD_SET(fd,&fdRead);
aTime.tv_sec = 2;
aTime.tv_usec = 0;
ret = select ( fd+1, &fdRead, NULL, NULL, &aTime );
if( ret<0 )
printf( "select, something wrong!\n " );
if( ret>0 )
{
if( FD_ISSET(fd, &fdRead) )
{
memset(read_buf,0,4096*4);
read_count = read(fd, read_buf, 4096*4);
if( read_count<0 )
{
printf ( "READ WRONG!!!!!!!!!!!!!!!!\n" );
exit ( 1 );
}
if(read_count){ //0 --- end-of-file not printf
count_in_byte += read_count;
printf("\nread_count = %d\ncount_in_byte = %d\n", read_count, count_in_byte);
}
//process data, here just print to console
if(read_count < 20){
for( i=0; i
{
printf ( "%02x ", read_buf[i] );
if(i%10 == 9)
printf ( "\n" );
}
printf("\n");
}
}
}
printf ( "remaining time %u.%u!\n",aTime.tv_sec, aTime.tv_usec );
}
5、完成傳輸,關(guān)閉SPI。
if(ioctl ( fd, SPI_SLAVE_STOP, &transfer )<0)
{
printf ( "STOP WRONG!!!!!!!!!!!!!!!!\n" );
exit ( 1 );
}
6、關(guān)閉設(shè)備文件
close ( fd );
當(dāng)主設(shè)備前后兩次傳輸?shù)膮?shù)不一樣時,從設(shè)備需要分兩次調(diào)用open/close函數(shù),按以上步驟進行操作。如有用戶對這個方案感興趣,可以聯(lián)系我們,我們將提供驅(qū)動文件和完整的應(yīng)用程序示例。
-
Linux
+關(guān)注
關(guān)注
88文章
11822瀏覽量
219600 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6107瀏覽量
37171
發(fā)布評論請先 登錄
探索AS8500:通用多用途數(shù)據(jù)采集系統(tǒng)的卓越性能
得物API商品接口數(shù)據(jù)采集服務(wù)及接口應(yīng)用展開
單片機多路數(shù)據(jù)采集系統(tǒng)的設(shè)計
USB3.0接口轉(zhuǎn)換高性能圖像傳感和數(shù)據(jù)采集方案
高速分切機PLC數(shù)據(jù)采集遠(yuǎn)程監(jiān)控系統(tǒng)方案
實時銷售數(shù)據(jù)采集接口技術(shù)實現(xiàn)方案
船舶岸電數(shù)據(jù)采集物聯(lián)網(wǎng)解決方案
工業(yè)設(shè)備數(shù)據(jù)采集的重要性及最新技術(shù)方案
易華錄入選國家級信息技術(shù)應(yīng)用創(chuàng)新典型解決方案
沖壓PLC類設(shè)備的數(shù)據(jù)采集解決方案
P2P技術(shù)——數(shù)據(jù)采集系統(tǒng)高效存儲的關(guān)鍵
告別手工錄入!PDA數(shù)據(jù)采集器掃碼讀取信息的完整解決方案
基于RFID讀寫器構(gòu)建的產(chǎn)線數(shù)據(jù)采集方案
高品質(zhì)存儲卡助力精準(zhǔn)數(shù)據(jù)采集
英創(chuàng)信息技術(shù)基于SPI接口的大容量通用數(shù)據(jù)采集方案
評論