基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx

上传人:b****5 文档编号:3290757 上传时间:2022-11-21 格式:DOCX 页数:19 大小:230.42KB
下载 相关 举报
基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx_第1页
第1页 / 共19页
基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx_第2页
第2页 / 共19页
基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx_第3页
第3页 / 共19页
基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx_第4页
第4页 / 共19页
基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx

《基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx》由会员分享,可在线阅读,更多相关《基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx(19页珍藏版)》请在冰豆网上搜索。

基于声表面波技术的煤矿安全智能监控节点设计与实现第5章.docx

基于声表面波技术的煤矿安全智能监控节点设计与实现第5章

第五章煤矿安全智能监控节点软件设计

煤矿安全智能监控节点软件设计包括嵌入式Linux系统移植、CAN总线驱动设计、485驱动驱动程序设计、嵌入式数据库设计、GUI界面显示设计。

5.1嵌入式Linux系统的移植

煤矿安全智能监控节点的核心控制芯片是S3C2440A,所以嵌入式Linux系统的移植是基于S3C2440A的移植。

嵌入式Linux系统的移植包括BootLoader移植、Linux内核移植和文件系统的制作。

5.1.1交叉编译环境的建立

交叉编译环境就是代码在宿主机上编写和编译,却能在目标板上能运行的环境。

本文的宿主机操作系统为RedHatEnterpriseLinux5,交叉编译器的版本采用arm-linux-gcc-4.3.2。

从网上下载arm-linux-gcc.4.3.2.tgz到Linux系统下,解压arm-linux-gcc.4.3.2.tgz,把arm-linux-gcc安装到/usr/local/arm/4.3.2目录即可。

tarxzvfarm-linux-gcc-4.3.2–C/

exportPATH=/usr/local/arm/4.3.2/bin:

$PATH

5.1.2BootLoader的移植

BootLoader类似于PC机中的BIOS程序,它是在嵌入式系统上电后运行的第一段小程序。

通过这段小程序,可以初始化硬件设备、建立内存空间映射图,将系统的软硬件环境带到一个合适的状态,最终为启动操作系统内核准备好正确的环境[30]。

目前,常用于ARM处理器的BootLoader有三种:

u-boot、ARMboot、RedBoot,u-boot由于其具有灵活性高、技术成熟、功能齐全等优点被广泛应用。

所以本文采用u-boot,版本为u-boot-2010-03。

u-boot的移植步骤如下:

下载解压u-boot源码包。

本文采用u-boot-2010-03版本,可以到u-boot官方网站去下载名为u-boot-20-10-03.tar.bz2的u-boot源码包,解压u-boot源码包。

添加u-boot对S3C2440A的支持。

进入u-boot根目录,在u-boot根目录下的Makefile中添加:

smdk2440_config:

unconfig

@$(MKCONFIG)$(@:

_config=)armarm920tsmdk2440NULLs3c24x0

其中arm表示CPU的架构(ARCH),arm920t表示CPU的类型,smdk2440表示S3C2440A的目录,NULL表示开发商,s3c24x0表示CPU型号。

修改定义交叉编译工具链。

CROSS_COMPILE=arm-linux

拷贝S3C2440A相关文件。

由于S3C2410和S3C2440A的接口资源和寄存器相似,所以在S3C2410定义的基础上修改S3C2440A。

进入u-boot-2010-03/board目录新建2440目录再将samsung/smdk2410目录复制到2440目录下,将2440目录下的smdk2410重命名为smdk2440,其目录下的smdk2410.c重命名为smdk24-40.c,目录下将include/configs中的smdk2410.h复制为smdk2440.h。

修改系统时钟,设置CPU频率(FCLK)。

S3C2440A采用12MHz的晶振,但S3C2440A可以通过时钟控制逻辑的PLL使工作频率达400MHz。

S3C2440A有两个MPLL:

MPLL和UPLL,MPLL用于设置FCLK、HCLK、PCLK,UPLL专用于USB设备。

本文设置FCLK设为400MHz,分频比为FCLK:

HCLK:

PCLK=1:

4:

8,UCLK为48MHz。

#defineM_MDIV0x7f

#defineM_PDIV0x2

#defineM_SDIV0x1

#defineU_M_MDIV0x38

#defineU_M_PDIV0x2

#defineU_M_SDIV0x2

修改u-boot,使u-boot支持从NandFlash启动。

将nand_read.c文件拷贝入board/2440目录下,同时在Makefile文件添加对nand_read.c的编译。

