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

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

圖2 DMA雙buffer示意圖

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

2、應(yīng)用程序打開(kāi)設(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ū)動(dòng)根據(jù)不同clk,設(shè)定不同長(zhǎng)度的dma buffer,滿足填滿一個(gè)buffer的時(shí)間不超過(guò)10ms(雙buffer)
unsignedintmode; //SPI mode: 0,1,2,3
unsignedintbits_per_word; //每個(gè)采樣點(diǎn)的位數(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)核,啟動(dòng)傳輸:
if(ioctl ( fd, SPI_SLAVE_START, &transfer )<0)
{
printf ( "START WRONG!!!!!!!!!!!!!!!!\n" );
exit ( 1 );
}
此時(shí),主板上的SPI已經(jīng)進(jìn)入從模式,有數(shù)據(jù)傳入時(shí),將存入DMA緩存,存滿一個(gè)buffer就通知CPU讀出數(shù)據(jù)到CPU維護(hù)的一個(gè)內(nèi)存區(qū)域(256個(gè)kfifo組成鏈表,kfifo大小與buffer相同,使用完后會(huì)覆蓋第一個(gè)kfifo)。同時(shí),當(dāng)一次傳輸完成后,通過(guò)定時(shí)器讀出剩余在DMA buffer中的數(shù)據(jù)。應(yīng)用程序應(yīng)及時(shí)使用read函數(shù)從CPU維護(hù)的區(qū)域讀出數(shù)據(jù),以免CPU維護(hù)太多內(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í),從設(shè)備需要分兩次調(diào)用open/close函數(shù),按以上步驟進(jìn)行操作。如有用戶對(duì)這個(gè)方案感興趣,可以聯(lián)系我們,我們將提供驅(qū)動(dòng)文件和完整的應(yīng)用程序示例。
-
Linux
+關(guān)注
關(guān)注
88文章
11760瀏覽量
219036 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6107瀏覽量
37078
發(fā)布評(píng)論請(qǐng)先 登錄
得物API商品接口數(shù)據(jù)采集服務(wù)及接口應(yīng)用展開(kāi)
單片機(jī)多路數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)
USB3.0接口轉(zhuǎn)換高性能圖像傳感和數(shù)據(jù)采集方案
高速分切機(jī)PLC數(shù)據(jù)采集遠(yuǎn)程監(jiān)控系統(tǒng)方案
實(shí)時(shí)銷(xiāo)售數(shù)據(jù)采集接口技術(shù)實(shí)現(xiàn)方案
船舶岸電數(shù)據(jù)采集物聯(lián)網(wǎng)解決方案
工業(yè)設(shè)備數(shù)據(jù)采集的重要性及最新技術(shù)方案
易華錄入選國(guó)家級(jí)信息技術(shù)應(yīng)用創(chuàng)新典型解決方案
沖壓PLC類(lèi)設(shè)備的數(shù)據(jù)采集解決方案
P2P技術(shù)——數(shù)據(jù)采集系統(tǒng)高效存儲(chǔ)的關(guān)鍵
告別手工錄入!PDA數(shù)據(jù)采集器掃碼讀取信息的完整解決方案
基于RFID讀寫(xiě)器構(gòu)建的產(chǎn)線數(shù)據(jù)采集方案
Modbus轉(zhuǎn)Profinet賦予數(shù)據(jù)采集儀高效通信的超能力
DCS數(shù)據(jù)采集系統(tǒng)有什么功能
CNC數(shù)據(jù)采集到MES系統(tǒng)方案
英創(chuàng)信息技術(shù)基于SPI接口的大容量通用數(shù)據(jù)采集方案
評(píng)論