孙彦超,徐宏宇
(沈阳航空航天大学电子信息工程学院,沈阳 110136)
嵌入式设备节点越来越多地被用在控制和数据测量方面。嵌入式设备节点的运行状态、运算的数据以及采集的数据等,通常需要被记录下来。而这些数据往往具有实时性,设备运行的时间长,产生的数据量庞大。利用传统的数据记录方法,不仅需要耗费大量的人力和时间,也极大地影响了生产效率。
CAN总线是汽车车身控制的标准总线,也被广泛用于工业控制中。借助CAN总线可以实现不同设备节点之间的实时通信,也可以通过CAN总线来对节点数据进行存储和分析[1]。在对节点数据进行存储分析方面,如果在没有性能较高的数据接收处理上位机设备,如PC机、平板电脑等时,可以有两种方案:(1)将数据通过运营商手机网络或者WIFI模块或以太网传递给云端主机,进行存储分析处理;(2)通过满足性能要求的下位机节点,如高性能的FPGA、MCU,通过一定的策略来实现CAN总线数据的实时接收和存储,以便于以后上位机处理。其中,方案1成本较高,并且可能满足不了高速的数据接收和发送需要;方案2中利用高性能的FPGA方案绝对是可以实现的,但是相对于MCU开发来说利用FPGA周期相对较长,并且外围硬件电路设计与PCB布线较复杂。在存储介质的选择方面,综合成本、读写速度两个方面SD卡是绝佳的选择[2],并且SD卡可插拔,易于上位机进行数据提取[3],且容易更换。
目前国外已经有著名的CAN总线工具开发公司——瑞典的Kvaser公司,推出了名为Kvaser Memorator Professional的CAN总线分析仪产品,支持将CAN总线上的数据存储到SD卡中,但价格较高。国内目前没有成熟稳定的可以将CAN总线上的数据记录到SD卡上的产品。国内对于CAN总线上的数据存储到SD卡的研究,大多使用的是通过SPI总线来读写SD卡,对于需要快速存储数据的场合,采用SPI总线来读写SD卡的方式是不可行的。
利用含有SD卡接口外设的微控制器的SD卡接口来读写SD卡,比通过SPI总线来读写SD卡的读写速度要快很多。本文提出采用含有SD卡接口的英飞凌的 XMC4500单片机(基于ARM-Cortex M4架构)来做为读写SD卡的控制器,设计了相应的硬件电路,详细描述了设计的软件算法、数次试验的研究发现和方案的实验结果。
英飞凌的XMC4500单片机有高效的4线SD卡接口和CAN总线接口的,主频120 MHz,数据处理能力强,并且支持当今常见的大容量的Class 6和Class 10 SDHC卡。由于小容量的SD卡以及Class 6以下的SD卡均已经停产,所以以往的只支持这种类型的SD卡的方案已经不实用。XMC4500的SDMMC接口时钟最高48 MHz,有两个512字节的缓冲区,最高对SD卡的写入速率可以达到24MB/s[5]。所以利用XMC4500可以构建一个稳定、高速、高实时性的CAN总线节点数据存储系统。
系统总体构成如图1所示。由XMC4500接收CAN总线网络上的相应节点的数据,通过SDMMC接口将数据写入到SDHC卡中,然后通过特定的处理把得到的文本文件通过EXCEL或者MATLAB等数据分析软件对数据进行分析。
图1 系统的总体构成
TI的LM5007是TI公司推出的低成本的、高效的Buck电压降压开关稳压器,可以接受9-75 V的电压输入,输出电压范围为2.5-73 V。如图2所示,本文采用TI的LM5007电源转换芯片,可以使得系统电源电压输入范围在12-40 V之间,并且转换得到的5 V电源具有低纹波的优点。如图3所示,系统通过英飞凌的IFX1117MEV33来将5 V转换为3.3 V,给XMC4500供电。
CAN总线收发电路部分,选取性能可靠的英飞凌TLE6250G作为XMC4500的CAN总线外接收发器。TLE6250G是英飞凌的高速CAN收发器,可以应用于苛刻的汽车电子领域,具有卓越的EMC性能,具有很宽的温度范围(-40℃至150℃),并且有过温保护。具体电路结构如图4所示。
图2 LM5007稳压电路
图3 IFX1117稳压电路
SDHC卡的访问需要时钟线、指令控制线和数据线[6]。时钟线和指令控制线分别为MMC_CLK和MMC_CMD。XMC4500通过其SDMMC接口连接SD卡,并且可以提供四条数据线为SD卡传送数据,其中四条数据线为MMC_DAT0~MMC_DAT3。为保证指令和数据传输的稳定性,数据线和指令线均上拉[7],单片机相应的引脚采用Open-drain模式。具体电路如图5所示。
图4 XMC4500外接CAN总线收发器电路
程序固件代码通过DAVE3.1.10和VIM编写,通过tasking烧写入XMC4500。程序主要包括相应的模块接口初始化、内存分配操作、中断的配置和数据存储几个部分,具体流程见图6。
图5 SD卡接口电路
图6 软件执行流程
SDMMC接口的初始化主要包括SDMMC接口时钟的初始化和SDMMC接口引脚的初始化。
CAN总线初始化主要包括CAN总线接收和发送节点的配置,CAN总线接口的分配,CAN总线波特率的设置。CAN总线的接收中断要赋予较高的优先级,使其可以接收到所有CAN总线网络上的节点发出来的数据。
SD卡初始化主要是XMC4500检测SD卡是否插入SD卡接口及检测插入的SD卡是否支持。如果初始化SD卡失败,需要尝试再对其进行初始化。因为并不能完全确保SD卡可以一次初始化成功,也并不能确保使用的SD卡是可用的。
FATFS是一个小型的FAT文件系统,它不依赖于具体的硬件平台,只提供SD卡操作的抽象层的接口,是一个较为通用的文件系统[8]。
软件采用FATFS文件系统和XMC4500的SDMMC接口的I/O操作来完成数据写入到SD卡中,形成数据记录文件。
使用FATFS文件系统,需要首先为文件名的路径分配内存,以存储文件的路径。其次需要为打开文件分配内存。否则,写入文件的时候会导致写入数据失败。
使用f_mount()函数来挂载文件系统。使用f_open()函数来打开文件,如果文件不存在则可以创建文件。
FATFS文件系统可以创建扩展名为.txt格式的文件。所有FATFS文件系统写入到SD卡的文件中的数据是字符,而CAN总线接收到的数据是数值数组。所以需要把CAN总线接收到的数据,在程序中通过类型转换变成字符数组。比如CAN总线某一时刻接收到的数据(不考虑 ID号),为{0x01,0x20,0x33,0x45,0x67,0xaa,0xbc,0xfe},为了尽量减小文件数据写入压力,将他们转换为{‘0’,‘1’,‘2’,‘0’,‘3’,‘3’,‘4’,‘5’,‘6’,‘7’,‘a’,‘a’,‘b’,‘c’,‘f’,‘e’}。
扩展名为".csv"格式的文件,以纯文本的形式存储表格数据。扩展名为".txt"的文件通过重命名为".csv"格式,可以利用excel表格打开。扩展名为".csv"的格式的文件中的数据以逗号进行分隔,如果数据是换行符,则接下来的数据换行显示。
通过对".csv"格式的文件进行研究,程序在对CAN总线节点接收到的数值数组转换成字符数组的过程中,在转换的数据之间加逗号,并且在一帧数据之后加换行符。例如假如CAN总线节点接收到的一帧数据为:{0x01,0x20,0x33,0x45,0x67,0xaa,0xbc,0xfe},转换之后为{‘0’,‘1’,‘,’,‘2’,‘0’,‘,’,‘3’,‘3’,‘,’,‘4’,‘5’,‘,’,‘6’,‘7’,‘,’,‘a’,‘a’,‘,’,‘b’,‘c’,‘,’,‘f’,‘e’,‘ ’,‘ ’}。也就是说,如果CAN总线一帧数据是8字节,则写入到SD卡的数据记录文件中的数据是25字节,如果需要存储CAN总线数据的ID号,对于标准帧(ID号为11bit)和扩展帧(ID号为29bit),一帧数据存储到数据记录文件中的大小分别为28字节和30字节。
FAT 文件系统以“簇”作为数据单元[9-10],SD 卡的一个扇区大小为512字节[11-12]。FATFS文件系统建议每次写入数据的量最好等于所使用的SD卡的簇的大小[13]。
经试验,SD的簇大小为4K的时候,写入速度最快。所以将SD卡格式化成簇大小为4K,并且每次向SD卡写入4K字节的数据。
数次实验证明,SD卡在连续写入若干字节(几十K以上),会出现一个大的写入间隔(SD卡垃圾回收时间),这一个间隔也许会持续数十毫秒至一百毫秒左右。如果在这个写入间隔期间,CAN总线节点有数据发出,需要一个软件上的数据缓冲区来存储数据。
通过对执行效率和代码数据结构的分析,采用循环缓冲队列(Circular Buffer)来存储处理后的CAN总线的数据帧,可以使系统持续接收CAN总线传来的数据,在缓冲队列中的数据多于4K时,再进行SD卡的写入操作。文献[14]采用的程序流程是不足以满足持续快速地处理CAN总线上传来的数据要求的。
为了测试存储系统的实时性、通用性和稳定性,特使用两个XMC4500硬件平台,如图7所示。其中,硬件平台(一)(XMC4500(一))用于产生随机数,通过CAN总线发送数据帧(均为扩展帧)给硬件平台(二)(XMC4500(二)),同时硬件平台(一)通过XMC4500的USB接口与PC机相连[15],PC机上的上位机程序实时将收到的数据存储为文本,用于在实验停止后和硬件平台(二)通过SD卡接口写入到SD卡中的文本文件的内容进行比对。
图7 测试所用的硬件平台
4.2.1 系统实时性存储压力测试
在测试系统实时性时,硬件平台(一)每200 μs发送一帧数据给硬件平台(二),测试系统在若干万CAN总线扩展帧数据存储至SD卡(每次写4K数据至SD卡)之后,是否存在丢失数据的情况。通过比对硬件平台(一)和硬件平台(二)所产生的文本文件是否内容一致来进行评判。测试情况如表1所示,由表1可知,系统具有较高的实时性存储能力。
4.2.2 系统通用性测试
在测试系统通用性时,硬件平台(一)通过CAN总线分别以不同的波特率向硬件平台(二)发送扩展帧,测试硬件平台(二)存在SD卡中的数据文件与PC机上得到的硬件平台(一)所发送的数据文件是否一致。测试情况如表2所示。由表2可知,系统对不同CAN总线波特率的节点具有通用性,而不是只适用于CAN总线波特率为1 000 Kb/s的节点。
表1 系统实时性测试
表2 系统通用性测试
4.2.3 系统稳定性测试
在测试系统稳定性时,测试系统在若干小时的持续写入的情况下的表现。测试时使用的CAN总线的波特率为1 000 Kb/s,硬件平台(一)每200 μs发送一帧数据。评判标准同上。测试结果如表3所示。由表3可知,系统在总线高负荷的情况下,仍然具有长时间内的高稳定性。
表3 系统的稳定性能测试
如图8所示,将一个用硬件平台(二)存储了6个小时的单个文本文件,分割成了单个大小为1 600 kB的小文件。因为考虑到经过若干小时的数据写入,若用excel软件来分析硬件平台(二)在SD卡上存储的单个记录文件,文件的行数会远远超过excel表格的单个文件的行数限制;若用MATLAB来分析数据,则一次读入整个文件,即使在PC机内存够用的情况下,也会严重影响MATLAB运行效率。故系统采用在PC机上将文件进行按行分割,然后再进行数据分析。其中按行分割文本文件的软件来自于互联网。
图8 文件按行分割结果
单个文件用excel表格解析后的结果如图9所示,第1列为CAN总线的帧的ID号,第2列到第9列为提取的8字节的CAN总线帧的数据段的内容。记录的数据均为16进制,可以通过excel的HEX2DEC函数把数据转换成10进制,以便于数据的处理。
图9 单个文件用excel表格解析
分析可得,系统对SD卡平均写入速率至少可以达到1.2 Mbps。使用XMC4500可以构建出一个简单、稳定、可靠、高效率的CAN总线数据记录设备。可以大大减轻测试记录人员的负担,也可为系统数据的准确实时记录方面提供良好的技术支持。
[1]农建毅.基于CAN的车辆行驶记录仪[J].工业控制计算机,2008,21(2):76 -79.
[2]肖楚海,梁杰申.SD卡在记录汽车CAN总线数据中的应用[J].信息化纵横,2009(18):14-16.
[3]苏义鑫,程敏,何力.基于AT89C52单片机的SD卡读写设计[J].世界电子元器件,2008(5):65-68.
[4]刘慧丰,李远哲,单建兵,等.基于SD卡的CAN总线数据存储设备的设计[J].计算机测量与控制,2014,22(04):1236 -1239.
[5]XMC4500 microcontroller series for industrial application reference manual[Z].V1.3 Infineon Technolo-gies AG,2013.
[6]魏来,周穗华,刘旭东.基于SD卡的水声信号采集系统设计[J].海洋技术,2010,29(2):51-55.
[7]邓剑,杨晓非,廖俊卿.FAT文件系统原理及实现[J].计算机与数字工程,2005,33(9):105 -108.
[8] Fatfs module application note r0.11[Z].ChaN,2015.
[9]付秀全,陈杭,叶树明.基于MSP430F1611和SD卡的心电数据存储系统的低功耗设计[J].电子技术应用,2009,(4):45 -51.
[10] SD specifications part a2,SD host controller standard specification,Version 2.00[Z].2007.
[11] SD memory card security specification,Version 1.01[Z].2001.
[12] The multimediacard system specification,Version 4.0[Z].2004.
[13] SD specifications part 1,physical layer specification,Version 2.00[Z].2006.
[14]卢铁军,童亮,贾银良.基于XMC4500的汽车CAN网络检测卡设计[J].计算机测量与控制,2014,22(6):1905-1907.
[15] Installation and test GUI of infineon USB driver[Z].Infineon Technologies AG,2014.