OBJS:

=2440.onand_read.oflash.o

添加DM9000网卡配置。

在include/configs/2440.h下添加如下代码:

#defineCONFIG_DRIVER_DM90001

#defineCONFIG_DM9000_BASE0x20000000

#defineDM9000_IOCONFIG_DM9000_BASE

#defineDM9000_DATA(CONFIG_DM9000_BASE+4)

#defineCONFIG_DM9000_USE_16BIT

添加完uboot对2440的支持后返回uboot的顶层目录,从新编译u-boot,在uboot顶层目录下生成u-boot.bin文件,然后通过USB(UniversalSerialBus,通用串行总线)下载u-boot.bin存储于NandFlash中。

5.1.3Linux内核移植

Linux内核是Linux系统的核心部件,它为内存、外围设备、系统进程、设备驱动、文件和网络系统等设备正常工作和运行提供保证。

嵌入式设备的资源有限,在进行Linux内核移植时,根据需要对Linux内核进行裁剪和配置,使系统体积更小,运行更高效。

本文采用的Linux内核为Linux-2.6.32,Linux内核定制的步骤大致如下:

解压Linux内核源码包。

从www.kernel.org上下载Linux2.6.32.2内核版本,并将Linux2.6.32.2解压到Linux目录下。

[root@localhostlinux]#tarxzflinux-2.6.32.tar.gz

[root@localhostlinux]#ls

linux-2.6.32linux-2.6.32.tar.gz

指定交叉编译变量。

修改linux-2.6.32目录下的Makefile文件,指定目标代码平台和交叉编译器。

exportKBUILD_BUILDHOST:

=$(SUBARCH)

ARCH  ?

=arm

CROSS_COMPILE?

=arm-linux-

内核配置。

使用makemenuconfig命令进入配置菜单界面,在配置菜单中对内核中的处理器、驱动、文件系统等进行选择,如图5.1所示。

图5.1Linux内核配置界面图

在linux-2.6.32目录下输入makezImage命令进行内核编译,编译完成后会在在linux-2.6.32目录下的“arch/arm/boot”目录中生成了所需的内核文件zImage。

由于u-boot在用bootm命令引导内核的时候,bootm需要读取一个64字节的文件头,来获取内核映象所针对的CPU体系结构、OS、加载到内存中的位置、在内存中入口点的位置以及映像名等信息,mkimage就是一个用于添加头文件的专用工作,制作头文件的命令如下:

mkimage–n‘CY’–Aarm–Olinux–Tkernel–Cnone–a0x30008000–e0x30008040–dzImagezImage.img

把mkimage生成的zImage.img文件下载到NandFlash中。

5.1.4文件系统制作

根文件系统是对Linux系统存储设备中的数据进行组织和管理,根文件系统的存在使Linux系统与用户之间的操作变得简单方便,Linux内核开始运行时最先挂载的文件系统即为根文件系统。

Linux系统以树状结构管理目录、文件,其他分区挂接在某个目录上,然后就可以通过这个目录来访问分区上的文件。

如图5.2所示,根文件系统挂载在根目录上,根目录就有根文件系统的目录和文件,如/bin、/etc、/usr等。

图5.2根文件系统目录结构图

构建根文件系统的步骤如下:

创建系统目录;编译并安装内核模块;建立动态链接库;交叉编译Busybox;创建etc目录下的配置文件;制作根文件系统。

将根文件系统的镜像文件下载到NandFlash中。

Qt/Embedded和SQLite的移植相对简单,限于篇幅本文就不再叙述。

5.2CAN总线驱动程序设计实现

CAN总线模块由两部分构成:

CAN总线控制器和CAN总线收发器。

CAN总线收发器主要工作在CAN总线物理层,发送时CAN总线收发器把CAN总线控制器的逻辑信号转换成能在CAN总线物理线路上传输的差分信号,接收时CAN总线收发器把在CAN总线物理线路上传输的差分信号转换成CAN总线控制器能够识别的逻辑信号。

CAN总线控制器工作在CAN总线数据链路层,是整个CAN总线模块的核心,CAN总线控制器主要工作有:

帧的封装、帧的拆分、帧错误检测等。

CAN总线模块驱动的实现主要是CAN总线控制器驱动的实现。

5.2.1CAN总线数据格式

CAN总线中使用数据帧进行数据传输,数据帧又分为标准帧和扩展帧。

