汽车行驶状态记录仪的研究与实现

汽车行驶状态记录仪的研究与实现

收藏

压缩包内文档预览:

资源预览需要最新版本的Flash Player支持。
您尚未安装或版本过低,建议您

汽车行驶状态记录仪的研究与实现,汽车,行驶,状态,记录仪,研究,实现
编号:55749060    类型:共享资源    大小:961.42KB    格式:ZIP    上传时间:2020-03-09 上传人:机械设计Q****6154... IP属地:上海
12
积分
关 键 词:
汽车 行驶 状态 记录仪 研究 实现
资源描述:
汽车行驶状态记录仪的研究与实现,汽车,行驶,状态,记录仪,研究,实现
内容简介:
首都师范大学 论文分类号:硕士学位论文 密 级:题目:汽车行驶状态记录仪的研究与实现Research and Implementation of Vehicle Travelling Data Recorder学科专业:计算机应用技术研究方向 :智能接口技术研究生姓名: 郑 飞 龙 指导教师姓名:姚正治 刘金刚指导教师职称:教授 博士生导师摘 要摘 要汽车行驶记录仪是一种特殊的数字式电子记录装置,它可以对车辆行驶速度、时间、里程以及有关车辆行驶的其他状态信息进行记录存储,然后通过USB和RS232接口实现数据输出。汽车行驶记录仪的使用不仅可以遏止交通违章、约束驾驶员不良驾驶习惯,而且可以有效地预防道路交通事故的发生,并为执法人员进行事故的分析、处理提供科学、忠实的原始数据,因此在交通运输管理中发挥着十分重要的作用。针对目前汽车行驶记录仪的研究现状,本文设计和实现了一种基于51单片机的汽车行驶记录仪,该汽车行驶记录仪具有实时性好、可靠性高、价格低廉等特点。本文首先介绍了汽车行驶记录仪的研究背景和发展现状,并分析了记录仪系统需求,制定了记录仪由数据采集子系统、数据存储子系统和通信接口子系统三部分构成的总体结构。然后介绍了记录仪系统的硬件总体结构设计,具体阐述了各个功能模块的硬件电路设计和实现方法。这些功能模块主要包括:电源,实时时钟,数据采集,数据存储,数据通讯和人机交互。最后在软件设计部分,根据记录仪各个模块的功能,详细描述了记录仪系统各个任务的设计流程。重点描述了USB通信的实现:利用SL811HST实现USB HOST功能,通过优盘方便快捷地读取记录仪中数据,然后再由PC软件进行分析。对USB HOST中的关键技术:USB设备枚举、BulkeOnly传输协议以及FAT16文件系统的实现做了较详细的说明。在整个系统的设计中,软硬件系统设计均采用了抗干扰措施,提高了系统的可靠性、稳定性和抗干扰能力。在本文最后对所做的工作进行了总结,并提出本次设计需要改进之处及对汽车行驶记录仪未来的展望。关键词:汽车行驶记录仪;单片机;C51;USB;固件编程IAbstractAbstractVehicle traveling data recorder (VTDR) is a special digital electronic recorder which used to acquire and store vehicles traveling speed, time, distance and other related status information, and then transmit data via USB and RS232 interface. The use of vehicle traveling data recorder can not merely halt the break in trafic rules and regulations, restrain the drivers from being drive at bad habit, and can prevent the traffic accident effectively, it can also offer scientific, faithful initial data for the tipstaffs carries on the accidents. So it plays a very important role in transportation management. Aimming at the actuality of the VTDR research, a VTDR is designed in this paper which bases on the 51 MCU. It also has some characteristics such as real-time, high dependability and less cost.First, VTDRs background and reseach actuality are introducted in the pape. By analyzed the system requirement of VTDR, the system is consisted of data acquisition sub-system, data storage sub-system and correspondence interface sub-system. And then, hard ware framework is introduced in this paper. And the methods in which every function units of the recorder is designed are also discussed. Those function units mainly include power supply, real-time clock, data collection, data store, data communication, human and machine interface.At last, in the part of software design, the flow of every tasks software is described in the paper, based on the functions of VTDR. It makes use of SL811HS to realize USB HOST function, gets the data from recorder conveniently and swiftly through U disk. Have done more detailed explanation in the key technology of USB Host. Such as enumerating device, Bulk-Onlyt ransmit protocol and FAT16 files ystem. Otherwise, several measures of anti-jamming are adopted in the process of hardware and software designing.Finally, summarize the all design, point out that needed improvement the prospect of the future of The Vehicle Traveling Data Recorde.Keywords: Vehicle Traveling Data Recorder; Single Chip Microcomputer; C51; USB; Firmware Programming.78目录目 录题目:汽车行驶状态记录仪的研究与实现0摘 要IAbstractII目 录III第一章 绪论11.1国内外汽车行驶记录仪发展的状况11.2本课题的目的和意义21.3本课题的目标和主要研究内容21.3.1 课题的总体目标21.3.2 研究的主要内容3第二章 汽车行驶记录仪总体方案设计42.1仪器的功能要求及技术性能指标42.1.1电气性能要求42.1.2记录仪的功能要求及技术性能指标42.1.3数据安全性52.1.4气候环境适应性52.1.5机械环境适应性52.1.6抗汽车电点火干扰52.2 系统结构52.2.1 主板的功能与设计62.2.2 面板的功能与设计7第三章 汽车行驶记录仪硬件设计与实现83.1电源模块83.1.1 电源模块设计概述83.1.2 电源方案的选择与论证83.1.3 电源模块的设计103.2实时时钟模块123.2.1 SD2301B的硬件电路设计133.2.2 SD2301B的内部寄存器143.2.3 SD2301B的软件编程143.3数据采集183.3.1 信号的调理设计183.3.2 车辆状态信号的采集203.4中央处理器203.4.1 中央处理器的选择213.4.2 复位系统213.5 CPU的IO扩展223.6 数据存储模块233.6.1 存储需求分析233.6.2 存储器的选择243.6.3 铁电存储器FM1808介绍和应用电路设计253.6.4 数据闪存AT45DB041的电路设计和应用编程263.7 人机交互模块323.7.1 LCD液晶显示器333.7.2 键盘363.7.3 声光提示373.8 通信模块373.8.1 RS232接口383.8.2 USB接口383.9 抗干扰措施433.9.1硬件抗干扰设计433.9.2印刷电路板的抗干扰设计44第四章 汽车行驶记录仪软件设计与实现474.1 控制软件功能简介474.2 控制软件的设计与实现484.2.1 主机软件的总体架构484.2.2 数据采集程序的设计与实现494.2.3 显示子程序的设计与实现544.2.4 主菜单的设计与实现554.2.5 主程序的设计与实现574.2.6 串行通信程序设计与实现584.3 USB的设计与实现594.3.1 USB主机设计与实现604.3.2 USB从机设计与实现704.4系统软件的抗干扰设计72第五章 汽车行驶记录仪的调试735.1静态调试735.2硬件调试过程中遇到的问题和解决方法735.3软件调试过程中遇到的问题和解决方法745.4整体调试74第六章 总 结75参 考 文 献76致 谢77作者简历78第一章 绪论第一章 绪论随着我国交通建设持续快速的发展,社会车辆的急剧增多,道路交通安全形势相当严峻,运输企业规模与管理等级的进一步提高,道路交通安全管理及运输企业内部管理问题越来越成为行业关注的焦点。汽车行驶记录仪(Vehicle travelling data recorder),亦称“汽车黑匣子”,是安装在车辆上,对车辆行驶速度、时间、里程以及有关车辆行驶的其他状态信息进行记录、存储并可通过接口实现数据输出的数字式电子记录装置。汽车行驶记录仪能完整、准确地记录汽车行驶状态下的有关情况,能将汽车行驶轨迹完整记录,并通过专用软件在电脑上再现,对遏止疲劳驾驶,车辆超速的违章、约束驾驶员的不良行为,分析鉴定事故,提高交通的管理执法水平和运输管理水平、保障车辆运行安全也有着重要的实际作用及意义。1.1国内外汽车行驶记录仪发展的状况早在20世纪80年代,发达国家就开始安装使用汽车行驶记录仪。其中,欧共体己在1975年就通过了在汽车上安装汽车行驶记录仪的立法,要求3.5吨以上货车、9座以上客车必须安装行车记录仪;欧盟在第3825/85号法规关于公路运输车辆的记录设备的第三款中规定:“记录设备应在欧盟成员国使用的客货运输车辆上安装和使用。”这一立法要求欧洲的15个成员国在10年内,给在用的900万辆卡车和轿车安装这一装置。这一作法很快在美国引起效仿。1998年,马来西亚内阁会议决定,强制使用汽车行驶记录仪。以日本为例,日本的法律规定,拥有5辆以上汽车的运输单位必须配备一名专职安全管理人员,以后每增加20辆汽车必须增加1名安全管理人员。这些安全管理人员的一个重要职责,就是监督使用汽车行驶记录仪。安全管理人员通过定期釆集和分析行驶记录仪的各种数据,可以完整、准确地判定每辆车在每一时刻的运行状况,以此加强企业的安全生产管理。2001年10月24日,交通部、公安部、国家安全生产监督管理局共同发布了关于加强公路客运交通安全管理的通告,为明确长途客车应当使用行驶记录仪奠定了坚实的基础。自2001年以来,交通部交规划发2001268号发布的公路行业产业政策、交公路发2002226号和交公路发2002418号文件等分别要求利用全球定位系统(GPS)以及行车记录仪对运输全过程进行跟踪,尤其是长途客运车辆、危险品运输车辆和旅游客运车辆要逐步采用GPS行车记录仪,以确保运输安全。2003年国家质量监督检验检疫总局发布并实施了GB/T19056-2003汽车行驶记录仪国家标准。该标准对汽车行驶记录仪的各项性能、试验方法、检验规则及安装作了详细的规定。2004年12月10日,在第二届中国智能交通论坛期间,11家汽车行驶记录仪厂家于深圳正式签字成立中国汽车行驶记录仪联盟。联盟初步成立后,行业内一些具有实力的厂家继续加盟。未来将在在适当时间、适当地点召开正式成立大会。行业联盟首先将在联盟成员内解决产品的互联互通。美国、日本、香港、马来西亚等地也在大量使用汽车行驶记录仪,我国许多大城市不少车辆也安装上了汽车行驶记录仪。几年来的统计资料表明:使用汽车行驶记录仪,交通事故率降低了37%-52%,大大减少了人员伤亡和财产损失,产生了明显的社会效益与经济效益。1.2本课题的目的和意义汽车行驶记录仪能够为驾驶员提供其驾驶活动的反馈信息,为道路运输企业提供良好的管理工具。它的使用对保障道路交通安全起到直接的作用,可以产生显著的社会效益和经济效益。首先,汽车行驶记录仪在车辆超速或超时行驶时能发出报警声,督促司机安全行车。而且,司机保持车辆中速行驶,对延长车辆使用寿命、节约燃料、减轻耗损都起到重要的作用,可减少企业经营成本。其次,汽车行驶记录仪能真实、准确反映车辆运行中的实际状况,记录相关的数据。其存储的数据可作为企业加强对车辆的使用、运行、调度的科学管理的依据。另外,汽车行驶记录仪记录的数据,对交通事故的原因和责任分析,也有一定的作用。我国公安部为遏制日益频繁的交通事故,责成公安部交通管理科学研究所、中国公路学会客车学会、中国航空工业第611研究所、中国道路运输协会、中国汽车技术研究中心、广州银宜智能交通有限公司参加起草并制定了汽车行驶记录仪的国家标准GBIT 9056-2003,并将在我国的营运车辆中运用法规强制安装汽车行驶记录仪。因此,研制汽车行驶记录仪具有重大的现实意义。1.3本课题的目标和主要研究内容1.3.1 课题的总体目标本课题的目标是,开发符合GB/T19056-2003汽车行驶记录仪国家标准的汽车行驶记录仪。1.3.2 研究的主要内容本课题的研究内容是基于图1.1所示的完整的系统模块结构图。图1.1下面对各个模块的功能进行说明:l 电源模块:提供记录仪运行所需要的电能,有断电保护功能l 时钟模块:确保时间准确l 数据采集模块:采集汽车行驶过程中的相关参数,要确保采集数据的正确性。l 数据处理模块:对数据进行相应的处理,是各个模块联系的纽带,也是汽车行驶记录仪的核心。主要功能:将采集的数据转换成存储所需要的格式,控制通信模块并为之提供数据,控制并响应人机交互模块。l 数据存储模块:按照规定的格式准确地存储相应的数据,需要达到相应的数据安全的要求。l 人机交互模块:主要包括按键、显示器、打印机、提醒装置等,主要提供良好的人机交互界面,提高汽车行驶记录仪的可操作性。l 通信模块:将记录的数据导出以便数据处理软件分析,并可导入设置文件以便对汽车行驶记录仪进行设置。l 数据处理软件模块l 认证模块:口令认证、IC卡认证l 整体设计:符合整体电磁兼容性,气候环境适应性,机械环境适应性,外壳防护等级等方面的要求。本论文的章节安排如下:第二章,提出并实现了汽车行驶记录仪的总体设计思路;第三章,提出并实现汽车行驶记录仪硬件设计;第四章提出并实现了汽车行驶记录仪软件设计,提出并实现USB通信机制。第二章 汽车行驶记录仪总体方案设计第二章 汽车行驶记录仪总体方案设计2.1仪器的功能要求及技术性能指标根据国家标准GB_T190562003汽车行驶记录仪1的要求,汽车行驶记录仪应该满足如下几个方面的要求。2.1.1电气性能要求由于汽车的供电系统通常为蓄电池,随着汽车行驶状态的不同,汽车放电机的输出电压会有较大的波动;另外随着蓄电池使用年限和工作状态等的不同,其输出电压往往有一定波动,从而影响到整个汽车的供电电压。因此,国家标准GB_T190562003要求记录仪能够在一定的电压波动范围内正常工作。电源电压的波动范围如表2.1所示。表2.1 电气性能试验参数 单位为伏特标称电源电压电源电压波动范围极性反接试验电压过电压12916140.124241832280.236362748420.2542.1.2记录仪的功能要求及技术性能指标国家标准GB_T190562003要求记录仪应有如下功能:l 自检功能;l 实时时间、日期及驾驶时间的采集、记录、存储功能;l 车辆行驶速度的测量、记录、存储功能;l 车辆行驶里程的测量、记录、存储功能;l 驾驶员身份记录功能;l 数据显示;l 操作功能;l 数据打印输出功能;l 数据通信功能。2.1.3数据安全性记录仪应防止数据被更改或删除,应从记录仪硬件和数据分析软件系统两个方面来实现:1) 硬件上,应在记录仪主机上或其它适当的地方采取可靠安全措施(如铅封)防止数据储存器等重要器件被更换;2) 记录仪主机内车辆行驶速度、里程、驾驶时间等原始数据不能通过外部设备进行任何改写或删除操作;3) 分析软件对车辆识别号、车牌号码、车牌分类、车辆特征系数、驾驶员代码、驾驶证号码等重要参数,一般情况下只能读,不能更改或删除。在记录仪初始化调试、校准、维修或其他特殊情况下需对上述重要参数进行设置操作时,需经操作授权。2.1.4气候环境适应性记录仪在承受各项气候环境试验后,应无任何电气故障,机壳、插接器等不应有严重变形;其记录功能、显示功能、打印功能等应保持正常;试验前存储的数据不应丢失或改变。2.1.5机械环境适应性记录仪在承受各项机械环境试验后,应无永久性结构变形;零部件应无损坏;应无电气故障,紧固部件应无松脱现象,插头、通信接口等接插件不应有脱落或接触不良现象;其记录功能、显示功能、打印功能等应保持正常;试验前存储的数据不应丢失。2.1.6抗汽车电点火干扰记录仪在进行汽车点火干扰时,不应出现异常现象,记录功能、显示功能、打印功能应正常。2.2 系统结构记录仪系统由下面几部分组成:l 主板:包含有中央处理器、数据采集、数据存储器、实时时钟芯片、数据通信接口、插接件及电源单元等。l 面板:包含有LCD显示器、指示灯、蜂鸣器、操作按键等l 打印机系统采用模块化结构,面板、打印机同主板是分离的,它们通过插接件与主板连接,这样不仅方便连接和安装,而且便于维护。记录仪系统主板上有一个USB口、一个RS232串口及两个自定义的插接件。RS232串口除了用作一般的串口通信之外,还用于连接打印机,这样可以节省接口。两个自定义的插接件分别用来输入各种车辆行驶状态传感器的输出信号和连接面板。记录仪的总体结构如图2.1所示图2.1 记录仪的总体结构2.2.1 主板的功能与设计主板主要处理汽车行驶数据的采集、记录和长期存储,同时主板为整个记录仪提供实时时钟、电源检测和对外通信(串口、USB)等功能,是整个系统的核心。主板以菲利普(Philips)公司生产的P89C51RD2作为中央处理器。整个记录仪采用并行总线的工作方式进行连接。汽车的状态信号经过调整后,通过74HC573挂在数据总线上;利用单片机的定时器/计数器T1对调整后的速度脉冲进行计数,从而获得汽车行驶的速度和里程等信息。记录仪使用FM1808作为扩展数据存储器,使用Atmel公司的4M基于SPI总线访问的Data Flash AT45DB041作为海量存储器。单片机采集到的汽车行驶数据首先存放在FM1808中,当满足一定条件的时候,将FM1808中的数据保存到Flash存储器中,进行长期的存储。“看门狗”作为复位电路可以防止单片机发生死机;系统掉电部分提醒单片机对重要的行驶数据作保存和处理;实时时钟采用市兴威帆电子的SD2301;USB控制器采用Cypress公司的SL811HS芯片,实现USB通信的功能,该芯片既可以实现USB主机又可以实现USB从机的功能,并且有较高的可靠性。整个主机部分设计体现了高性价比和安全、可靠的设计思想。2.2.2 面板的功能与设计面板主要提供人机交互功能。包括指示灯(一个电源指示灯、两个状态指示灯),蜂鸣器,LCD(分辨率为128*64),键盘(拥有16个按键)。第三章 汽车行驶记录仪硬件设计与实现第三章 汽车行驶记录仪硬件设计与实现3.1电源模块电源系统是任何汽车电子设计中最重要的子系统之一,电源设计非常重要,如果电源设计比较糟糕的话,其它单元设计无论多么完美,系统也不能正常发挥作用。整体功耗、电源反接保护、电磁干扰和汽车起停电压脉冲干扰等都是必须考虑的因素。3.1.1 电源模块设计概述目前汽车电源的输出电压有+12V,+ 24V和+36V三种标准。在我国汽车电源的输出电压主要是+12V和+24V。汽车电源是由发电机和蓄电池并联组成的,负责向汽车点火系统、起动系统、灯光信号等车载电器设备供电。由于诸多的电器设备(灯、继电器、电机、量程表和LED驱动器等)的存在和相互影响,汽车电源的供电质量一般比较差,存在较大的浪涌电流和电压波动,整个汽车工作环境的电磁干扰也比较大。浪涌电流会给对整个汽车电源供电系统的供电质量产生较大的影响;汽车点火的过程中,发电机输出电压会有较大的波动,这个冲击电压甚至能够达到百伏左右。由此可见,在电源模块的设计过程中需要考虑的问题比较多,对电气性能等方面的要求也比较高,要综合考虑电源适应性、过电压冲击和短路保护等因素。在该记录仪的设计过程中,主要考虑+12V和+24V电源供电的情况,电源的设计能够同时满足和兼容+12V和+24V两种标准。3.1.2 电源方案的选择与论证汽车的供电电压通常为+12V或+24V,而主机需要+5V和+3.3V 的工作电压。因此需要采用DC-DC变换将汽车供电电压转变为满足主机要求的供电电压。实现DC-DC变换的方式主要有两种:线性稳压变换和开关电源。下面将对两种DC-DC变换方法进行对比。1. 线性稳定电源线性稳压芯片(又称三端稳压器)是一种最简单的电源转换芯片,基本上不要外围元件,就可以实现DC-DC的转换。传统的线性稳压器,如78xx系列都要求输入电压要比输出电压高2V-3V 以上,否则不能正常工作;现在许多电源芯片公司推出了低压差线性稳压器(Low Dropout Regulator,简称LDO),这种电源芯片的输入输出电压只要有0.2 V-1.3V伏的差值,就可以正常工作。线性稳压电源的优点是:稳定性高,纹波小,可靠性高,并且电路简单。线性稳压电源的缺点是:体积大、较笨重、效率相对较低。因为线性稳压电源的功率调整管工作在线性区,靠调整管之间的电压降,来实现稳压输出。由于调整管静态损耗大,通常需要安装散热器给它散热。线性稳压电源的功率损耗计算公式为:其中:功率损耗(W);输入电压(V);输出电压(V);工作电流(A).线性电源的工作效率的计算公式为:在本记录仪电源模块的设计中,由于输入电压比较高(+12V或+24V),系统工作电流较大,最大时需要+5V/2.5A 输出(在打印机工作的情况下)。如果采用线性稳压电源,电源的工作效率将很低,可以计算得:在+12V电源供电的情况下,线性稳压电源的工作效率只有41.7%;在+24V电源供电的系统中,其效率只有20.8%。这样大部分的电能将被白白的浪费,一方面不能满足节电、高效的要求,另一方面能源的损耗给散热带来了很大的困难,而加装散热装置,则不利于电源的微型化。同时考虑到汽车电源有较大的电压波动范围,特别是汽车电源存在较大的瞬时尖峰干扰,如果采用线性电源,其输出电压也将会产生较大的波动,从而影响记录仪的供电质量。考虑到以上因素,本记录仪主供电模块(+5V)不宜采用线性稳压电源,+3.3V 供电模块可以考虑采用该方案。2.开关电源开关电源是采用脉宽调制的原理进行工作的,开关电源的调整管工作在饱和或截止状态,因而发热量小,效率高(75%以上),能够省掉大体积的散热装置;其输入电压的波动范围可以比较大,输入端的绝大多数干扰都可以在电源内部被吸收或抑制,不会对输出端产生影响,可以很好抑制一些瞬间的尖峰脉冲等干扰。开关电源的体积小,重量轻,稳定可靠;但是,开关电源的设计要比线性稳压器要复杂得多,如果设计不合理将会带来较大的电磁干扰和纹波干扰。在该系统中如果采用开关电源,可以提高电源的工作效率,缩小电源的体积,便于整个产品的微型化;能够很好的满足宽电压范围(汽车电源的电压波动范围较大,例如:在+12V系统中电压的波动范围在+9V- +16V,在+24V的系统中电压的波动范围在+18V- +32V)的要求。通常情况下,采用合理的设计和布线,开关电源的同样可以取得较高精度和稳定性,并且电磁辐射也很小。因此该系统主供电模块(+5V)可以考虑采用开关电源。通过上述比较,可以得出:由于本记录仪对效率和体积有较高要求,电源功率较大,作为一种大众化的推广产品,应当严格的控制其生产成本,因此主供电模块(+5V)采用开关电源较为经济,而对于电能需求比较小的数据闪存单元(最大电流35mA),可以采用低压线性稳压器供电。3.1.3 电源模块的设计生产开关电源芯片的公司很多,如:National Semiconductor,MAXIM,Linear(LT)等。在本记录仪中采用了美国National Semiconductor公司的LM2576-5作为主控芯片。LM2576开关稳压集成电路的主要特性如下2l 最大输出电流:3A;l 最高输入电压:LM2576为40V,LM2576HV为60V;l 转换效率:75%88%(不同电压输出时的效率不同);l 工作温度范围:-40 +125l 内部集成了震荡电路、电压基准、误差比较电路和MOSFET等,因此电源的外围电路设计比较简单,所需外部元件:仅四个;l 器件保护:热关断及电流限制;1、LM2576应用电路图3.1是LM2676-5的典型应用电路,下面将分别介绍一下各个引脚:图3.1 LM2576典型应用电路l 电源输出引脚(Output)l 外部电源输入引脚(Vin)l 地引脚(GND)l 反馈引脚(Feedback):连接在+5V电源输出端,作为反馈用来指示输出电压的精度l 转换控制端(ON/OFF):引脚接地或接在低于0.8V 的电压时,M2676将工作。悬空或接大于0.8V 时,LM2676处于不工作状态。LM2576的外围器件的选择:l 输入电容C3:设计的关键,选用额定耐压值为100V 100F铝电解电容。l 续流二极管:选用肖特基二极管,因为此类二极管开关速度快、正向压降低、反向恢复时间短。l 储能电感:电感的直流通流量直接影响输出电流,这里使用100H的电感。l 输出端电容C4:选用1000uF 1000F铝电解电容。2.线性电源部分的设计(+3.3V)线性电源部分主要将+5V直流电转变为+3.3V直流电,为数据闪存单元和USB单元供电,由于数据闪存单元和USB单元需要的电量很小,其最大工作电流仅为35mA,空闲状态下的电流消耗小于4mA,因此线性电源部分的功率损耗也很小,器件本身就能够很好的完成散热,不需要加散热装置。在本记录仪中采用了Texas Instruments公司的TPS79633来实现+5V到+3.3V 的变换。其应用电路非常简单,如图3.2所示。图3.2 TPS79633电路图Texas Instruments公司的TPS79633是固定电压输出的线性稳压器件,其输出电压固定为+3.3V;最大可提供1A的电流输出,因此肯定能够满足本记录仪的设计要求。该部分设计比较简单这里从略。2.车载电源输入的预处理3汽车电源接入记录仪之前,记录仪需要对电源输入做必要的处理。记录仪应该有反接保护、短路保护单元和抗发动机点火尖峰电压脉冲干扰等保护措施。这样设计的系统才能够比较可靠,抗干扰能力比较强。在该系统的设计中,我们采用如图3.3的方式来实现车载电源接入的预处理。图3.3 电源输入预处理电路图首先,汽车电源通过整流桥进行整流,这样可以有效的防止由于电源反接给系统造成损害。在电源的主回路中加保险丝,可以防止记录仪短路的情况下对汽车电源造成损害。在选择保险丝的过程中,通常要考虑正常工作电流,施加在保险丝上的电压,要求保险丝断开的不正常电流,保险丝工作的环境温度,允许不正常电流存在的最短和最长时间,脉冲、冲击电流、浪涌电流、起动电流和电路瞬变等几个方面的问题。对于本记录仪而言正常工作电流约为1.5A ,保险丝断开的不正常电流为3A,施加在保险丝上的电压不大于50V,可选用相关的3A/125V标准的保险丝。TVS瞬变电压抑制二级管可以有效的消除发动机点火脉冲的干扰。瞬变电压抑制二级管(简称TVS器件),在规定的反向应用条件下,当承受一个高能量的瞬态过压脉冲时,其工作阻抗能立即降到很低的阻值,允许大电流通过,并将电压钳制到预定水平,从而有效地保护电路中的元器件免受损坏。在选用TVS时,必须考虑电路的具体条件,一般应遵循以下原则:最大钳位电压VC不大于电路的最大允许安全电压;最大反向工作电压不低于电路的最大工作电压,一般可以选最大反向工作电压等于或略高于电路最大工作电压;额定的最大脉冲功率,必须大于电路中出现的最大瞬态浪涌功率。对于本记录仪,直流工作电压为+12V或+24V,最大允许安全电压+32V,半峰值电流时间约(Tp)1ms,最大峰值电流约(Ip)10A。因此可以近似得出P6KE30A型TVS满足要求。3.2实时时钟模块时钟按不同的标准可以分为多种类型。按供电方式不同可以分为:内部自带电池和外部电池供电两种;按照振荡电路的连接类型不同可以分为:内置振荡电路式和外置振荡电路式;按照接口不同可以分为:串行式和并行式。采用外部电池供电的时钟相对于内部电池供电的时钟,对电池的安装和电池的性能都有比较高的要求,同时电池充放电电路的设计比较复杂;内置振荡电路可以简化时钟电路的设计,同时能够保证有较高的系统可靠性。汽车行驶记录仪工作环境恶劣,51CPU的I/O引脚比较少,适宜采用内部自带电池和振荡电路的串行时钟芯片。本记录仪的时钟采用深圳兴威帆电子技术有限公司的工业级SD2301B芯片。该芯片的主要性能特点为3:l 低功耗:典型值1.0A(VBAT=3.6V)。l 工作电压:3.05.5V,工作温度:4085。l 年、月、日、星期、时、分、秒的BCD码输入/输出,并可通过独立的地址访问各时间寄存器。l 内置电池使用寿命:58年.l 内置电源管理电路,当VDD3.0V时,内部电池不耗电。l 内置抗干扰电路,可靠性更高.l 内置晶振,出厂前已对时钟进行校准,保证精度5ppm,即时钟年误差小于2.5分钟(在251下)。3.2.1 SD2301B的硬件电路设计SD2301B为DIP24封装,共有13个可用引脚,其与单片机系统的连线电路如图3.4所示。下面对引脚的功能做简单的介绍。图3.4 SD2301B的应用电路图l GND,VDD:电源输入端,接+5V直流电源。l BAT:外加备用电池引脚。由于在模块内部有电池,故在其电池能量未耗尽之前不接。l TEST:测试。内部电池电压检测脚(通常不接)l SCL:串行时钟输入脚,由于在SCL上升/下降沿处理信号,要特别注意SCL信号的上升/下降升降时间,应严格遵守说明书。l SDA:串行数据输入/输出脚,此管脚通常用一电阻上拉至VDD,并与其他漏极开路或集电极开路输出的器件通过线与方式连接l INTRA、INTRB:报警中断A、B输出脚,根据控制寄存器1与控制寄存器2来设置其工作的模式,当定时时间到达时输出低电平或时钟信号。它可通过重写控制寄存器来禁止。l SDAE:SRAM串行数据输入/输出脚,此管脚通常用一电阻上拉至VDD,通过线与方式与其它在I2C总线上的器件连接。l SCLE:SRAM串行数据时钟脚。数据在此管脚的上升沿/下降沿按时序输入/输出。l WP:SRAM写保护脚,当WP接高电平时,SRAM禁写;当WP接低电平时,SRAM可写3.2.2 SD2301B的内部寄存器SD2301B将时间数据和控制命令存储在不同地址的寄存器内,具体地址分配如表3.1: 表3.1 SD2301B的内部寄存器3.2.3 SD2301B的软件编程SD2300系列通过两线式串行接口方式接收各种命令并读写数据。两线式串行接口方式描述如下: l 开始条件 当SCL处于高电平时,SDA由高电平变成低电平时构成一个开始条件,对SD2300系列的所有操作均必须由开始条件开始。 l 停止条件 当SCL处于高电平时,SDA由低电平变成高电平时构成一个停止条件,此时SD2300系列的所有操作均停止,系统进入待机状态。 如图3.5所示。图3.5 实时时钟的串行接口 l 数据传输 当SCL为低电平,且SDA线电平变化时,则数据由CPU传输给SD2300系列;当SCL为高电平,且SDA线电平不变时,则CPU读取SD2300系列发送来的数据;当SCL为高电平,且SDA电平变化时,SD2300系列收到一个开始或停止条件。 如图3.6所示图3.6 实时时钟数据传输时序l 确认 数据传输以8位序列进行。SD2300系列在第九个时钟周期时将SDA置位为低电平,即送出一个确认信号(Acknowledge bit,以下简称“ACK”),表明数据已经被其收到。 如图3.7所示。图3.7 实时时钟确认信号1. 基本函数l bit I2CStart(void):开启SD2301的I2C总线函数。返回值:如果返回true,表示成功;如果返回false,表示失败。SD2300_SDA=1;SD2300_SCL=1;I2CWait();/延时if(!SD2300_SDA)return false;/SDA线为低电平则总线忙,退出SD2300_SDA=0;I2CWait();/延时while(SD2300_SDA)return false;/SDA线为高电平则总线出错,退出SD2300_SCL=0;I2CWait();/延时return true;l bit I2CStop (void):关闭SD2301的I2C总线。SD2300_SDA=0;SD2300_SCL=0;I2CWait();/延时SD2300_SCL=1;I2CWait();/延时SD2300_SDA=1;l void I2CAck(void):发送 ACK。SD2300_SDA=0;SD2300_SCL=0;I2CWait();/延时SD2300_SCL=1;I2CWait();/延时SD2300_SCL=0;l void I2CNoAck(void):发送NO ACK。SD2300_SDA=1;SD2300_SCL=0;I2CWait();/延时SD2300_SCL=1;I2CWait();/延时SD2300_SCL=0;l bit I2CWaitAck(void):读取ACK信号。返回值:如果返回true,表示有ACK;如果返回false,表示无ACK。uchar errtime=255;SD2300_SCL=0;SD2300_SDA=1;I2CWait();/延时SD2300_SCL=1;I2CWait();/延时while(SD2300_SDA)/SDA为高电平errtime-;if(!errtime)SD2300_SCL=0;return false;SD2300_SCL=0;return true;2. 读写SD2301数据l void I2CSendByte(uchar demand):MCU向SD2300发送一个字节,数据从高位到低位。参数:demand为写入的数据。具体实现如下:void I2CSendByte(uchar demand) /数据从高位到低位/uchar i=8;while(i-)SD2300_SCL=0;I2CWait();SD2300_SDA=(bit)(demand&0x80);/发送高字节demand=1;I2CWait();SD2300_SCL=1;I2CWait();SD2300_SCL=0;l uchar I2CReceiveByte(void):MCU从SD2300读入一字节,数据从高位到低位。返回值为:读取的数据。具体实现如下:uchar I2CReceiveByte(void) /数据从高位到低位/uchar i=8;uchar ddata=0;SD2300_SDA=1;while(i-)ddata=1; /数据从高位开始读取SD2300_SCL=0;I2CWait();SD2300_SCL=1;I2CWait(); /从高位开始 ddata|=SDA;ddata0;n-)daten-1=I2CReceiveByte();if (n!=1) /最后一个数据不应答I2CAck();I2CNoAck();I2CStop();3.3数据采集在汽车行驶记录仪中需要采集的信号很多,这其中包括车辆的制动信号、转向灯等开关量信号以及车速等模拟量。而所有这些信号都可以由相应的车载传感器引出,省去了加传感器的费用。本记录仪设计了16路开关量信号和1路车速信号,可以满足各种车辆的需求。3.3.1 信号的调理设计对于+12V车辆系统,其开关量的信号电平是+12V;对于+24V车辆系统,其开关量的信号电平是+24V,开关量信号的频率很低,不高于4Hz。开关在闭合和断开的过程中,往往存在一定的尖峰脉冲干扰;同时由于汽车的工作环境比较恶劣,开关信号和频率信号中也会含有较多的高频干扰成分。因此,在电路设计的过程中要充分考虑这些问题。对于+12V和+24V车辆系统,其开关量输入电平不同,在电路设计的过程中,也需要分别考虑,选择不同的电子器件。对于这些带有较大干扰的开关量输入和低频的频率量输入,最有效的处理办法就是采用光电耦合隔离措施和增加必要的滤波电路。输入电路与单片机应用系统主机的地线应该分开,使输入信号部分与记录仪主机部分电路之间实现完全的隔离,信号在光电耦合器中以光的形式来传递。普通的中低速光电耦合器在发光二极管通以额定电流大约2-5微秒以后,输出端的三极管才能导通。这样即使有脉冲宽度小于1微秒的噪声也难以对光电耦合器产生干扰。在本记录仪中,采用东芝公司的TLP521光电耦合器。其正向导通电流典型值为:16mA,典型输出工作电流为:1mA。为了抑制干扰。还可以在光电耦合器的输出端添加RC滤波网络。整个信号调理单元的原理如下图3.8所示。图3.8 信号调理单元原理图由于光电耦合器的导通需要一定的电流,又其中:I电流,R电阻,U电压,P功率光电耦合器正向导通压降约为1V,导通电流需要16mA左右。可以计算得到在开关信号输入的情况下,电阻R1的取值:在+12V系统中,电阻R1取值应为680欧姆。功率约为0.18W,可取1/2瓦电阻;在+24V系统中,电阻R1取值应为l.5K欧姆,功率约为0.384W,可取1/2W电阻。对于+5V的速度脉冲信号,电阻R1取值应为250欧姆左右,功率约为0.093W,可取1/8W电阻。对于RC型滤波网络,其频率计算公式为:其中,当外加频率等于时,传输特性下降3dB达到半功率点,频率继续增加时,传输特性明显下降。如果取R2=10k,C1=0.01uF,则有=1591Hz。这样,如果外加频率大于2000Hz时,会产生明显的衰减。经试验,高于l0kHz的方波不能有效的通过这样的电路,故可以很好的滤除尖峰脉冲等高频干扰信号。在本记录仪中R2取10k电阻,C1取0.01uF电容,这样系统将有较好的滤波效果。需要注意,如果速度脉冲的频率高于2000Hz,就要对滤波网络的参数做调整。3.3.2 车辆状态信号的采集开关量信号通过总线接口芯片74HC573与单片机相连,通过分别读取0x4000-0x5FFF(573A),0x6000-0x7FFF(573B)中的任意一个地址都可以得到车辆开关量信号值;开关量信号的频率很低(通常低于4Hz),在每次的数据采集过程中,可采用软件的方式进行数字滤波。速度信号是一个方波,通过外部中断INT1与单片机相连,进行计数。再根据车辆特征系数、车辆特征转数和时间来计算行使里程和车辆行驶速度。车辆行驶里程的计算公式:其中D 车辆行驶里程(km);C 记录的脉冲数(脉冲)K 车辆特征系数(转/km)S 特征转数(脉冲/转)在时间t内,记录仪的脉冲数为C,则行驶速度v的计算公式:3.4中央处理器单片微型计算机是微型计算机的一个重要分支,是一种非常活跃并且很具有生命力的机种,特别是在控制领域,所以又称为微控制器(Micro Controller Unit,MCU)。微控制器的典型代表是单片机。从20世纪70年代末单片机出现到今天,虽然已经过去了30年的历史,但是这种8位的电子器件目前在嵌入式设备中仍然有着及其广泛的应用。单片机芯片内部集成ROM/EPROM、RAM、总线、总线逻辑、定时/计数器、看门狗、I/O、串行口、脉冲调制输出、A/D、D/A、Flash、EEPROM等各种必要功能和外设。因此,单片机只需要和适当的软件及相关的外部设备相结合,便可形成一个可实现相应功能的单片机控制系统。单片机具有体积小,可靠性高、功能强、灵活方便等许多优点。3.4.1 中央处理器的选择在汽车行驶记录仪中我们采用Philips系列单片机P89C51RD2作为中央处理器。该CPU有64K Flash ROM,1K RAM,内置看门狗,4个TIMER(包括一个看门狗TIMER),两个外部中断,四级中断,可以工作在12CLK和6CLK两种工作模式下。选择原因在于:速度足够快;ROM足够大,不需要扩展;有现成的开发环境;价格合适且货源充足。3.4.2 复位系统在本记录仪中,采用MAXIM公司的MAX706作为电源监控和复位器件。MAX706能够提供上电、掉电复位功能(200毫秒复位时延);独立的“看门狗”保护功能(1.6秒时长);电压检测和手动复位功能。MAX706有一系列配置,不同的后缀对应不同的复位电平或复位电压5。本记录仪采用5V标准的工业级MAX706PESA。MAX706的应用电路如图3.9所示。增加两个10K的上拉电阻有利于提高记录仪的抗干扰能力。图3.9 MAX706电路图1、复位电路设计微处理器及其外设、逻辑芯片等在上电时,必须保证内部处于正常清零状态,否则将影响程序的运行。本记录仪使用MAX706电复位脉冲,以保证微处理器及其它器件的正常启动。在上电过程中,当Vcc到达1.0V 后,MAX1232的RESET输出低电平(0.4V 或更低);随着Vcc的升高, RESET引脚保持低电平;当Vcc超过RESET的门限(4.50V或4.75V)后,MAX706P内部启动一个200ms的定时器,也就是说,在Vcc保持高于RESET门限后,RESET引脚将输出200ms的高电平脉冲来对系统复位。同样,在掉电时,当Vcc低于RESET门限,RESET引脚输出高电平,这样可以保证电源电压波动时,通过复位微处理器使其工作状态正常。 “看门狗”电路可以检测微处理器的软件运行情况,软件正常运行时,通过软件控制单片机通过WDI对MAX706进行“喂狗”操作。如果微处理器在600ms内不能正常进行“喂狗”操作,也就是说单片机在600ms内没有去改变WDI引脚的输入电平状态,RESET将输出高电平,对CPU进行复位。这样,在程序“跑飞”的情况下,由于不能及时“喂狗”,RAX706就自动对系统复位,从而保证系统正常可靠的运行。2、电源监测该模块完成PFI输入端的电压监测,当其输入小于1.25 V时,PFO输出低电平。因此电源电压监测可用于电源电压失效预告警。在本记录仪中,单片机允许的供电电压最低是4.5V ,因此通过外部分压电阻,将告警门限定在高于4.5V 的某个值(4.6V),将PFO输出接到单片机的外部中断INTO,这样,在供电电压有异常波动的情况下,单片机可以及时的获得这种信息,从而将重要的现场信息进行保存。由图电阻分压原理图可以得到分压计算公式:。在本记录仪中,要求当U=4.6V时,应该有U1.25V。根据公式计算可得,当选择R1=5.36K,R2 =2K时能够满足本记录仪的要求。电源电压监测部分分压电阻的精度最好不低于1%,因为这样能够较好的保证分压精度。可以采用1%精度的金属膜电阻或更高精度等级的电阻。3.5 CPU的IO扩展虽然P89C51RD2拥有1K RAM,但是无法满足记录仪的需求,该记录仪使用FM1808作为外部RAM。另外由于该记录仪使用的器件比较多,而P89C51RD2仅拥有32个I/O口,显然无法直接将所有器件全部挂载在CPU的I/O口上,需要进行I/O口扩展。CPU扩展电路图如图3.10所示。该记录仪中将各个器件分配一定的地址,方便CPU的读写。地址的分配如表3.2。器件RAMLCD573A573B574A574BSL811地址范围0x0000-0x1FFF0x2000-0x3FFF0x4000-0x5FFF0x6000-0x7FFF0x8000-0x9FFF0xA000-0xBFFF0xC000-0xDFFF表3.2 地址的分配表图3.10 CPU的IO扩展3.6 数据存储模块3.6.1 存储需求分析汽车行驶记录仪的主要功能就是记录和长期存储车辆行驶的状态数据,因此本记录仪需要存储的数据量比较大,记录仪对存储的实时性和可靠性要求也比较高1。1、疑点数据的存储需求国标中要求:记录仪应能以不大于0.2s的时间间隔持续记录并存储停车前20秒实时时间对应的车辆行驶速度及车辆制动状态信号、记录次数至少为10次。其中需要存储的实时数据至少应该包含以下信息。l 时间 (包括年、月、日、时、分和秒),需要6个字节。l 司机编号,2个字节。l 速度,一个字节。测量范围是:0km/h-220km/h,测量分辨率等于l km/h。本记录仪中采用1个字节表示速度数据。l 车辆行驶状态数据,占用1个字节的存储空间。考虑到时间仅能精确到秒,所以不需要每次都记录,每5次(也就是1秒钟)记录一次时间就可以了。由此可以得出疑点数据的格式如表3.3所示,每秒数据需要8个字节来表示。序号1234合计项目名称时间司机编号速度车辆状态数据长度(字节)621*51*518表3.3数据格式已经确定,可以计算出每一条实时数据所需要的数据空间(考虑到系统的可靠性,存储28秒实时数据):2818=450(字节)又知:记录次数至少为10次,本记录仪中设计一定的余量,将记录次数提高到20次,从而提高产品的竞争力。因此可得,实时数据总共需要的存储空间为:45020=9000(字节)=9k(字节)2、车辆行驶数据的存储需求汽车行驶记录仪标准中规定。记录仪应能以不大于1分钟的时间间隔持续记录并存储车辆在最近360小时内的行驶状态数据,该行驶状态数据为车辆在行驶过程中与实时时间相对应的每分钟间隔内的平均行驶速度。速度的单位为:km/h,测量范围为:0km/h-220km/h,分辨率等于或优于lkm/h。在本记录仪中,需要存储的行驶数据包含以下几组信息:l 时间(包括:年、月、日、时、分),共5个字节;l 速度,1个字节,分辨率为lkm/h;l 驾驶员代码,3字节。从而可得每一分钟需要记录的数据为9字节。本记录仪中,采用优于国家标准的数据记录方式,总共存储最近400小时内的行驶状态数据,因此需要的存储空间为:400609=216000(字节)=210k(字节)。另外,还要存储索引信息、车辆特征系数等信息,因此预计总的数据量将会有500k字节。3.6.2 存储器的选择记录仪不仅要有较大的存储空间,并且要求能够有较快的存取速度,掉电情况下能够对数据进行保存。因此存储器的选择非常重要。对于大容量的非易失性存储器,通常采用EEPROM或Flash型存储器,它们不仅可以在掉电的情况下不会丢失所保存的数据,并且可改写的次数也很大,价格低廉,其中Flash型器件的擦写速度更快,可擦写次数也比EEPROM高。因此本记录仪中Flash型存储器。Flash存储器有并行接口方式、SPI接口方式和I2C接口方式三种。并行接口方式的Flash存储器将占用过多的单片机I/0引脚,而本记录仪中,I/0的资源非常紧张,因此不适合采用;I2C接口的Flash存储器只需要两个I/0引脚就可以实现访问,但是其访问速度比较慢(400Kbps);SPI总线接口的Flash存储器,需要4个I/0引脚,其访问的速度可达2Mbps,比较适合于本记录仪的应用。因此本记录仪采用ATMEL公司的Flash型存储器AT45DB041作为大规模数据存储单元,该单元最多能够存放4M字节数据,肯定能够满足记录仪的存储需求。为了保证所有采集的数据能够及时的存储,仅仅使用Flash存储器是不行的,因为它的擦写速度比较慢,不能按字节进行擦写操作。在记录仪掉电或单片机任务繁忙的情况下,会造成车辆行驶信息不能及时的存储。因此,需要扩展一个快速的RAM器件作为数据缓存,并且该缓存在掉电的情况下数据不会丢失。这样,单片机就可以将采集的数据及时保存在缓存中,在空闲周期内,将成块的车辆行驶数据转存到Flash存储器中,从而充分保证记录仪的可靠性。非易失性RAM主要有以下三种实现方式。l 普通静态RAM加电池供电。该种方案,相对比较便宜,但是要考虑电池充放电电路、同时要保证电池电量可靠、安装稳定牢固等因素,使得系统复杂度增大、可靠性降低。因此对于工作环境恶劣、可靠性要求高的记录仪,不宜采用此方案。l 内部带锂电的非易失性RAM。该种RAM可靠性高、访问速度快,但是价格昂贵。1K字节需要15元左右。如果采用这种类型的RAM,系统的成本将会增大很多。l 新型的非易失性RAM铁电存储器。该存储器是一种新型的存储器件,其访问速度等同于普通的静态RAM.掉电数据不会丢失,并且价格比较便宜,通常为同容量普通静态RAM价格的两倍左右,工作可靠、电路设计简单,非常适合在本记录仪中采用。因此,本记录仪中采用4M数据闪存AT45DB041和铁电存储器FM1808共同构成数据存储单元,实现数据的存储。3.6.3 铁电存储器FM1808介绍和应用电路设计61、铁电存储器FM1808的特性和优势铁电存贮器(FRAM)的核心技术是铁电晶体材料,这一特殊材料使得铁电存贮产品同时拥有随机存取记忆体(RAM)和非易失性存贮产品的特性。铁电记忆体不需要定时刷新,能在断电情况下保存数据。铁电记忆体(FRAM)拥有高速读写,超低功耗,和无限次写入等特性。这些特性使得FM1808很适合应用在汽车行驶记录仪,这种要求以字节宽度进行快速频繁写操作的非易失性应用场合,器件可以保证工作在记录仪要求的温度范围(-40+85 )。2、铁电存储器FM1808与单片机的接口电路设计铁电存储器(FRAM)与SRAM之间的有细微差异,并口FRAM在芯片使能端(/CE)的下降沿锁存每个地址,这样就允许在每一次内存存取周期开始之后改变地址总线。因此每次内存存取都必须确保/CE产生一次由高到低的跃变,这是FRAM与SRAM时序唯一不同的地方。在铁电存储器FRAM中,片选/CE产生地址锁存脉冲具有双重作用,第一是锁存新地址,第二是在/CE为高电平时产生必要的内存预充电时间。为了实现每字节的内存访问,单片机在与FM1808接口的时候必须产生/CE的下降沿。其实现电路如图3.11所示。图3.11 FM1808电路图FM1808的地址空间为:0X0000-0X7FFF。对FM1808的访问与一般的SRAM相同,可以直接采用外部存储器访问指令来实现。3.6.4 数据闪存AT45DB041的电路设计和应用编程本记录仪设计中,采用4M字节的数据闪存AT45DB041作为数据存储器,用来实现车辆行驶数据的长期存储。AT45DB041是ATMEL公司推出的一款基于Flash技术的大容量数据存储器,采用2.7V -3.6V 供电;通过SPI总线进行数据的访问,其主要接口(SI,SCK,/CS,/RESET,/WP)允许直接5V TTL或COMS电平信号相联接,并且与之兼容;4M存储空间被划分成2048页,每一页含有264个字节数据;支持页擦写和段擦写:有两个264字节的SRAM数据缓存。AT45DB041的应用非常灵活,数据访问迅速便捷,下面将具体介绍其硬件电路设计和应用编程7。2、 AT45DB041与单片机接口电路设计由于本记录仪使用的单片机没有SPI总线接口单元,因此,本记录仪中采用单片机的I/O引脚来对SPI总线时序进行模拟,从而实现对数据闪存的访问。单片机与AT45DB041的接口电路如图3.12所示。图3.12 AT45DB041电路图单片机的P1.0 为DataFlash提供片选,Pl.1提供SPI总线时钟信号,Pl.2作为SPI总线的数据输入端和输出端。/RESET(复位)直接接电源,利用芯片内部的上电复位电路来实现对芯片的复位。RDY/BUSY端悬空,本记录仪通过查询内部状态寄存器的值来判断芯片的状态。/WP端接电源,允许写。2、AT45DB041的存储单元分层结构AT45DB041的存储单元被分成三个等级:段(sectors)、块(blocks)和页(pages)。其分层结构如图3.13所示。AT45DB041允许对页(pages)进行写入操作,可以整块(blocks)或整页(pages)进行擦除操作。图3.13 AT45DB041的分层结构3、 AT45DB041的SPI总线访AT45DB041通过SPI总线进行访问,在访问的过程中,首先应该将片选端/CS置低,然后通过时钟信号SCK控制数据的输出或输入。在AT45DB041的SPI数据总线上,总是高位字节在前,低位字节在后。根据CLK的初始状态不同,AT45DB041的SPI总线访问满足两种工作模式:模式0和模式3。其中在模式0中,CLK的初始状态是低电平;在模式3中,CLK的初始状态是高电平。CLK的初始态与片选信号/CS有关,当/CS由高电平变为低电平的过程中,CLK是低电平,则说明其初始态是低电平;反之,初始态是高电平。本记录仪中,采用模拟总线时序的方式,因此,不属于工作模式0和工作模式3的范畴,而是由设计本身决定时序。SPI总线中,输出数据SO在时钟CLK的下降沿有效,输入数据SI在时钟CLK的上升沿有效。下面将具体介绍如何通过SPI总线实现数据的读取和写入操作。首先对与SPI总线操作有关的引脚进行定义。sbit CSDataFlash=P10 ; /*片选接口*/sbit SCKFlash=P11; /*时钟接口*/sbit SIDataFlash=P11 ; /*数据输入接口*/shit SODataFlash=P12; /*数据输出接口*/有关SPI总线操作的程序很多,这里将对经常用到的若干子程序做简要介绍。首先介绍如何通过SPI总线写入一个字节的数据。/功能:At45SendByte/描述:MCU向AT45发送一个字,数据从高位到低位/参数:发送的数据/返回:无/void At45SendByte(uchar demand) /数据从高位到低位uchar i=8;while(i-)ClrAt45Sck();DataFlashSo=(bit)(demand&0x80);/发送高字节SetbAt45Sck();demand=1;ClrAt45Sck();ClrAt45Sck();通过S PI总线读取数据的子程序。/功能:AtReceiveByte/描述:MCU从AT45读入一字节,数据从高位到低位/参数:/返回:无/uchar At45ReceiveByte(void) /数据从高位到低位uchar i=8;uchar ddata=0;SetbAt45So();/Set SO high to get input /ClrAt45Sck();while(i-) ClrAt45Sck();ddata=1; /数据从高位开始读取SetbAt45Sck(); /从高位开始 ddata|=SDA;ddata=1if(DataFlashSi)ddata|=0x01; ClrAt45Sck();ClrAt45Sck();/Set SCK lowreturn ddata;4、AT45DB041的访问操作对AT45DB041的访问包括:存储区读、数据缓冲区读、状态字读、块写、页写、页擦除、块擦除等命令。AT45DB041可实现对字节读操作,不支持单字节的写操作,只能对页进行写和擦除操作。下面将对部分常用命令做介绍。1) 状态寄存器读取操作l 命令功能:实现对状态寄存器的读取。l 命令字:命令字只有一个字节:0X57 l 执行过程首先选通AT45DB041,然后通过AT45DB041的SI引脚写入命令字(8位),紧跟着可以从AT45DB041的SO引脚读取状态寄存器的值。在本记录仪中,要通过读取状态寄存器来判断器件的工作状态和存储器好坏。状态寄存器的格式如下表3.4所示。BTT7BTT6BTT5BTT4BTT3BTT2BTT1BTT0RDY/BUSYCOMP0111表3.4 状态寄存器的格式RDY/BUSY:如果该位为0表明器件忙,将不能对其进行写入或擦除等操作;如果该位为1,对器件进行任何操作都是允许的。COMP:在比较操作中,用来标志缓冲区RAM中的数据和数据页中的数据是否相同。如果不相同,该位置1;否则置0。BIT5-BIT2:器件标志号。可以用读取该数据来判断AT45DB041的好坏。BIT1,BIT0:无关位,无意义。l 程序:bit At45ReadState(void).ActiveAt45();/Select At45At45SendByte(0x57);/opcodeSetbAt45Sck();/空一脉冲ClrAt45Sck();for(i=0;i255;i+)j=At45ReceiveByte();j&=0x80;if(j=0x80)ClrAt45Sck();InactiveAt45();/Inactive AT45 Flashreturn 1;ClrAt45Sck();InactiveAt45();/Inactive AT45 Flashreturn 0;2) 具有自动擦除功能的缓冲区写入页操作l 命令功能:芯片自动完成对指定页的擦除,同时自动将缓冲区1中的数据写入该页。l 命令字:命令字包括三部分(从高位到低位)分别是:命令代码(8位)、保留位(4位)、页地址(11位)、无关量(9位)。命令代码为:0X83;11位地址信息用来指明要读的页地址;传送最后9位无关量实现存储器初始化。l 执行过程:首先选通AT45DB041,然后通过AT45DB041的SI引脚写入命令字(32位),片选置高,结束操作。l 程序:bit DataFlashBufferToPage(uint page_num).ActiveAt45();/Select At45At45SendByte(0x83);/opcode/转化为要求的格式page_num8);At45SendByte(page_num);At45SendByte(0);ClrAt45Sck();InactiveAt45();/Inactive AT45 Flash3) 页读入缓冲区操作l 命令功能:实现将存储器中任意页数据读取到缓冲区1。l 命令字:命令字包括三部分(从高位到低位)分别是:命令代码(8位)、保留位(4位)、页地址(11位)、无关量(9位)。命令代码为:0X53;11位地址信息用来指明要读的页地址;传送最后9位无关量实现存储器初始化。l 执行过程:首先选通AT45DB041,然后通过AT45DB041的SI引脚写入命令字(32位),片选置高,结束操作。l 程序:bit DataFlashPageToBuffer(uint page_num).ActiveAt45();/Select At45At45SendByte(0x53);/opcode/转化为要求的格式page_num8);At45SendByte(page_num);At45SendByte(0);ClrAt45Sck();InactiveAt45();/Inactive AT45 Flash4) 缓冲区读操作l 命令功能:实现对存储器缓冲区1的访问,从缓冲区内某指定地址开始读取数据,如果读到该缓冲区末尾,会自动跳转到缓冲区首地址,继续读取数据,读取数据的范围限制在指定的缓冲区内。任意时刻片选信号从低到高的跳变,将会终止该操作。l 命令字:命令字包括三部分(从高位到低位)分别是:命令代码(8位)、无关量(15位)、地址(9位)、无关量(8位)。命令代码为:0X54;9位地址信息用来指明要读取缓冲区的首地址;传送最后8位无关量实现存储器的初始化。l 执行过程:首先选通AT45DB041,然后通过AT45DB041的SI 引脚写入命令字(40位),紧跟着可以从AT45DB041的SO引脚读取数据,当读取完需要的数据后,片选置高,结束操作。l 程序:bit DataFlashBufferToRam(uchar address,uint data_num).ActiveAt45();/Select At45At45SendByte(0x54);/opcode/转化为要求的格式At45SendByte(0);At45SendByte(0);At45SendByte(address); At45SendByte(0);SetbAt45Sck();/空一脉冲ClrAt45Sck(); for(i=0;i1)|0x10);/Sets the most significant 4 bits of the display RAM column addressWriteComToLcd(lcd_x3)&0x0F);/Sets the least significant 4 bits of the display RAM column addressfor(j=0;j1)|0x10);/Sets the most significant 4 bits of the display RAM column addressWriteComToLcd(lcd_x3)&0x0F);/Sets the least significant 4 bits of the display RAM column addressfor(j=0;j1)|0x10);/Sets the most significant 4 bits of the display RAM column addressWriteComToLcd(lcd_x3)&0x0F);/Sets the least significant 4 bits of the display RAM column addressfor(j=0;j1)|0x10);/Sets the most significant 4 bits of the display RAM column addressWriteComToLcd(lcd_x3)&0x0F);/Sets the least significant 4 bits of the display RAM column addressfor(j=0;j8;j+)WriteDataToLcd(CharacterBufferj+8);3.7.2 键盘为了方便用户操作该记录仪设置了16个按键,分别为10个数字键(0-9),6个控制键(向上、向下、确认、返回、取消、菜单)。数字键是为了输入司机编码和密码,控制键则是为了进行菜单操作。1、键盘电路与接口键盘硬件电路如图3.15所示。通过74HC164进行键盘扫描:使Q0-Q7依次变低,如果对应的按键按下,则KeyT0或KeyT1就会变低,再同判断KeyT0和KeyT1就可以断定是那个按键按下。图3.15 键盘硬件电路要识别按键是否真正被按下,需要消除机械触点抖动。因为,机械触点式按键闭合时不会迅速可靠的接通,断开时也不会立即断开,要经过一段时间的抖动才能稳定下来。为了保证动作绝对可靠,设计中通常需要引入消除抖动的方法,从而防止造成程序误动作。消除抖动的方法通常有三种。l 软件消除抖动。判断到有键按下后,延时约30ms再判,如果前后两次或三次读到的键值相同,说明按键有效。l 硬件消除抖动。用两个与非门构成一个双稳态电路。当触点闭合或断开时,如果触点产生抖动,双稳电路的状态也不会改变。l 利用键盘专用接口芯片(如8279)的自动消除按键抖动功能去抖动。本设计中,采用软件消除抖动,这样可以简化硬件电路的设计,节省记录仪的硬件成本;并且软件消除抖动不会占用CPU多少运行时间,因此对记录仪的运行效率没有实质性影响。3.7.3 声光提示声光提示的硬件电路及与CPU的接口如图3.16所示。仅使用3个指示灯(1个电源指示灯、2个自定义状态指示灯)1个蜂鸣器。通过74HC574来控制指示灯和蜂鸣器。图3.16 声光提示的硬件电路3.8 通信模块通信单元为记录仪提供了对外数据通信的接口,是实现记录仪数据输出和人机交互的重要手段。记录仪提供了USB总线和RS-232总线两种数据通信的接口,RS-232通信接口和USB总线接口都可以直接与PC相连提供数据传输,USB总线接口还可以对U盘进行读写,将记录数据写入U盘,方便数据的采集。下面将具体介绍两种接口的实现方式和应用电路的设计。3.8.1 RS232接口RS-232接口(又称 EIA RS-232-C)是目前最常用的一种串行通讯接口。本记录仪中使用DB9连接器,使用的引线为接受数据(RXD)、发出数据(TXD)和信号地线(SG),对应的引脚为2、3和5。在RS-232-C中任何一条信号线的电压均为负逻辑关系。即:逻辑“1”的电平在-5-15V;逻辑“0”的电平在+5+15V。噪声容限为2V,即要求接收器能识别低至+3V的信号作为逻辑“0”,高到-3V的信号作为逻辑“1”。高于15V或低于-15V的电压认为无意义,介于3V和-3V间的电压也无意义。单片机的串口是TTL电平,需要将TTL电平转换成RS232电平。RS232的接口芯片很多,最著名的是maxim公司的Max232。本记录仪使用的就是Max2328。电路如图3.17图3.17 Max232电路3.8.2 USB接口本记录仪需要既能通过USB接口与PC相连作为从机使用,又需要能通过USB接口对U盘进行操作作为主机使用。1、USB通信接口的方案选择USB控制芯片根据功能的不同可分为以下几类:l USB功能设备芯片USB功能设备芯片是负责实现功能设备与USB主机之间的物理数据传输的必须部件。通常这些USB芯片都含有多个驱动外围电路的I/O口,以实现USB设备的特殊功能。如Cypress公司的CY7C68013a,NetChip公司的Net2280和Philips公司的ISP1583。l USB主控制芯片。USB主控制器芯片负责实现主机与USB设备之间的物理数据传输,它是构成USB主机不可或缺的核心部件。另外有的芯片是主机/设备控制器芯片,如Cypress公司的SL811HS,TDI公司的TD242LP芯片和Philips公司的ISP1761。l USB集线器芯片USB集线器芯片负责将一个USB上行端口转化为多个下行端口,它是构成USB集线器不可或缺的核心部件。它所需要关心的性能指标与USB主机的要求不完全相同,支持的下行端口的数目是一个很重要的指标。如Cypress公司的CY7C66113,Alcor Micro公司的AU9254 A21和Philips公司的ISP1251。根据本记录仪的需要,选取Cypress公司的SL811HS主机/设备控制器芯片作为控制芯片。2、 SL811HS芯片特点10l 支持全速(full-speed)/低速(low-speed)数据传输l 可与微处理器、微控制器、DSP相连l 内部有一个256字节的RAM,可用做控制寄存器或数据缓冲器l 需要外接晶振来为整个SL811HS提供时钟l 集成的根Hub提供USB设备的连接点。3、 SL811HS电路设计SL811HS的电路设计如图3.18所示。下面介绍一下SL811HS的引脚:图3.18 SL811HS的电路l 电源供给引脚:共有6个引脚,分别是1个USB地线引脚USBGnd(9),2个地线引脚GND(20、30),2个3.3V电源输入引脚(15、41),1个USB收发器模块3.3V电源输入引脚(6)l CPU接口引脚:共12个引脚,分别是8个数据信号引脚D0-D7(21、27、28、29、31、32、33、39),1个写有效信号nWR(3),1个读有效信号nRD(45),1个片选信号nCS(4),1个地址指针信号A0(42)l 时钟模块引脚:共有3个引脚,分别是1个时钟输入引脚CLK/X1(16),1个输出引脚X2(17),1个始终模式选择引脚CM(5)l USB数据引脚:共有2个引脚,分别是连接USB数据信号D+的Data+(7)和连接USB数据信号D-的Data-(8)l 工作模式引脚:共有1个引脚,即用来选择SL811HS工作在主机或者设备状态的M/S(40)l 中断请求引脚:共有1个引脚即高电平有效的INTRQ(19)。l 系统复位引脚:共有1个引脚,即nRST(18)l DMA方式引脚:共有2个引脚,均用在SL811HS作为USB设备控制器的时候。1个是nDACK(43),用于确定是否采用外接DMA控制器;另一个是nDRQ(44),用于向外接的DMA控制器发送请求信号其中MS811进行主/从工作模式切换。虽然SL811HS可以使用12MHz晶振,但在实际使用过程中发现,如果晶振质量不太好,电路稳定性就会比较差,因此,使用这里使用48MHz晶振。4、 读写SL811HS寄存器程序由于SL811HS的外接总线的地址和数据信号是复用的,通过A0信号来区分地址和信号。因此CPU读取或写入SL811HS内存的时候首先要发送地址,然后发送数据。此外,由于SL811HS采用了地址自动增址的机制,因此,如果需要读取或写入连续地址内的数据时,只需要发送起始地址即可,然后每读取或写入一次数据,SL811HS就会自动将寻址地址加1。SL811HS的读数据时序如图3.19所示。根据时序的要求,读取数据前首先发送地址,程序如下:/*设定SL811HS内部寻址寄存器地址与SL811HS读函数配合使用,先设定要读取的地址然后再用读函数即可*/void SetHostAddress(char address)P0=address;/数据线发送地址,但此时地址还不会被SL811HS接受sl811_a0=0;/输入的是地址sl811_cs=0;/片选SL811HSsl811_wr=0;/写入sl811_wr=1;/关闭写信号sl811_rd=1;/关闭读信号sl811_cs=1;/关闭SL811HS片选图3.19 SL811HS的读信号时序地址发送完毕之后,SL811HS就接到了需要读取数据的内存单元地址。紧接着CPU就可以读取数据,程序如下:/*读SL811HS寄存器及内部RAM函数,无输入参数,输出即为读取的内容*/ucharSL811Read(void)uchar temp;sl811_a0=1;/输入的是数据sl811_cs=0;/片选SL811HSsl811_rd=0;/读取temp=P0;/读取数据sl811_rd=1;/关闭读信号sl811_cs=1;/关闭SL811HS片选return temp;/函数返回读取的SL811HS内存的数据SL811HS写数据时序如图3.20所示:写数据的函数实现的程序如下:/*参数host_write_address输入要写入数据的SL811HS内存的地址,write_constent位要写入的地址*/voidSL811Write(uchar host_write_address,uchar write_constent)P0=host_write_address;/准备需要发送的地址sl811_cs=0;/ 片选SL811HSsl811_a0=0;/ 输入的是地址sl811_wr=0;/写入/地址传输完毕后sl811_wr=1;/关闭写信号P0=write_constent;/准备好需要发送的数据sl811_a0=1;/ 输入的是数据sl811_wr=0;/写入/数据传输完毕sl811_wr=1;/关闭写如sl811_cs=1;/关闭片选信号图3.20 SL811HS的写信号时序有时候,单片机需要访问SL811HS的一块连续的内存单元,进行读取或者写入数据。这时仅利用上面实现的单字节的数据读取或写入函数就很累赘。基于这种考虑,设计了能够批量进行数据读/写的函数,程序如下:/*功能:HostBulkWrite描述:批量写函数参数:写入的起始地址,数据缓冲区和要写入的字节数返回:无*/void SL811BulkWrite(uchar addr,uchar * s,uchar c)if(c=0)return;while(c-)SL811Write(addr+,*s+);return;/*功能:HostBulkRead描述:批量读函数参数:起始地址,数据缓冲区和要写入的字节数返回:无*/void SL811BulkRead(uchar addr,uchar * s,uchar c)if(c4);/求出对应的Flash地址flash_address=(wei_code%16-1)*16; ZkFlashToRam(page_num,flash_address,0x10);Show1608(lcd_x,lcd_y);else/16*16字符page_num=(qu_code-1)*12+1+(wei_code-1)3);/求出对应的Flas地址/flash_address=(wei_code-1)%8)*32; ZkFlashToRam(page_num,flash_address,0x20);Show1616(lcd_x,lcd_y);4.2.4 主菜单的设计与实现记录仪的主界面和菜单是整个记录仪人机交互的基础,在设计的过程中力求界面美观、操作灵活方便、显示内容丰富。主界面要显示时间、速度、驾驶员代码等信息。当菜单键按下时,记录仪进入菜单操作程序,进行相关的处理。主界面程序流程如图4.5所示。图4.5 主界面程序流程主界面的显示格式为:第一行:驾驶员代码:XXXX第二行:汽车行驶速度:XXXKm/H第三行:里程:XXXX.XX公里第四行:时间: XX / XX / XX XX : XX记录仪的菜单分为两级,其中第一级共有三个条目,第二级共有14个条目,菜单的分层结构和功能如图4.6所示。下面将对各个菜单的功能做简要的说明。图4.6 菜单的分层结构1、近15分钟车速。显示自停车时刻起前推15分钟,车辆每分钟的平均速度。共15条记录分为4屏显示,每屏显示4条记录,通过上、下键进行翻页查询,按返回键,可以退出查询,返回到选择菜单。平均速度查询结果的显示格式为:11 点 3 0分 50km/h11 点 31 分52km/h11 点 32 分60km/h 2、疲劳驾驶明细。显示最近两个日历天的疲劳驾驶记录信息。每屏显示一条记录,最多有16条记录。显示格式如下:记录1:驾驶员编号:0025开始时间:2007/03/07 10:00结束时间:2007 /03/07 15:303、超速明细。显示最近存储的20条超速记录信息。每屏显示一条记录。显示格式如下:记录1:驾驶员编号:00252007/03/07 10:00(开始时间)2007/03/07 10:11(结束时间)最高时速:96km/h行驶距离:15Km4、里程明细。显示最近2日历天车辆行驶的距离。5、里程累计。显示从按照记录仪开始车辆行驶的距离。6、最后28秒明细。显示最近一次停车前28秒记录的实时数据。7、系统参数。显示车辆特征系数,传感系数,车辆号码8、司机信息。显示当前登录的驾驶员的信息,包括驾驶员代码,驾驶证号码,姓名。显示格式如下:0025号司机 萧峰驾驶证号码:XXXXXXXXXXXXXXXXXX9、查询时间。显示当前的时间。10、特征系数设定。显示格式如下原特征系数:XXX请输入特征系数:XXX 按确认写入11、传感系数设定。显示格式如下原传感系数:XXX请输入传感系数:XXX 按确认写入12、系统时间设定。显示修改的日期、时间按确认键后修改时钟芯片内的时间寄存器。13、司机密码修改。只能修改当前登录司机的密码。首先提示输入当前登录驾驶员的密码,验证通过后提示输入新密码,然后需要再次输入新密码,两次密码相同则修改密码成功,如果不同则提示保存原密码不变。14、司机信息修改。包括司机姓名,驾驶证号等。4.2.5 主程序的设计与实现主程序模块的内容包括:自检,实时数据缓冲区的转存,行驶数据缓冲区的转存,根据不同的串行中断请求标志向外发送数据。通过状态字和数据缓冲区的方式,实现中断服务程序和主程序之间的信息交互和运行控制,中断服务处理可以保证MCU有较好的实时处理能力,协调进行慢速、复杂的事务处理,保证应用程序整体高效、可靠的运行。记录仪如果自检不正常,则通过LCD显示工作异常的部件,并通过蜂鸣器报警,表示记录仪将不能正常工作。记录仪自检的内容有:日历时钟SD2301B,USB控制器和存储器。主机通过判断SD2301B的Test引脚来判断其电池是否枯竭,如果枯竭说明时钟有故障;通过读取USB控制器SL811HS状态寄存器IntStatus来判断USB控制器的好坏;读取数据闪存的器件状态字来判断其好坏。自检不正常,共有如下七种情况:1、 时钟不正常;2、 存储器工作不正常;3、 USB单元工作不正常;4、 时钟和存储器工作不正常;5、 时钟和USB单元工作不正常;6、 存储器和USB单元工作不正常;7、 时钟、存储器和USB单元工作不正常。4.2.6 串行通信程序设计与实现本记录仪为了获得较高的通讯效率,串行通信程序均采用9600bps的波特率。每帧10位,其中1个起始位,8个数据位,1个停止位。在9600bps时,每一位的传送时间T= 1/9600=0.1047ms。在本记录仪中,串口采用工作方式1,采用定时器/计数器T1作为波特率发生器,定时器T1工作在方式2,这时16位计数器被拆分成两个部分:TL1用作计数器,TH1用来保存计数初值。在程序初始化时,由软件赋予同样的初值。在操作的过程中,一旦计数溢出,将置位中断标志,并把TH1中的初值再装入TL1,从而进入新一轮的计数,如此循环重复不止。这种工作方式可以避免在程序中因重新装入初值而对定时精度的影响,非常适用于作为波特率发生器等需要产生相当精度的定时时间的应用场合。波特率的计算公式为:波特率(4.1)其中:SMOD为波特率加倍控制位;fosc为晶振频率;X为定时器1的THl装入初值。对于本记录仪而言,设置SMOD=0,晶振频率fosc =18.432MHz,因此通过式4.1,可以计算得到计数器的装入初值为:Z=251=0XFB。记录仪和外部计算机之间的通信协议,是汽车行驶记录仪国家标准(GB/T19056-2003)所定义的,见参考文献1。4.3 USB的设计与实现USB是英文Universal Serial Bus的缩写,中文含义是“通用串行总线”。在计算机外设和数据采集设备中被广泛的采用11。USB具有以下优点1213:l 即插即用:这是USB的易用性,支持热插拔和操作系统的自动配置。l 低功耗:USB是一套独特的电气层机制来保证其低功耗。l 可选择的多种速度模式:USB提供来3种速度模式:低速1.5Mbps、全速的12Mbps以及高速的480Mbps。l 完善的总线拓扑结构:USB菊花链式的星形总线结构,能够支持多达127个外设的同时连接,充分满足了外设的需求。l 低廉的价格。USB数据通信结构:l “包”,是USB最基本的数据单元。每一个包,基本上包含了一个完整的USB信息。包按照在整个USB数据传输中的作用不同,可以分为3类:令牌包,数据包和握手包。l 把包分解成更小的单元,叫做“域”。域又被分为7类:同步序列域、包标识域、地址域、端点域、帧号域、数据域、数据域和CRC校验域。l 以包为基础,USB定义了4种数据的传输类型:控制传输、中断传输、批量传输和同步传输。l 传输是一种比较笼统的叫法。传输通常要分成多个数据交换过程,也就是把数据分为多份,然后一次次地传输,直到所有的数据都发送完毕。这其中的每一次数据交换叫做“事务”。每种传输方式都是由多个事务来完成,每一笔事务由底层包组成。图4.7表示了域、包、事务和传输的关系。图4.7 域、包、事务和传输的关系本节将详细描述了本记录仪中USB通信模块的设计与实现。4.3.1 USB主机设计与实现在本记录仪中,以单片机和SL811HS为核心,通过实现USB设备枚举、Bulk_Only传输协议,FAT16文件结构等技术,把汽车行驶记录仪记录在大容量FLASH和铁电存储器中的车辆行驶各种状态信息读写到优盘上,以实现汽车行驶记录仪数据和PC主机快速交换,方便车辆信息管理。下面介绍利用SL811HS在汽车行驶记录仪中实现USB HOST 功能,对USB HOST中的关键技术USB设备枚举、Bulk_Only传输协议以及FAT16文件结构的实现做了较详细的说明。首先介绍一下SL811HS中几个常用的寄存器:l EP0Control/ EP1Control寄存器USB-A/USB-B Host控制器寄存器。具体结构如表4.6所示。76543210ReadWritePreambleData ToggleSOFISO保留DirectionEnableArm表4.6 EP0Control/ EP1Control寄存器Data Toggle:数据触发选择位。值为1:指示DATA1数据包;值为0:指示DATA0数据包。Direction:数据传输方向位。为1:数据从设备到主机;值为0:数据从主机到设备。Enable:数据传输允许位。值为1:允许端点的数据发送;值为0:忽略USB数据传输。Arm:数据发送指示位。值为1:允许数据发送;值为0:数据传输完成。l EP0Address/ EP1Address寄存器USB-A/USB-B Host基地址。该寄存器内存放的是USB读/写SL811HS存储缓冲区的地址指针。l EP0XferLen /EP1XferLen寄存器USB-A/USB-B Host基长度。该寄存器内存放的是SL811HS与设备之间传输的最大的包的尺寸。l EP0Status/EP1Status寄存器USB-A/USB-B Host PID、设备端点(写)/USB状态(读)。当读时,该寄存器指示了上一次发送或接收的包的相关信息。当写时,该寄存器内填入的内容代表来下一次发送的包的PID和相应的设备的接收端点号。l EP0Counter/ EP1Counter寄存器当读时,该寄存器指示了剩余的尚未发送的字节数。当写时,该寄存器中填入的则是主机希望进行通信的设备地址l CtrlReg寄存器控制寄存器。具体结构如表4.7所示。76543210ReadWrite保留SuspendUSB SpeedJ-K Status ForceUSB Engine Reset保留保留SOF Ena/Dis表4.7 CtrlReg寄存器Suspend:挂起模式允许位。值为1:允许挂起;值为0:禁止挂起。USB Speed:USB速度选择位。值为1:设置为全速模式;值为0:设置为低速模式。J-K State Force:USB数据线J-K状态强制设置位。此位与D3位配合使用USB Engine Reset:USB引擎复位设置位l IntEna寄存器中断允许寄存器。具体结构如表4.8所示。76543210ReadWrite-Device Detect/ResumeInserted/RemovedSOF Timer保留保留USB-BUSB-A表4.8 IntEna寄存器Device Detect/Resume:设备检测/继续位;Inserted/Removed:设备接入/移除中断允许位;SB-B:USB-B套机制的中断允许位;USB-A:USB-A套机制的中断允许位。USB主机程序主要包括以下几部分:1、 硬件接口程序。主要功能是对SL811HS内部的寄存器进行操作,在3.8.2节中作了详细的介绍。2、 SL811HS初始化程序。主要功能是将SL811HS设置为主机模式,清中断寄存器。代码如下:sl811_ms=0;/mastersl811_ack=1;/in host modesl811_cm=0;/48MHzRSTSL811();/Reset SL811HSSL811Write(CSOFcnt,0xAE);/MasterSL811Write(DATASet,0xe0);/SL811Write(IntEna,0x31);/Inserted/RemoveSL811Write(CtrlReg,0x01);/ +SOF EnaSL811Write(EP0Control,0x01);/ start generate SOF or EOPSL811Write(IntStatus,INT_CLEAR);/clear interrupt3、 USB的设置、输入和输出事务的实现程序。本记录仪中的USB主机系统只需支持USB的控制传输和批量传输。要实现这两种传输,就首先要完成相应的事务的程序设计。这里,用函数USBTransaction()来实现USB的事务。函数USBTransaction()将实现设置SETUP、输入IN和输出OUT这3种USB的事务。而这3种不同事务之间就需要通过令牌包阶段的PID来加以区分。函数USBTransaction()的输入参数有以下几个:l PID。l 端点号Endpoint。优盘一般具有3个端点:一个是端点0,用于处理控制传输;另一个是批量输出Bulk_OUT端点,该端点用于接收主机发来的批量数据,端点号由设备定义;还有一个就是批量输入Bulk_IN端点,用于给主机发送批量数据,其端点号也由设备定义。主机在对设备的枚举阶段,通过端点描述符来获取Bulk_OUT和Bulk_IN端点的端点号。程序需要把PID和Endpoint组合在一起后写入SL811HS的EP0Status寄存器。l 设备地址DeviceAddress。这个地址就是在设备的枚举阶段,由主机分配给设备的。程序将地址写入SL811HS的EP0Counter寄存器。l 发送/接收的数据长度Length。这个长度还需要和相应端点的最大包尺寸MaxPacketSize进行比较。如果Length小于MaxPacketSize,就说明需要发送或接收的数据长度比相应端点的最大包尺寸还小,因此,主机和该端点之间只要进行一次数据传输就可以实现数据的发送或接收。反之,如果Length大于MaxPacketSize,那么就需要将发送/接收的数据进行分割,第一批发送/接收的数据长度就是MaxPacketSize,剩下的数据就利用SL811HS的“乒乓”机制进行发送。最后需要把实际要发送的数据长度写入SL811HS的EP0XferLen寄存器中。l 发送/接收数据的缓冲区地址* pDataBuf。这个pDataBuf指向的就是CPU的内存单元RAM的地址。在准备好SL811HS的发送/接收缓冲区之后,就可以进行数据的收发了。这时就需要给SL811HS的控制器寄存器EP0Control发送命令字cmd来启动数据的发送或接收。不同的事务对应不同的cmd值,对应关系见表4.9所示。事务SETUPINOUTData0Data1Data0Data1cmd0x070x230x630x270x67表4.9在启动了数据包的发送/接收后,程序需要查询相关的寄存器(如IntStatus,EP0Status)来判断发送/接收完成情况。实现程序如下:if(PID=PID_SETUP)/SETUP包cmd=0x07;SL811BulkWrite(buffer0,pDataBuf,Length);/写入数据SL811Write(EP0Counter,DeviceAddress);/设备地址SL811Write(EP0Status,PID_SETUP+(Endpoint&0x0F);/SETUP,端口SL811Write(EP0XferLen,Length);/数据长度SL811Write(EP0Address,buffer0);/发送开始地址SL811Write(IntStatus,INT_CLEAR);/clear interruptSL811Write(EP0Control,cmd);/ OUT+Enable+Armfor(i=0;i50;i+)for(j=0;j255;j+)intr = SL811Read(IntStatus);if(intr & USB_A_DONE)break;result=SL811Read(EP0Status);/状态if(result=0x01)/成功return true;elseSL811Write(IntStatus,INT_CLEAR);/clear interrupt SL811Write(EP0Control,cmd);/ OUT+Enable+Arm return false;if(PID=PID_IN)/IN包if(PID=PID_OUT)/OUT包4、 USB的数据传输方式的实现。这里只介绍控制传输和批传输的实现。控制传输。函数ControlTransfer()来实现控制传输。控制传输包括3个步骤,即初始设置步骤、可选数据步骤、状态信息步骤。l 初始设置步骤的实现。任务就是要发送8字节的请求命令,因此只需调用一次USBTransaction()函数即可。输入的参数分别是:PID为PID_SETUP,Endpoint为0,DeviceAddress为分配的地址,Length为8,pDataBuf指向8字节的请求命令。l 可选数据步骤的实现。请求命令的wLength字段指明了需要交换的数据长度,当值为0时表示没有可选数据步骤。如果需要交换数据,则调用USBTransaction()函数。输入的参数分别是:PID为PID_IN或PID_OUT,Endpoint为0,DeviceAddress为分配的地址,Length为需要交换的数据长度,pDataBuf需要交换数据的地址。l 状态信息步骤的实现。在这个步骤中,主机发送控制传输的信息状态。调用USBTransaction()函数。输入的参数分别是:PID为PID_IN或PID_OUT,Endpoint为0,DeviceAddress为分配的地址,Length为0,pDataBuf需要交换数据的地址。实现程序如下:/*初始设置步骤:发送的令牌为PID_SETUP,端点号为端点0,设备地址为DeviceAddress,发送的数据长度为8字节,发送的内容即为相应的请求命令*/if(!USBTransaction(PID_SETUP,DeviceAddress,Endpoint,0x08,RequestCMD.aReqCMD)return false;/发生错误/*可选数据步骤:*/if(RequestCMD.ReqCMD.wLength)/需要可选数据步骤,发送/接受特定数据if(!(RequestCMD.ReqCMD.bmRequestType&0x80)/判断数据发送方向为主机发送给设备,即PID_OUT/调用USBTransaction函数发送pDataBuf_a缓冲区中的数据DataX=1;i=DataLength/ControlDataLength;if(i= =0)/一次可以发送完if(!USBTransaction(PID_OUT,DeviceAddress,Endpoint,DataLength,pDataBuf)return false;elsefor(j=0;ji;j+)if(!USBTransaction(PID_OUT,DeviceAddress,Endpoint,ControlDataLength,&pDataBufControlDataLength*j)return false;DataX=1;/状态信息步骤DataX=1;if(!USBTransaction(PID_IN,DeviceAddress,Endpoint,0,pDataBuf)return false;else return true;else /接受数据 批量传输。用函数BulkTransferIN()和BulkTransferOUT()分别实现批量输入传输和批量输出传输。批量传输的实现比较简单,仅相当于控制传输的可选数据步骤的实现。5、 实现标准的USB请求命令USB定义了11种标准的请求命令,用户也可以自行定义各种请求命令。这些命令就是基于控制传输实现的。因为上面已经建立了ControlTransfer()函数,因此这些请求命令函数的主要任务就是按格式填写需要发送的请求命令的内容,然后调用ControlTransfer()函数即可。这里使用到的USB请求命令有:获取描述符请求命令,设置设备地址请求命令,获取配置请求,设置配置请求等。设备请求命令的数据结构如下:struct RCMDucharbmRequestType;/请求命令类型ucharbRequest;/请求命令代码uintwValue;/命令信息uintwIndex;/索引信息uintwLength;/传输的数据大小;这里以获取描述符请求命令为例说明如何实现标准的USB请求命令。其程序如下:bit GetDescriptor(uint wValue,uint Length,uchar * pDataBuf)union REQUESTCMD idata RequestCMD;/建立该请求命令的结构RequestCMD.ReqCMD.bmRequestType=0x80;/填入该请求命令的内容RequestCMD.ReqCMD.bRequest=GET_DESCRIPTOR;RequestCMD.ReqCMD.wValue=wValue;RequestCMD.ReqCMD.wIndex=0;RequestCMD.ReqCMD.wLength=Length8,DescriptorBuffer); /获取端点描述符/分析端点描述符SetConfiguration(ConfigurationDescriptor.CfgDesc.bCV);/ 设置配置7、 用Bulk_Only传输协议来传输UFI子类命令14。主要实现获取设备信息,读取优盘容量,查询设备是否准备好,主机从存储介质中读取数据,主机往存储介质上写数据。USB执行的操作如图4.8所示。图4.8 USB执行操作过程CBW和CSW的数据结构参见参考文献14。实现程序如下:/安装CBW的数据结构写入相应的命令if(!BulkTransferOUT(DeviceAddress,EPBulkOUT,31,BulkCBW.aCbw)/写入CBWreturn false;if(!BulkTransferIN(DeviceAddress,EPBulkIN,0x24,DescriptorBuffer)/读取数据return false;if(!BulkTransferIN(DeviceAddress,EPBulkIN,13,BulkCSW.aCsw)/读取CSWreturn false;/分析CSW8、 对FAT文件系统进行操作15。主要实现初始化FAT文件系统,在目录区查找文件,标记簇使用标志,查找自由簇,查找文件数据的下一个簇,查找文件结束簇,创建文件,打开已存在的文件关闭打开的文件,在文件中写入数据,读取数据。具体实现如下:l 初始化FAT文件系统InitFAT16读取引导记录(DBR)并分析,获取磁盘结构信息。DBR在有些优盘是在0扇区,有些则不是,需要进行判断读取0扇区的数据进行判断。磁盘的结构信息主要包括:每扇区字节数,每簇的扇区数,FAT区地址,FAT区的个数,每个FAT区占的扇区数,根目录项数,根目录占的扇区数,根目录地址,数据区地址,可用的空间大小。UFI_Read10(0)/读取0扇区 if(DataBuffer510!=0x55)|(DataBuffer511!=0xAA)/结束标识错误 return false; if(DataBuffer0!=0xEB)|(DataBuffer1!=0x3C)/0扇区为MBD DiskType=DataBuffer450;/介质类型 DBRAddr=(uint)DataBuffer4558|(uint)DataBuffer454;/DBR区地址UFI_Read10(DBRAddr)/读取DBR区if(DataBuffer510!=0x55)|(DataBuffer511!=0xAA)/结束标识错误 return false; else/没有MBD区,0扇区DBR区 DiskType=0; DBRAddr=0;/分析DBR区SectorSize=(uint)DataBuffer128|(uint)DataBuffer11;/每扇区字节数ClusterSize=DataBuffer13;/每簇扇区数FATAddr=DBRAddr+(uint)DataBuffer158|(uint)DataBuffer14);/FAT区地址FATNum=DataBuffer16;/FAT的个数RootDirNum=(uint)DataBuffer188|(uint)DataBuffer17;/根目录项数RootDirSize=(RootDirNum5)/SectorSize;/根目录占的扇区数FATLength =(uint)DataBuffer238|(uint)DataBuffer22;/每个FAT区占的扇区数RootDirAddr=FATAddr+FATLength*FATNum;/根目录的地址FileDataAddr=RootDirAddr+RootDirSize;/数据区的地址ValidCapacity=USBCapacity-1-RootDirSize-FATLength*FATNum;/可用的大小l 在文件区查找文件FindFile输入文件名,如果找到则返回该文件在文件目录区中的位置。主要通过读取FAT区来进行判断。 for(i=RootDirAddr;iRootDirAddr+RootDirSize;i+)UFI_Read10(i);/读取目录区for(j=0;j16;j+)if(DataBufferj*32=0)/如果位0,则没有目录被使用return false;k=strlen(pFileName);if(strncmp(pFileName,(char *)(DataBuffer+32*j),2)=0)& (strncmp(pExt,(char *)(DataBuffer+32*j+8),3)=0)/比较成功return (i4)+j);l 创建文件CreatFile输入文件名,如果该文件已经存在则返回失败信息,如果不存在则创建该文件。通过读取FAT区来找到空闲文件目录表项,填写文件信息,然后将文件信息保存到FAT区中,如果有备份FAT区,还需要修改备份FAT区。if(FileInfo.Open)/已有文件打开return false;for(i=RootDirAddr;iFileDataAddr;i+)UFI_Read10(i);/读取FAT区for(j=0;j16;j+)/找到一个空闲文件目录表项if(DataBufferj*32=0xE5)|(DataBufferj*32=0x00)k=FindFreeCluster();/查找自由簇if(k=0)return false;/将文件信息写入文件目录表项l 打开已经存在的文件OpenExistFile输入文件名,如果文件存在返回文件的信息,如果文件不存在返回空值。通过读取FAT区获得文件信息usTemp=FindFile(pFileName,pFileExt);/找到该文件if(usTemp=0)return false;/找到了所在的扇区和目录项FileInfo.DirInfo=usTemp;strcpy(char *)(FileInfo.FileName),pFileName);strcpy(char *)(FileInfo.FileExt),pFileExt);usTemp&=0x0F;/获取文件开始簇FileInfo.FirstCluster=DataBufferusTemp*32+27;FileInfo.FirstCluster9);/指向最后一个扇区UFI_Read10(usSector);/获取可利于的长度usTemp=SectorSize-(usCurSectorByte&0x1FF);if(LenusTemp)/本扇区可以写下/写入本扇区else/写入/未写完while(usCurPosLen)/申请新扇区,写入/已写完,修改文件信息FileInfo.FileSize+=Len;/修改长度/最后一页标志if(usCurCluster!=FileInfo.CurCluster)if(!MarkCluster(usCurCluster,0xFFFF)return false;FileInfo.CurCluster=usCurCluster;SaveDirInfo();/保存文件信息l 关闭已打开文件CloseFile只需要将文件信息清空即可。FileInfo.Open=false;FileInfo.FileSize=0;FileInfo.DirInfo=0;FileInfo.FirstCluster=0;FileInfo.CurCluster=0;一旦有优盘插入,本记录仪就会对其进行枚举,如果配置成功,就会创建一个文件,并将记录仪中的数据写入该文件。4.3.2 USB从机设计与实现本记录仪除了提供控制端点0外,还提供端点1和端点2,分别作为批量传输的IN和OUT端点,通过端点1进行命令字的读写(命令字不超过16字节),通过端点2进行数据的读写(缓冲区64字节),这样的分工方式,可以将大块数据的传输和小块命令的传输分离,因此能够更好利用总线的效率,获得较高的传输速率16。数据的通信协议同样遵循参考文献1中的格式。USB设备程序主要包括以下几部分:1、 硬件接口程序。主要功能是对SL811HS内部的寄存器进行操作,在3.8.2节中作了详细的介绍。2、 SL811HS初始化程序。将SL811HS设置为从机模式,清中断寄存器。实现程序如下:sl811_ms=1;/slavesl811_ack=0;/in slave modesl811_cm=0;/48MHzSL811Write(IntEna,0x63);/ enable SOF, EP0, EP1, USB Reset interruptsSL811Write(IntStatus,0xFF);/ clear all interruptsEP0A_OUT_Arm(EP0_LEN); / ready to receive from host3、 端点的数据读/写处理程序。输入有3个参数:l 需要读写的数据地址pDatal 需要发送的数据长度DataLengthl 需要发送的数据端点号Endpoint端点的读写程序直接从相应端点的数据寄存器中读写数据。SL811HS在接收到主机发送来的数据之后就会产生中断,进而在中断状态寄存器IntStatus中指明产生了哪种类型的中断。比如端点0接收到主机发来的数据之后,SL811HS中IntStatus便指示发生了端点0的数据接收中断,而且SL811的硬件会自动处理接收到的数据包,分析出包的长度存储在EP0Counter中。程序在读取了相关寄存器后,便能判定那个端点需要接收数据,数据长度有多大等信息。进而
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:汽车行驶状态记录仪的研究与实现
链接地址:https://www.renrendoc.com/p-55749060.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!