<?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=137 </link><title>TMS320F206与CPU卡通信协议的优化</title><author>joy</author><pubDate>2009/11/30 12:24:52</pubDate><description><![CDATA[<p align="left"><strong>1 硬件电路</strong></p>
<p align="left">&nbsp;&nbsp;&nbsp; TMS320F206(简称F206)有1个通用输入引脚BIOS和1个通用输出引脚XF，此外还有IO0、IO1、IO2和IO3引脚，分别对应I／O状态寄存器的IO0～IO3。这4个引脚通过异步串行口寄存器(ASPCR)和I／O状态寄存器(IOSR)实现软件可控，可被单独配置成输入或输出。本文中使用IO0作为CPU卡(江苏意源公司iCos／Mil v1．0)的复位引脚，IO2作为CPU卡的I／O(输入／输出)引脚，电路图如图1所示。</p>
<p align="center"><img border="0" src="/uploadfile/DSP/uploadfile/200911/20091119102915933.jpg" width="400" alt="" /></p>
<p><strong>2 软件实现</strong></p>
<p>&nbsp;&nbsp;&nbsp; 异步串行通信，传输协议bit流为：1位宽的低电平为起始位，8位宽的数据位，1位校验位，以及1位高电平的停止位。软件实现时，通过配置异步串行口寄存器(AS-PCR)和I／O状态寄存器(IOSR)，并使用定时器功能，完成F206与CPU卡之间数据的发送与接收。</p>
<p>2．1 数据发送</p>
<p>&nbsp;&nbsp;&nbsp; F206发送数据时，将IO2配置成输出状态，然后启动定时器，按照设置的波特率，分别将发送的数据按字节(8位)加上起始位、校验位和停止位发送给CPU卡的IO2口。</p>
<p align="left">&nbsp;&nbsp;&nbsp; 数据发送子程序为：<br />
<br />
<img border="0" src="/uploadfile/DSP/uploadfile/200911/20091119102915506.jpg" width="400" alt="" /></p>
<p align="left">2．2 数据接收</p>
<p align="left">&nbsp;&nbsp;&nbsp; 接收数据一般采用软件轮询的方式实现。数据接收子程序为：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img border="0" src="/uploadfile/DSP/uploadfile/200911/20091119102916434.jpg" width="400" alt="" /></p>
<p align="left">2．3 定时器设置</p>
<p align="left">&nbsp;&nbsp;&nbsp; 定时器中断频率由TDDR(定时器divide-down寄存器，定时计数寄存器TIM的低4位)和定时周期寄存器PRD共同确定。当两者都为0时，定时器中断频率为(CLKOUT1rate)／2；两者不全为0时，由如下公式确定：<br />
<br />
<img style="width: 370px" border="0" src="/uploadfile/DSP/uploadfile/200911/20091119102917235.jpg" width="370" height="115" alt="" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; 举例：为了实现9 600 bps的有效传输速率，实际传输速率(额外增加1位起始位、1位校验位、1位停止位)应该为：</p>
<p align="left">&nbsp;&nbsp;&nbsp; 9 600 bps&divide;8&times;(8+1+1+1)=13 200 bps</p>
<p align="left">&nbsp;&nbsp;&nbsp; 故在晶振频率为20 MHz的条件下，PRD=20&times;106／13200-1=1514。</p>
<p align="left">&nbsp;&nbsp;&nbsp; 此时，将PRD设置为1514，每两次定时器中断的时间间隔即为1位数据的保持时问。一般来说，读取的时机靠近位宽的中间位置，读取的数据比较可靠和稳定，如图2所示。</p>
<p align="center"><img border="0" src="/uploadfile/DSP/uploadfile/200911/20091119102917895.jpg" width="400" alt="" /></p>
<p align="left"><strong>3 软件改进</strong></p>
<p align="left">&nbsp;&nbsp;&nbsp; 图2中，如果读取的起始位的位置正好处在起始位的开始，此时就会出现将起始位的末尾误判为第1位；或者读取的起始位的位置处在起始位的末尾，将可能丢失数据的第1位，都会导致读取数据出错，如图3所示。</p>
<p align="center"><img border="0" src="/uploadfile/DSP/uploadfile/200911/20091119102917414.jpg" width="400" alt="" /></p>
<p align="left">&nbsp;&nbsp;&nbsp; 为了降低读取数据出错的概率，将起始位的判断周期定为位宽的1／3，并在检测到起始位后，继续等待1／3位宽(再等待一个定时中断)，对起始位进行确认(读取的值为0)。此时才认定是一个正常的起始位，将定时周期修改为正常的位宽。此后每个定时器中断可以正确读取1位的数据，且保证了读取的时机处在1／3～2／3位宽的中间部分，如图4所示。</p>
<p align="center"><img border="0" src="/uploadfile/DSP/uploadfile/200911/20091119102917342.jpg" width="400" alt="" /><br />
<br />
&nbsp;&nbsp;&nbsp; 此时，图3中出错的问题也得到解决，如图5所示。<br />
<img border="0" src="/uploadfile/DSP/uploadfile/200911/20091119102918244.jpg" width="400" alt="" /></p>
<p align="left">&nbsp;&nbsp;&nbsp; 此外，还解决了毛刺引起的起始位误判的问题。因为一个毛刺的持续时间不会延续1／3位宽的时间，否则该应用将因稳定性太差而不能得到实用。</p>
<p align="left"><strong>4 硬件改进</strong></p>
<p align="left">&nbsp;&nbsp;&nbsp; 除了单纯使用定时器实现外，还可以结合INT2中断实现起始位的确认，电路如图6所示。</p>
<p align="center"><img border="0" src="/uploadfile/DSP/uploadfile/200911/20091119102918468.jpg" width="400" alt="" /></p>
<p align="left">&nbsp;&nbsp;&nbsp; 此时，建议延后1／3或者1／2个位宽时间，再读取起始位的状态。若还是为低电平，则作为一个有效的起始位，关闭INT2中断，然后按照一个完整位宽的时问启动定时器，每次读取1位，完成接收1字节后，关闭定时器，开启INT2中断，启动下一个字节的接收流程。</p>
<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>
<div>&nbsp;</div>
<p>&nbsp;</p>]]></description></item></channel></rss>