标准帧和扩展帧的主要区别在于仲裁区域的ID码长度的不同,标准帧的ID码为11位,扩展帧的ID码为29位[31]。

为尽量提高CAN总线数据传输的利用率,使ID码也携带帧信息,本文数据传送选择ID码为29位的扩展帧,扩展帧的结构如图5.3所示。

图5.3扩展帧结构图

CAN总线是通过报文标示符来判断该节点是否为目标节点,即通过CAN控制器的报文验收滤波器和报文屏蔽寄存器对比帧ID来判断是否需要接收该帧。

而CAN总线的帧ID可以自己定义,本文定义的帧ID如表5.1所示,ID.28~ID27表示帧的类型;ID.26~ID.19表示目标节点的地址;ID.18~ID.11表示源节点的地址;ID.10~ID.7表示功能码;ID.6~ID.5表示帧组码,ID.4~ID.0表示帧码。

表5.1CAN总线帧ID定义格式

字段

长度

描述

ID.28~ID.27

2bit

帧类型,01表示此帧为命令帧,10表示此帧为数据帧。

ID.26~ID.19

8bit

接收CAN报文节点的地址。

ID.18~ID.11

8bit

发送CAN报文节点的地址。

ID.10~ID.7

4bit

表示此帧的用途。

ID.6~ID.5

2bit

帧组码,00表示本帧数据没有分段;01表示本帧为数据的第一个分组;10表示本该帧位于数据的中间断,其位于那一段由分组数决定;11表示本帧为数据的最后一分组。

ID.4~ID.0

7bit

分组数,若帧组码为10,表示本帧在数据中的位置,否则保留。

在MCP2515驱动程序中CAN总线报文格式定义代码如下所示。

typedefstructmcpcan_data{

unsignedcharFraType;

unsignedcharSrcId;

unsignedcharDesId;

unsignedcharFunCode;

unsignedcharFraCode;

unsignedcharFraValue;

unsignedintDataLen;

longintData[8];

}mcpcan_data;

其中FraType表示帧的类型、SrcId表示帧的发送地址、DesId表示帧的目的地址、FraCode表示帧组码、FraValue表示分组数、DataLen表示帧的数据长度、D-ata[8]表示帧传送的数据字节。

本文中SAW标签是32位的,其温度测量范围为-40~800℃,湿度测量范围为20~70%,甲烷浓度测量范围为0~75%,人员距离测量范围0~20m。

本文中温度信息需要2byte,湿度2byte,甲烷浓度2byte,人员距离2byte。

其CAN总线数据帧中数据段数据格式定义如表5.2所示。

表5.2CAN总线数据帧中数据段数据格式定义

数据类型

ID号

数据值

读卡器号

1byte

4byte

2byte

1byte

数据类型:

表示数据值的类型,其中0x01表示温度,0x02表示湿度,0x03表示甲烷浓度,0x04表示人员距离。

ID号:

表示上传数据的SAW标签的ID号。

数据值:

表示SAW标签上传的参数信息。

读卡器号:

表示上传数据的读卡器编号。

5.2.2SPI驱动程序设计

本文选用的CAN控制器是MCP2515,S3C2440A和MCP2515之间通过SPI接口进行通信,所以在介绍MCP2515之前,首先介绍SPI驱动程序的设计。

S3C2440A提供两路的SPI接口:

SPI0和SPI1。

由于S3C2440A自带SPI接口,这简化了SPI驱动程序。

SPI驱动程序的配置步骤为:

设置端口映射,通过Linux内核提供的ioremap()函数对SPI寄存器的地址进行映射;对SPI的各端口寄存器进行初始化,设置S3C2440A对应的I/O口为SPI模式;通过SPPREn寄存器配置SPI的传输速率;通过SPCON来配置合理的SPI接口模式,本文SPI配置为SPI接口为主设备,数据的读写为查询模式。

写数据0XFF到SPTDAT-n寄存器10次;进行数据发送时,检测数据传输标志位(REDY)是否为“1”,若数据传输标志位为“1”,则写数据到SPTDATn,否则返回错误。

接收数据时,检测数据传输标志位(REDY)是否为“1”,若数据传输标志位为“1”,从SPRDATn读取数据,否则返回。

SPI驱动程序读函数和写函数代码如下所示。

//SPISend

BOOLSPI_SendByte(BYTEbData,BYTE*pData)

