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

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

3天内不再提示

英创信息技术基于SPI接口的大容量通用数据采集方案

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-05 10:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

数据采集是工业控制系统中的重要环节,较高的采样率对数据处理环节提出了高的要求。当数据量不大,采样率不高时,使用CPU进行传输处理是非常简单方便的;当遇到大的数据容量,高的采样率时,如果仍然使用CPU处理数据传输,将会带来巨大的CPU负载,难以满足高速大容量数据采集的要求。通常,在数据容量比较大,采样率较高的场合,使用DMA技术将数据直接传输到内存,不经过CPU管理,是比较通用的方案。

英创公司针对英创主板ESM335x已有的硬件资源,在linux-4.1.6操作系统环境下,提出了一种基于SPI接口的大容量通用数据采集方案,其物理连接如图1所示。这里用另一块ESM335x作为主设备,模拟数采装置,实际使用可以是任何支持SPI主模式的设备。使用时,连接SPI主从设备的公共地后,只需要连接ESM335x主板上对应SPI_SCLK、SPI_MOSI、SPI_CS0N的 3个管脚,见表1。

图1 SPI接口大容量通用数据采集连接图

表1 ESM335x工控主板SPI接口数采方案管脚说明

信号名称 CN2(管脚标号) 说明
GPIO29/SPI_MOSI F14 SPI数据信号,主设备输出,从设备输入
GPIO30/SPI_SCLK F15 SPI时钟信号,主设备输出,从设备输入
GPIO31/SPI_CS0N F16 SPI片选信号,低有效,主设备输出,从设备输入

该方案使用SPI作为传输协议,采用双buffer的DMA技术,能够达到1Msps(一个采样点数据位宽8-16位)。ESM335x工作在SPI从模式,能够接收的最高时钟为16MHz(最低不限制),即最高数据传输率为2MBytes/s。当DMA缓存buffer1装满数据后,会触发DMA中断,通知CPU将数据读出DMA缓存,然后继续将新传输进入的数据存储在buffer2;buffer2装满数据后,也产生DMA中断通知CPU取出数据,然后将新数据存储到buffer1,如此循环,如图2所示。当主机传输完成不再提供时钟信号后,ESM335x(从设备)通过定时器超时读出DMA缓存中剩余的数据。

图2 DMA双buffer示意图

图3 使用DMA技术的SPI数据采集CPU负载

如图3所示,使用此方案后,CPU负载率很低,此例中不到1%。用户使用时,需要按如下步骤进行操作:

1、加载SPI从模式驱动。在linux操作系统中,使用insmod spi-slave.ko命令,会创建设备节点/dev/spi-slave。

2、应用程序打开设备:

fd = open ( "/dev/spi-slave", O_RDWR, S_IRUSR | S_IWUSR );

3、设定传输参数:

//configure info transfer to driver

structspi_slave_transfer

{

unsignedintclk; //驱动根据不同clk,设定不同长度的dma buffer,满足填满一个buffer的时间不超过10ms(双buffer)

unsignedintmode; //SPI mode: 0,1,2,3

unsignedintbits_per_word; //每个采样点的位数

};

structspi_slave_transfer transfer;

transfer.clk =16000000; //16M clk ---16KB every buffer

transfer.mode = 1;

transfer.bits_per_word = 16;

4、传入参数至内核,启动传输:

if(ioctl ( fd, SPI_SLAVE_START, &transfer )<0)

{

printf ( "START WRONG!!!!!!!!!!!!!!!!\n" );

exit ( 1 );

}

此时,主板上的SPI已经进入从模式,有数据传入时,将存入DMA缓存,存满一个buffer就通知CPU读出数据到CPU维护的一个内存区域(256个kfifo组成链表,kfifo大小与buffer相同,使用完后会覆盖第一个kfifo)。同时,当一次传输完成后,通过定时器读出剩余在DMA buffer中的数据。应用程序应及时使用read函数从CPU维护的区域读出数据,以免CPU维护太多内存。

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、完成传输,关闭SPI。

if(ioctl ( fd, SPI_SLAVE_STOP, &transfer )<0)

{

printf ( "STOP WRONG!!!!!!!!!!!!!!!!\n" );

exit ( 1 );

}

6、关闭设备文件

close ( fd );

