|
1引言
在电子技术迅速发展以及在汽车上广泛应用的今天,汽车电子化程度越来越高。汽车电子系统中电子控件繁多、通信复杂度增大必然导致整车布线庞大而且复杂,安装空间紧缺,运行可靠性降低,故障维修难度增大。并且为提高信号利用率,要求数据信息互通,资源共享,传统的电气系统点对点的通讯方式已远不能满足这种需求。对上述问题,在已有成熟的计算机网络和现代控制技术的基础上,汽车网络技术应运而生。通过总线将汽车上的各种电子装置与设备连成一个网络,实现设备之间的信息共享,既减少了线束, 又可更好地控制和协调汽车的各个系统,使汽车性能达到最佳。
2系统硬件设计
本硬件系统所设计的车载网络具备数据处理、数据存储、数据通信、参数设置、显示等功能,能够很好地对传感器采集到的车速、车内温度、发动机运行状态、水温以及油量等数据进行传输、处理、存储,并通过显示屏显示,使驾驶员及时了解车体总的运行状况。系统按功能主要分为处理器模块、USB接口模块、存储模块、 UART异步串行口模块、CAN模块、10/100M以太网接口模块、显示模块以及电源。系统总体结构如图2.1所示。
2.1 处理器模块
该系统采用Samsung公司开发的一种32位RISC微处理器S3C2410,内含一个 ARM920T内核,芯片中集成了16KB 指令Cache、16KB 数据Cache、MMU、外部存储器控制器、NANDFlash控制器、1个LCD控制器、SDRAM控制器、 3个通道两个独立的 UART、4个通道的DMA、 8通道的10位ADC、触摸屏接口、IIC总线接口、1个USB主机接口,1个USB设备接口、117位通用I/O口和24位外部中断源。 S3C2410x支持从NAND Flash启动,系统采用NAND Flash与SDRAM组合,可以获得非常高的性价比。
2.2USB接口模块
S3C2410的USB支持USB1.1版本,由悬空和唤醒功能。USB设备控制器可以用DMA接口提供一个高性能完备的速率功能控制解决方案,允许批量传输、中断传输和控制传输。S3C2410扩展USB十分方便,按照USB1.1标准协议连接即可,可以同时支持USB的低速和高速传输。
2.3UART串行口模块
UART,指的是异步串行口。在 ARM9微控制器中包含有两个UART0和UART1。UART0仅提供TXD和RXD信号引脚,UART1增加了一个调制截调器 MODEM接口,其余方面两者都是完全相同的。
2.4 CAN模块
本系统采用 Philips公司生产的适合汽车环境和一般工业系统环境的独立 CAN控制器MCP2510。MCP2510支持 CAN2.0B,而且具有一些新特征,应用非常广泛,是比较典型的独立CAN控制器。SJA1000有两种操作模式,即基本CAN模式和具有很多扩展功能的Peli CAN模式。
2.5显示模块
由于本系统选用芯片已集成了LCD控制器,所以只要选择合适的 LCD显示屏即可。系统选择SHARP公司的LQ080V3DG01显示屏。 LQ080V3DG01是一款 TFT-LCD显示模块,它由彩色TFT-LCD模板、驱动电路、控制电路、电源电路和背光单元组成,显示分辨率为RGB640×480,具备3.3V和 5V两种供电方式。
3驱动程序设计
车载网络系统的软件由三部分组成:实时操作系统、硬件驱动程序和运行于操作系统、 10/100M以太网USB存储设备、 USB鼠标、 USB键盘、 GPRS/CDMA、 GPS 之上的应用程序。实时操作系统采用源码公开的Linux操作系统。硬件驱动程序主要为USB设备驱动、CAN控制器驱动、串口驱动和LCD控制器驱动。
3.1 USB设备驱动程序的设计
Linux的USB内核子系统中,提供了几个与设备驱动程序开发直接相关的核心数据结构,定义于内核源代码的<linux/usb.h>中。限于篇幅,下面只讨论在 Linux下设计一个典型 USB设备驱动程序的通用架构流程。
以上即为Linux中一个典型USB设备驱动程序的框架,通常包含设备初始化、设备卸载、设备打开、设备释放以及对设备进行读、写、控制等部分,是一种相对固定的格式。
3.2CAN控制器驱动程序的设计
Linux下驱动程序的编写有特定的规以及一些必要的模块,init_module模块是驱动程序中用来加载设备的,系统初始化时调用。此处用 arm9200_mcp2510_init()作为CAN总线驱动程序的入口函数,他将主要完成对MCP2510初始化,调用 register_chrdev()函数向系统注册字符型设备驱动程序,使用request_irq()函数为CAN总线的中断处理程序。根据传递CAN 数据的要求,设计了如下的数据结构予以存放一帧数据和对接收缓冲区进行管理:
Typedef struct{ unsigned int id; / * CAN网络中节点的标志符 * /
unsigned char data[8]; /* 要传的数据,最大为8个字节 * /
unsigned char dlc; / * 发送的数据长度 * /
int IsExt; / * 判断消息是否为扩展帧 * /
}
candata; Typedef struct{ Candata MCP2510_Candata[128];/ * 定义一个接收缓冲区 * /
int nCanRevpos; / *数据存入缓冲区的位置指针 * /
int nCanReadpos; / *数据读出的位置指针 * /
int loopbackmode;
wait_queue_head_t wq;
spinlock_t lock;
}
MCP2510_DEV;
数据结构file_operations是驱动程序中一个重要的数据结构,内核就是通过这个结构来访问驱动的。应用程序通过对_read()、_write()、_ioctl()函数调用驱动中相应的程序来读写数据和控制字符设备的工作。
3.3 串口驱动程序的设计
串口驱动程序采用查询方式,主要包括串口初始化函数、数据接收函数和数据发送函数。串口初始化函数USIinit()主要是用来设置 USART工作是的参数,用户应用程序可以通过调用数据接收函数RevUSData()对接收到的函数进行各种处理。USART的数据接收和发送都是一个主动的过程,因此此函数的设计较为简单。数据发送函数SendUSData()类似于数据接收函数,可以被用户程序调用。
3.4 LCD控制器驱动程序的设计
在驱动LCD设计过程中首要的是要配置LCD控制器,而在配置LCD控制器时最重要的则是指定帧缓冲区(FrameBuffer)。帧缓冲设备对应的设备文件是/dev/fb*,数据结构如下:
Static struct file_operations
fb_fops={ ower:THIS_MODULE,
read:fb_read,
write:fb_write,
ioctl:fb_ioctl,
mmap:fb_mmap,
open:fb_open,
}
其中的函数对具体的硬件进行操作,对寄存器进行设置,对显示缓冲进行映射。初始化函数首先初始化LCD控制器,在Linux中可以用kmalloc()函数动态分配连续LCD显示缓冲区。接着就是初始化一个fb_info结构,补充成员变量,调用register_framebuffer(& fb_info),将fb_info注册入内核。结构fb_info的成员函数:
struct fb_ops{
int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info);
int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);
int (*fb_set_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info);
}
4结束语
本文详细介绍了嵌入式车载网络系统的底层硬件和驱动程序的设计并成功地完成了硬件与软件的调试。本文作者创新点:此网络系统极大地减少了电控装置数,节省了粗大线束占用的汽车宝贵空间资源以及实现了汽车内部电子仪表间的数据共赏、通信与处理,从而提高了汽车的安全性能。 (编辑:chiying) |
|