{

if(SPI_WaitTxRxReady()==FALSE)

returnFALSE;

*(unsignedchar*)rSPTDAT1=bData;

if(SPI_WaitTxRxReady()==FALSE)returnFALSE;

*pData=*(unsignedchar*)rSPRDAT1;

returnTRUE;

}

//SPIRead

BOOLSPI_ReadByte(BYTE*pData)

{

BOOLbRet=TRUE;

if(SPI_WaitTxRxReady()==FALSE)

returnFALSE;

*pData=*(unsignedchar*)rSPRDAT1;

returnbRet;

}

5.2.3MCP2515驱动程序

MCP2515与S3C2440A采用SPI进行通信。

MCP2515提供的SPI命令有复位指令、读指令、读RX缓冲指令、写指令、装载TX缓冲指令、请求发送(RTS)指令、读状态指令、RX状态指令、位修改指令。

限于篇幅,本文仅对读指令、写指令、位修改指令进行介绍。

MCP2515的读指令时序图如图5.4所示,将SPI片选(

)引脚设置为低电平来启动读指令;向MCP2515的数据输入引脚(SI)输入读指令(0x03);接着向MCP2515的数据输入引脚(SI)输入读取数据的地址,地址格式为高位在前低位在后;MCP2515的数据输出引脚(SO)输出指定地址的数据,数据格式为高位在前地位在后;MCP2515将SPI片选(

)引脚设置为高电平结束读指令。

图5.4MCP2515读时序图

MCP2515读命令代码如下所示:

ret=MCP2515_SPI_Send(SPI_READ,&data);

ret=MCP2515_SPI_Send(addr,&data);

ret=MCP2515_SPI_Send(0xff,&data);

ret=MCP2515_SPI_Read(&data);

MCP2515的写指令时序图如图5.5所示,将SPI片选(

)引脚设置为低电平来启动写指令;向MCP2515的数据输入引脚(SI)输入写指令(0x02);接着向MCP2515的数据输入引脚(SI)输入写入数据的地址,地址格式为高位在前低位在后;MCP2515的数据输入引脚(SI)往指定的地址写入数据,数据格式为高位在前地位在后;MCP2515将SPI片选(

)引脚设置为高电平来结束写指令。

图5.5MCP2515写时序图

MCP2515写命令代码如下所示。

ret=MCP2515_SPI_Send(SPI_WRITE,&data);

ret=MCP2515_SPI_Send(addr,&data);

ret=MCP2515_SPI_Send(arg1,&data);

位修改指令可以对特定状态和控制寄存器中单独的位进行置“1”或者清零。

MCP2515位修改指令时序图如图5.6所示,将SPI片选(

)引脚设置为低电平来启动位修改指令;向MCP2515的数据输入引脚(SI)输入位修改指令(0x05);向MCP2515的数据输入引脚(SI)输入修改的寄存器地址,地址为高位在前低位在后;接着向MCP2515的数据输入引脚(SI)输入屏蔽字节,屏蔽字节确定允许修改寄存器中的哪一位,屏蔽字节中的“1”表示允许对寄存器中的相应位进行修改,“0”则禁止修改;然后向MCP2515的数据输入引脚(SI)输入数据字节,数据字节确定寄存器修改的最终结果,如果屏蔽字节相应位允许修改,数据字节中的“1”表示将寄存器相应位置“1”,“0”表示将相应位清零;MCP2515将SPI片选(

)引脚设置为高电平来结束位修改指令。

位修改指令表示图如图5.7所示。

图5.6MCP2515位修改指令时序图

图5.7MCP2515位修改指令表示图

MCP2515位修改指令代码如下所示。

ret=MCP2515_SPI_Send(SPI_BITMOD,&data);

ret=MCP2515_SPI_Send(addr,&data);

ret=MCP2515_SPI_Send(arg1,&data);

ret=MCP2515_SPI_Send(arg2,&data);

MCP2515的驱动程序的大体框架为:

申请MCP251驱动程序设备号;设备驱动程序的初始化如分配内存、初始化工作队列等;填充file_operations结构体;编写file_operations结构体中相关函数代码;释放设备号及相关内存。

file_operations结构体包括的函数如下所示。

structfile_operationsMCP2515_ops={

.open=MCP2515_open,

.read=MCP2515_read,

.write=MCP2515_write,

.ioctl=MCP251_ioctl,};

其中MCP2515_open函数主要完成中断函数的相关初始化,MCP2515的初始化等;MCP2515_release函数主要完成设备驱动的释放;MCP2515_read函数主要完成MCP2515数据的读取并传递给应用程序;MCP2515_write函数主要是发送从应用程序传递过来的数据。