当主设备前后两次传输的参数不一样时,从设备需要分两次调用open/close函数,按以上步骤进行操作。如有用户对这个方案感兴趣,可以联系我们,我们将提供驱动文件和完整的应用程序示例。

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

    关注

    88

    文章

    11628

    浏览量

    217967
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

    36950
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    高速分切机PLC数据采集远程监控系统方案

    老旧设备缺乏通信基础,部分设备未预留空闲通信接口,导致数据采集与远程监控过程中面临多重挑战。物通博联依托工业物联网技术,提供一体化PLC数据采集远程监控系统
    的头像 发表于 11-06 15:41 204次阅读
    高速分切机PLC<b class='flag-5'>数据采集</b>远程监控系统<b class='flag-5'>方案</b>

    实时销售数据采集接口技术实现方案

    ​  一、核心需求分析 实时销售数据采集需满足以下关键指标: 低延迟 :数据产生到入库延迟 $ Delta t leq 500ms $ 高吞吐 :支持 $ QPS geq 10,000 $ 的并发
    的头像 发表于 10-23 16:01 313次阅读
    实时销售<b class='flag-5'>数据采集</b><b class='flag-5'>接口技术</b>实现<b class='flag-5'>方案</b>

    船舶岸电数据采集物联网解决方案

    问题,需要构建一套基于物联网技术的船舶岸电数据采集系统,实现对岸电设备的实时监控、数据采集和故障预警。 物通博联基于工业数采网关提供船舶岸电数据采集物联网解决
    的头像 发表于 10-16 17:13 478次阅读
    船舶岸电<b class='flag-5'>数据采集</b>物联网解决<b class='flag-5'>方案</b>

    工业设备数据采集的重要性及最新技术方案

    工业设备数据采集技术方案,并以国内领先的物联网解决方案提供商—— 有人物联网 的最新产品和解决方案为例,为开发者、工程师和
    的头像 发表于 09-16 15:16 486次阅读

    冲压PLC类设备的数据采集解决方案

    冲压PLC类设备的数据采集解决方案,结合低成本实施策略与深控免点表网关的应用设计
    的头像 发表于 08-07 11:21 620次阅读
    冲压PLC类设备的<b class='flag-5'>数据采集解决方案</b>

    P2P技术——数据采集系统高效存储的关键

    优势,还具备高容量、高速传输、低延迟和高可靠性的特点,帮助客户轻松应对高速、高精度数据采集需求。未来,度纬科技将持续致力于技术创新,不断提升产品性能,为各行业用户提供更高效、更稳定、更安全的
    的头像 发表于 07-24 17:24 537次阅读
    P2P<b class='flag-5'>技术</b>——<b class='flag-5'>数据采集</b>系统高效存储的关键

    告别手工录入!PDA数据采集器扫码读取信息的完整解决方案

    三方面,解析PDA数据采集器如何构建完整的自动化信息管理方案。一、PDA数据采集器的核心技术优势1、高效识别与低错误率PDA集成一维/二维条
    的头像 发表于 07-04 14:40 560次阅读
    告别手工录入!PDA<b class='flag-5'>数据采集</b>器扫码读取<b class='flag-5'>信息</b>的完整解决<b class='flag-5'>方案</b>

    基于RFID读写器构建的产线数据采集方案

    RFID数据采集方案是基于RFID无线射频识别技术的一种数据采集方案,它通过RFID读写器与RFID标签进行
    的头像 发表于 06-18 15:03 340次阅读

    Modbus转Profinet赋予数据采集仪高效通信的超能力

    转Profinet网关连接数据采集仪,实现数据的高效采集与传输。 Modbus转Profinet网关概述 VING微硬创新Modbus转Profinet网关能够将Modbus接口设备接
    发表于 05-20 16:46

    DCS数据采集系统有什么功能

    调度和高效管理。以下是DCS数据采集系统的主要功能: 1. 数据采集与处理 实时数据采集:系统能够实时采集生产现场的各种数据,包括温度、压力
    的头像 发表于 04-01 17:12 888次阅读

    CNC数据采集到MES系统方案

    将CNC数据采集到MES系统的方案,旨在实现生产过程的数字化、自动化和智能化管理。以下是一个详细的方案介绍: 一、方案概述 该方案通过集成先
    的头像 发表于 03-14 15:13 760次阅读
    CNC<b class='flag-5'>数据采集</b>到MES系统<b class='flag-5'>方案</b>

    数据采集系统的典型应用

    一、数采系统的介绍 数据采集系统是一种综合运用数据采集技术、计算机技术、传感器技术和信号处理技术
    的头像 发表于 02-18 16:19 1446次阅读
    <b class='flag-5'>数据采集</b>系统的典型应用

    电机数据采集网关具有哪些特点?

    电机数据采集网关是一种专门用于电机系统数据采集和传输的设备,它在电机监控、优化和维护方面发挥着关键作用。电机数据采集网关的特点主要包括以下几个方面: 1、数据采集能力 电机
    的头像 发表于 02-14 16:49 716次阅读
    电机<b class='flag-5'>数据采集</b>网关具有哪些特点?

    温度变送器(传感器)IO数据采集方案

    温度变送器数据采集方案主要涵盖以下几个方面: 一、数据采集方式 温度变送器的数据采集方式一般有两种: ‌ 直接采集法 ‌:这种
    的头像 发表于 12-17 09:42 1373次阅读

    深控信息技术公司:不需要点表的工业网关数据采集方案

    深控信息技术公司的 “不需要点表的工业网关” 数据采集方案,颠覆了传统依赖点表进行数据采集的模式。传统方式往往需要大量的人力和时间去配置点表,且在面对复杂多变的工业环境和设备时,容易出
    的头像 发表于 12-16 15:29 731次阅读
    深控<b class='flag-5'>信息技术</b>公司:不需要点表的工业网关<b class='flag-5'>数据采集</b><b class='flag-5'>方案</b>