<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 科伟奇电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=322 </link><title>一种基于CAN总线的DSP程序加载技术</title><author>billzhang</author><pubDate>2009/12/7 9:53:40</pubDate><description><![CDATA[<h6><span><font size="3">关键字：</font></span><a href="/qrs/search.php?searchtype=keywords&amp;keywords=+&amp;search=1" target="_blank"><font color="#0033cc" size="2"> </font></a></h6>
摘要：为灵活方便地调试磁悬浮列车上众多基于ＤＳＰ芯片的控制系统，介绍了一种基于ＣＡＮ总线的ＤＳＰ程序加载技术。该技术使对ＤＳＰ芯片程序的加载可以脱离仿真器而直接受控于列车的主控机。该技术可靠性高、使用灵活方便，具有很强的实用性。 关键词：CAN总线 单片机 DSP HPI ISA 磁悬浮列车上有很多基于ＤＳＰ芯片的模块和系统。目前， <img border="0" src="/info/images/aet/200311/10a.gif" alt="" /> ＤＳＰ芯片程序的加载与运行都主要依赖于仿真器，而ＤＳＰ仿真器价格高、体积大，这使得磁悬浮列车系统的调试很不灵活方便；且这些基于ＤＳＰ芯片的系统一旦脱离仿真器就只能运行事前载入的单一的程序，也使系统的灵活性受到了很大的限制。 本文研究了ＤＳＰ芯片程序加载的基本原理，并根据这些原理，基于ＣＡＮ总线，实现了ＤＳＰ芯片程序的受控加载，使得ＤＳＰ芯片程序的加载与启动可直接受控于上位主控机。由于主控机的灵活性很大，磁悬浮列车系统在调试时就可根据需要对其上各个控制模块的主控ＤＳＰ芯片加载不同的程序，控制它的启动运行，非常方便灵活。 １ ＣＡＮ总线的特点及工作原理 ＣＡＮＣｏｎｔｒｏｌ Ａｒｅａ Ｎｅｔｗｏｒｋ，即控制器局域网总线是一种有效支持分布式控制或定时控制的串行通讯网络它以半双工的方式工作一个节点发送信息多个节点接收信息实现了全分布式多机系统提高了数据在网络中传输的可靠性。其结构形式如图１所示。ＣＡＮ总线的信息存取利用了广播式的存取工作方式信息可以在任何时候由任何节点发送到空闲的总线上每个节点的ＣＡＮ总线接口必须接收总线上出现的所有信息因此各节点都设置有一个接收寄存器该寄存器接收信息然后根据信息标文符决定是否读取信息包中的数据以判断是否使用这一信息。 ＣＡＮ总线的特点是以通信数据块编码代替传统的地址编码ＣＡＮ总线面向的是数据而不是节点这种方式的优点是可使网络内的节点个数在理论上不受限制加入或减少设备不影响整个系统的工作。基于ＣＡＮ总线的各种系统可以根据用户需要任意改变节点数量。ＣＡＮ总线收发数据的长度最多为８个字节因而不存在占线时间问题可以保证通信的实时性通信速率最高可达１Ｍｂ／ｓ距离为４０ｍ最远可达１０ｋｍ速率为５ｋｂ／ｓ。对通信介质的要求较低可以是光纤或同轴电缆甚至双绞线。 <img border="0" src="/info/images/aet/200311/10b.gif" alt="" /> ２ ＤＳＰ芯片的程序加载与运行原理 在本项技术中，ＤＳＰ的程序加载与启动运行是通过对其ＨＰＩ ８位并行口的操作实现的。下面先简单介绍一下ＤＳＰ的ＨＰＩ ８位并行口以及如何对它进行读写操作，然后介绍本文研究的这种ＤＳＰ程序加载技术。 ２．１ ＤＳＰ芯片的并口（ＨＰＩ）简介 ＨＰＩ并行口的读写操作主要由ＤＳＰ的三个１６位寄存器控制，它们分别是：ＨＰＩＣＨＰＩ Ｃｏｎｔｒｏｌ Ｒｅｇｉｓｔｅｒ，控制寄存器、ＨＰＩＤＨＰＩ Ｄａｔａ Ｒｅｇｉｓｔｅｒ，数据寄存器、ＨＰＩＡＨＰＩ Ａｄｒｅｓｓ Ｒｅｇｉｓｔｅｒ，地址寄存器。写ＨＰＩＣ寄存器控制ＨＰＩ并口的读写方式以及数据高低字节的读写顺序等；写ＨＰＩＡ寄存器控制写入或读出数据的具体地址（自增模式下２为数据写入／读出时的初始地址）；从ＨＰＩＤ直接写入／读出数据。 <img border="0" src="/info/images/aet/200311/10c.gif" alt="" /> ＨＰＩ有两种读写方式：普通模式下的读写按照ＨＰＩＡ的地址将ＨＰＩＤ的数据写入内存或将该地址的数据读入ＨＰＩＤ；自增模式下ＨＰＩＡ则是首地址，每次读或写操作后它都会自动指向下一个待读写的地址。 ２．２ ＤＳＰ芯片的程序加载与启动 由ＣＣＳ编译器生成的ＤＳＰ可执行文件是一种．ｏｕｔ文件。本方法中首先调用ＴＩ公司提供的ｈｅｘ５００．ｅｘｅ程序，将其转换为．ｈｅｘ文件３，这种．ｈｅｘ文件的组织结构具体如下： 它由一个一个的块（ｂｌｏｃｋ）组成，每一个块的第一个字节表示当前块包含的待加载的有效数据的长度，第二、第三个字节表示这些有效数据写入ＤＳＰ内存时的首地址，从第五个字节开始是待写入ＤＳＰ内存的有效数据（第四个字节通常为０ｘ００，是无效数据），超出当前有效数据长度的数据不需要处理。需要注意的是，文件的结尾（也就是最后一个块）的第一个字节的数据是０，表示当前块为文件的结尾，其后的任何数据都是无效数据。 知道这种．ｈｅｘ文件的组织结构后，就可以分离出其中的有效数据，然后就可将这些有效数据写入ＤＳＰ的内存。本技术是通过ＤＳＰ的ＨＰＩ口来完成写操作的。具体如下： 首先对ＤＳＰ复位，清除原来的数据；然后在单片机的控制下从．ｈｅｘ文件读出每次写入的初始地址，从这些初始地址开始不断地将有效数据写入ＤＳＰ的内存；写操作完成后，向ＤＳＰ的内存地址０ｘ００７ｆ写数据０ｘ８０００，程序即启动，开始执行。 <img border="0" src="/info/images/aet/200311/10d.gif" alt="" /> ３ 系统的组成 系统组成框图如图２所示。 <img border="0" src="/info/images/aet/200311/10e.gif" alt="" /> ＩＳＡ插卡通过ＩＳＡ插槽与ＰＣ机（即相当于磁悬浮系统上的主控机）连接，受ＰＣ机的控制，接收来自ＰＣ机的数据，向ＰＣ机转发收到的数据。插卡上有ＳＪＡ１０００芯片，通过它与ＰＣＢ板上的ＳＪＡ１０００实现数据交换。ＰＣＢ板上的ＳＪＡ１０００的数据／地址信号线与单片机的Ｐ０并口相连，同时Ｐ０并口也与ＤＳＰ的ＨＰＩ并口数据线ＨＤ０～７相连。在单片机的控制下，ＳＪＡ１０００接收来自ＰＣ机的数据，并将其通过Ｐ０并口发送给单片机，然后单片机再将这些数据通过ＨＰＩ发送给ＤＳＰ。 ４ 系统的实现 ４．１ 硬件实现 根据系统组成框图，各个具体模块的硬件实现如图３、图４、图５所示。 图３为单片机的接口电路，并口Ｐ０与ＳＪＡ１０００的并行数据口Ｄ０～Ｄ７（如图４所示）及ＤＳＰ的ＨＰＩ口（如图５所示）相连，实现数据交换：ＳＪＡ１０００接收来自ＣＡＮ总线的数据，通过并行数据口Ｄ０～Ｄ７及Ｐ０口发送给单片机，单片机接收到数据并经过处理后又通过Ｐ０口和ＨＰＩ口转发给ＤＳＰ。 ＨＢＩＬ、ＨＣＴ０、ＣＨＴ１、ＨＲ／Ｗ为ＨＰＩ口的控制信号２，故ＨＰＩ的读写等操作都受控于单片机。 ＣＳＣＡＮ为ＳＪＡ１０００的选通信号，／ＲＳＴ为ＳＪＡ１０００与ＤＳＰ的复位信号；ＲＤ、ＷＲ分别为读写控制信号。 ４．２ 软件实现 ＰＣ机程序负责对．ｈｅｘ文件的分析，并根据分析结果，通过ＳＪＡ１０００，将每一个块的&ldquo;头部&rdquo;和有效数据有区别地向ＣＡＮ总线上发送，直到遇到文件结束符为止。 单片机控制程序负责接收从ＳＪＡ１０００上传的ＣＡＮ总线上的数据，分析数据的性质（即该帧数据是&ldquo;头部&rdquo;还是有效数据），然后通过ＤＳＰ芯片的ＨＰＩ并行口将有效数据正确地写入相应的内存地址。 本文研究的这项技术提供了一种简单易行、成本低廉的ＤＳＰ程序加载方法。这项技术具有高度的可靠性、灵活性和实用性。此项技术用于磁悬浮列车这样一个复杂的ＤＣＳ系统后，能够很好地控制列车上众多基于ＤＳＰ芯片的系统的程序加载，并方便地对它们进行调试，使这些系统能根据不同的需要执行不同的程序，取得了很好的效果。目前上海引进的磁悬浮列车也采用了此项在线调试技术。
<script type="text/javascript">
function ImgZoom(Id)//重新设置图片大小 防止撑破表格
{
var w = $(Id).width;
var m = 650;
if(w < m){return;}
else{
var h = $(Id).height;
$(Id).height = parseInt(h*m/w);
$(Id).width = m;
}
}
window.onload = function()
{
var Imgs = $("content").getElementsByTagName("img");
var i=0;
for(;i<Imgs.length;i++)
{
ImgZoom(Imgs[i]);
}
}
       </script>]]></description></item></channel></rss>