MCP2515的初始化过程为通过复位命令复位MCP2515;通过位修改命令改变CAN控制寄存器(CANCTRL)的值设置MCP2515为配置模式;通过位修改命令设置MCP2515相应的寄存器,如发送缓冲器控制寄存器(TXBnCTRL)、接收缓冲器控制寄存器(RXBnCTRL)、中断使能寄存器(CANINTE)、中断标志寄存器(CANINTF)、验收滤波寄存器(RXFn)等;通过位修改命令改变CAN控制寄存器(CANCTRL)的值设置MCP2515为正常模式;其初始化过程图如图5.8所示。

图5.8MCP2515初始化过程

MCP2515的报文发送过程为判断发送缓冲器中是否为空,若发送缓冲器不为空则等待;将CAN总线报文的仲裁段的帧ID写入发送缓冲标识符寄存器(TXBn-SIDH、TXBnSIDL、TXBnEID8、TXBnEID0);将需要发送的数据长度写入发送缓冲器数据长度码寄存器(TXBnDLC);将此帧报文需要发送的数据写入发送缓冲器数据寄存器;判断CAN总线是否空闲,空闲则启动发送,否则等待CAN总线空闲;判断报文是否发生成功,成功则结束,否则从新发送。

MCP2515的报文发送流程如图5.9所示。

图5.9MCP2515报文发送流程图

MCP2515的报文接收采用的中断的方式,当检测CAN总线上有帧起始时,把该帧报文载入报文集成缓冲器;判断该帧是否符合滤波器条件,若符合则载入报文缓冲器,否则丢弃该帧,当报文装入报文缓冲器后,MCP2515的

引脚会产生中断,通知MCU有报文需要接收;读取报文接收缓冲器标识符寄存器中的值,即该帧报文的帧ID;读取该帧报文的数据长度;读取该帧报文传输的数据;清除中断标志;结束接收。

MCP2515的报文接收流程如下图5.10所示。

图5.10MCP2515的报文接收流程图

5.3485总线模块驱动程序设计实现

5.3.1485总线数据通信格式

由上一节CAN总线驱动程序设计可知,SAW标签采集的数据是多字节的,而UART通信一次最多只能传输8bit数据,所以在485驱动程序设计前,需要对数据信息的帧格式进行设计。

本文中485总线数据的帧格式采用MODBUS协议的RTU(RemoteTerminalUnit,远程终端设备)格式,RTU帧格式结构如表5.3所示,RTU帧格式中数据的起始和结束通过时间来判断,若3.5个字符时间内没有接收到数据则表示本帧数据结束,同时认为下一个字符为下帧数据的开始。

表5.3RTU帧格式

地址码

功能码

数据区

CRC校验

1byte

1byte

Nbyte

2byte

地址码:

485总线采用的是主机询问,从机应答的半双工通信方式,RTU帧格式中,地址用于表示从机地址,不同的从机地址不同。

只有当通信报文中地址与从机地址相匹配时,从机才应答主机的请求。

主机能够对从机的地址进行设置。

功能码:

功能码表示本次通信,从机应该执行什么操作。

功能码能表示的范围为1~127,本文只选用了其中的部分功能码,如表5.4所示。

主机发送的命令帧和从机应答的数据帧中的功能码是相同的,命令帧中的功能码表示要执行的操作,数据帧中的功能码表示从机根据主机发送的命令帧做出的响应。

表5.4功能码信息表

功能码

读/写功能

功能

01

读取一个或多个读卡器的工作状态

04

读取读卡器的数据信息

06

更改读卡器地址码

15

向一个或多个对卡其写入控制命令,控制器工作状态

数据区:

数据区是主机发送给从机的数据或从机响应主机的数据,数据区随功能码的不同而不同。

如“04”功能码表示主机要求读取读卡器的数据信息,从机响应后返回读卡器采集的数据。

对于不同的功能码,数据区的大小可以不相同。

CRC校验:

CRC校验用于判断接收的信息是否正确。

本文采用16位循环冗余校验码完成数据的校验,发送方发送16位的循环冗余校验码,接收方对接收到的校验码进行验证,若与发送方发送的校验码是一致的,则数据传输是正确的。

5.3.2MAX485驱动程序

本文中485总线采用的电平转换芯片为MAX485,MAX485与S3C2440A之间通信采用

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1