<?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=358 </link><title>飞思卡尔MCF52259&amp;nbsp;FEC&amp;nbsp;demo程序</title><author>janeye</author><pubDate>2009-12-09 17:34:03</pubDate><description><![CDATA[好久没写总结了，游戏一天现在也没什么状态干活，就来总结下近来的成果吧。
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt">　　调</span><span style="color: black; font-size: 12pt">Coldfire</span><span style="color: black; font-size: 12pt">的以太网花的时间比较长，以前一直以为这块很难，有种畏惧心理，现在回过头来看看，要是不加协议的话跟</span><span style="color: black; font-size: 12pt">IIC</span><span style="color: black; font-size: 12pt">、</span><span style="color: black; font-size: 12pt">SPI</span><span style="color: black; font-size: 12pt">以及串口也相差不到哪去。最大的体会就是以太网的速度快的惊人，而且发送、接收数据很智能。</span></div>
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt">　　这次用的板子是我们自己做的开发板，主芯片</span><span style="color: black; font-size: 12pt">MCF52259</span><span style="color: black; font-size: 12pt">，标称最高主频</span><span style="color: black; font-size: 12pt">80M</span><span style="color: black; font-size: 12pt">。呵呵，试过把它倍频到</span><span style="color: black; font-size: 12pt">120M</span><span style="color: black; font-size: 12pt">，依然正常工作！哈哈，没想到我们玩的也可以超频吧。它只有</span><span style="color: black; font-size: 12pt">FEC</span><span style="color: black; font-size: 12pt">即以太网控制器，并没有收发器模块，所以要外扩收发器</span><span style="color: black; font-size: 12pt">PHY</span><span style="color: black; font-size: 12pt">，这里用的是国家半导体的</span><span style="color: black; font-size: 12pt">DP83848</span><span style="color: black; font-size: 12pt">，给我的感觉依然是智能。支持</span><span style="color: black; font-size: 12pt">10/100Mb/ps</span><span style="color: black; font-size: 12pt">，</span><span style="color: black; font-size: 12pt">MII&hellip;&hellip;</span><span style="color: black; font-size: 12pt">等等一大堆。</span></div>
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt">　　</span><span style="color: black; font-size: 12pt">FEC</span><span style="color: black; font-size: 12pt">的功能给我的感觉就是智能地控制数据的收与发。当有数据发送时，只要把数据存到缓冲区内并置位发送描述符的</span><span style="color: black; font-size: 12pt">Ready</span><span style="color: black; font-size: 12pt">位，并告诉</span><span style="color: black; font-size: 12pt">FEC</span><span style="color: black; font-size: 12pt">发送数据就绪它就自动完成数据的发送，结束后</span><span style="color: black; font-size: 12pt">FEC</span><span style="color: black; font-size: 12pt">会自动将发送描述符的</span><span style="color: black; font-size: 12pt">Ready</span><span style="color: black; font-size: 12pt">位清</span><span style="color: black; font-size: 12pt">0</span><span style="color: black; font-size: 12pt">；当有数据发过来时它会检查是否有接收描述符的</span><span style="color: black; font-size: 12pt">empty</span><span style="color: black; font-size: 12pt">位为</span><span style="color: black; font-size: 12pt">1</span><span style="color: black; font-size: 12pt">，要有的话就把数据放到那个描述符对就的接收缓冲区中，并将接收描述符的</span><span style="color: black; font-size: 12pt">empty</span><span style="color: black; font-size: 12pt">位清零，以告诉我们接收数据完成。这里有个其它通信方式没有的东西，那就是发送、接收描述符了，因为以太网的速度非常快，需要要的接收、发送缓冲区都很大，</span><span style="color: black; font-size: 12pt">FEC</span><span style="color: black; font-size: 12pt">模块并没有这么大的存储空间，因此使用芯片的</span><span style="color: black; font-size: 12pt">RAM</span><span style="color: black; font-size: 12pt">作为缓冲区。描述符的功能就是用来描述缓冲区的各种状态、数据长度以及缓冲区在</span><span style="color: black; font-size: 12pt">RAM</span><span style="color: black; font-size: 12pt">中的起始位置，</span><span style="color: black; font-size: 12pt">FEC</span><span style="color: black; font-size: 12pt">就通过描述符来控制数据传输。</span></div>
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt">　　就算不用协议，这块多多少少还是会涉及到一些协议方面的东西，要好好看资料了。而且后叙的工作还很多很多。</span></div>
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt">　　下面就是</span><span style="color: black; font-size: 12pt">FEC</span><span style="color: black; font-size: 12pt">初始化及，发送接收数据不用协议裸跑的代码：</span></div>
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt">/*<br />
*</span><span style="color: black; font-size: 12pt">初始化</span><span style="color: black; font-size: 12pt">FEC,</span><span style="color: black; font-size: 12pt">及接收发送描术符，系统ＭＡＣ等</span><span style="color: black; font-size: 12pt"><br />
*/<br />
void fec_init(uint8 mac_addr_fec[6])<br />
{<br />
&nbsp;MCF_FEC_ECR=MCF_FEC_ECR_RESET;<br />
&nbsp;while(MCF_FEC_ECR&amp;MCF_FEC_ECR_RESET)<br />
&nbsp;{<br />
&nbsp;&nbsp;;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;MCF_FEC_EIMR=MCF_FEC_EIMR_MASK_ALL;<br />
&nbsp;MCF_FEC_EIR=MCF_FEC_EIR_CLEAR_ALL;<br />
&nbsp;<br />
&nbsp;MCF_FEC_PALR=(uint32)(0<br />
&nbsp;&nbsp;&nbsp;&nbsp;|mac_addr_fec[0]&lt;&lt;24|mac_addr_fec[1]&lt;&lt;16<br />
&nbsp;&nbsp;&nbsp;&nbsp;|mac_addr_fec[2]&lt;&lt;8 |mac_addr_fec[3]);<br />
&nbsp;MCF_FEC_PAUR=(uint32)(0<br />
&nbsp;&nbsp;&nbsp;&nbsp;|mac_addr_fec[4]&lt;&lt;24|mac_addr_fec[5]&lt;&lt;16<br />
&nbsp;&nbsp;&nbsp;&nbsp;|MCF_FEC_PAUR_TYPE(0x8808));<br />
&nbsp;<br />
&nbsp;MCF_FEC_IALR=0;<br />
&nbsp;MCF_FEC_IAUR=0;<br />
&nbsp;MCF_FEC_GALR=0xFFFFFFFF;<br />
&nbsp;MCF_FEC_GAUR=0xFFFFFFFF;<br />
//Set receive buffer size&nbsp;<br />
&nbsp;MCF_FEC_EMRBR=MCF_FEC_EMRBR_R_BUF_SIZE(0x62);<br />
&nbsp;<br />
&nbsp;MCF_FEC_RCR=MCF_FEC_RCR_MAX_FL(1520)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |MCF_FEC_RCR_MII_MODE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |MCF_FEC_RCR_BC_REJ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //|MCF_FEC_RCR_PROM;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //|MCF_FEC_RCR_DRT;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;MCF_FEC_TCR=MCF_FEC_TCR_FDEN;<br />
&nbsp;<br />
//80/(16*2)=2.5M&nbsp;<br />
&nbsp;MCF_FEC_MSCR=MCF_FEC_MSCR_MII_SPEED(16);<br />
&nbsp;<br />
&nbsp;BD_init();<br />
&nbsp;MCF_FEC_ERDSR=(uint32)&amp;RxBDs[0];<br />
&nbsp;MCF_FEC_ETSDR=(uint32)&amp;TxBDs[0];<br />
&nbsp;<br />
&nbsp;MCF_FEC_MIBC=MCF_FEC_MIBC_MIB_DISABLE;<br />
&nbsp;MCF_FEC_ECR=MCF_FEC_ECR_ETHER_EN;<br />
&nbsp;MCF_FEC_RDAR=MCF_FEC_RDAR_R_DES_ACTIVE;<br />
&nbsp;MCF_FEC_TDAR=MCF_FEC_TDAR_X_DES_ACTIVE;<br />
}</span></div>
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt"><br />
/*<br />
*src_data[]</span><span style="color: black; font-size: 12pt">为要发送的数据</span><span style="color: black; font-size: 12pt"><br />
*destAdd[6]</span><span style="color: black; font-size: 12pt">为目的</span><span style="color: black; font-size: 12pt">MAC</span><span style="color: black; font-size: 12pt">地址</span><span style="color: black; font-size: 12pt"><br />
*srcAdd[6]</span><span style="color: black; font-size: 12pt">这本地</span><span style="color: black; font-size: 12pt">MAC</span><span style="color: black; font-size: 12pt">地址</span><span style="color: black; font-size: 12pt"><br />
*lenType</span><span style="color: black; font-size: 12pt">为数据长度加类型</span><span style="color: black; font-size: 12pt"><br />
*len</span><span style="color: black; font-size: 12pt">为是要发送的数据</span><span style="color: black; font-size: 12pt">Byte</span><span style="color: black; font-size: 12pt">数</span><span style="color: black; font-size: 12pt"><br />
*/<br />
int8 FEC_FrameSend(uint8 src_data[],uint8 destAdd[6],uint8 srcAdd[6],uint16 lenType,uint16 len)<br />
{<br />
//&nbsp;uint8 i;<br />
&nbsp;vuint8 * TxdataAd;<br />
&nbsp;txbd_pt++;<br />
&nbsp;if(txbd_pt&gt;=NUM_TXBDS)&nbsp;txbd_pt=0;<br />
&nbsp;while((TxBDs[txbd_pt].status&amp;MCF_FEC_TxBD_R)==MCF_FEC_TxBD_R)<br />
&nbsp;{<br />
&nbsp;&nbsp;txbd_pt++;<br />
&nbsp;&nbsp;if(txbd_pt&gt;=NUM_TXBDS)&nbsp;<br />
&nbsp;&nbsp;&nbsp;txbd_pt=0;<br />
&nbsp;}<br />
&nbsp;TxdataAd=TxBDs[txbd_pt].dataAD;<br />
&nbsp;<br />
&nbsp;memcpy((uint8*)TxdataAd,(uint8*)destAdd,6);<br />
&nbsp;TxdataAd+=6;<br />
&nbsp;memcpy((uint8*)TxdataAd,(uint8*)srcAdd,6);<br />
&nbsp;TxdataAd+=6;<br />
&nbsp;*TxdataAd++=(uint8)(lenType&gt;&gt;8);<br />
&nbsp;*TxdataAd++=(uint8)lenType;<br />
&nbsp;memcpy((void*)TxdataAd,(void*)src_data,len);<br />
&nbsp;TxBDs[txbd_pt].length=(uint16)(len+14);<br />
&nbsp;TxBDs[txbd_pt].status|=0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |MCF_FEC_TxBD_L<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |MCF_FEC_TxBD_TC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |MCF_FEC_TxBD_R;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;MCF_FEC_TDAR=MCF_FEC_TDAR_X_DES_ACTIVE;<br />
&nbsp;<br />
&nbsp;return 0;&nbsp;<br />
}</span></div>
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt">//</span><span style="color: black; font-size: 12pt">用查寻方式接收数据，接收到的数据放到</span><span style="color: black; font-size: 12pt">dest_data[]</span><span style="color: black; font-size: 12pt">中</span><span style="color: black; font-size: 12pt"><br />
int8 FEC_FrameReceive(uint8 dest_data[],uint16 *len)<br />
{<br />
&nbsp;vuint8* RxdataAd;<br />
&nbsp;rxbd_pt++;<br />
&nbsp;if(rxbd_pt&gt;=NUM_RXBDS)&nbsp;rxbd_pt=0;<br />
&nbsp;while((RxBDs[rxbd_pt].status&amp;MCF_FEC_RxBD_E)==MCF_FEC_RxBD_E)<br />
&nbsp;{<br />
&nbsp;&nbsp;rxbd_pt++;<br />
&nbsp;&nbsp;if(rxbd_pt&gt;=NUM_RXBDS) rxbd_pt=0;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;RxdataAd=RxBDs[rxbd_pt].dataAD;<br />
&nbsp;*len=RxBDs[rxbd_pt].length;<br />
&nbsp;<br />
&nbsp;memcpy((uint8*)dest_data,(uint8*)RxdataAd,*len);<br />
&nbsp;<br />
&nbsp;RxBDs[rxbd_pt].status|=MCF_FEC_RxBD_E;<br />
&nbsp;MCF_FEC_RDAR=MCF_FEC_RDAR_R_DES_ACTIVE;<br />
&nbsp;<br />
&nbsp;return 1;<br />
}</span></div>
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt">void BD_init(void)<br />
{<br />
&nbsp;uint8 i;<br />
&nbsp;<br />
&nbsp;RxBDs=(BD*)((uint32)(rxbd+16)&amp;0xFFFFFFF0);<br />
&nbsp;TxBDs=(BD*)((uint32)(txbd+16)&amp;0xFFFFFFF0);<br />
&nbsp;<br />
&nbsp;RxBuff=(uint8*)((uint32)(rxbuffer+16)&amp;0xFFFFFFF0);<br />
&nbsp;TxBuff=(uint8*)((uint32)(txbuffer+16)&amp;0xFFFFFFF0);<br />
&nbsp;<br />
&nbsp;for(i=0;i&lt;NUM_RXBDS;i++)<br />
&nbsp;{<br />
&nbsp;&nbsp;RxBDs[i].status=(0|MCF_FEC_RxBD_E);<br />
&nbsp;&nbsp;RxBDs[i].length=0;<br />
&nbsp;&nbsp;RxBDs[i].dataAD=&amp;RxBuff[i*RX_BUFF_SIZE];<br />
&nbsp;}<br />
&nbsp;RxBDs[NUM_RXBDS-1].status|=MCF_FEC_RxBD_W;<br />
&nbsp;<br />
&nbsp;for(i=0;i&lt;NUM_TXBDS;i++)<br />
&nbsp;{<br />
&nbsp;&nbsp;TxBDs[i].status=(0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|MCF_FEC_TxBD_L<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|MCF_FEC_TxBD_TC);<br />
&nbsp;&nbsp;TxBDs[i].length=0;<br />
&nbsp;&nbsp;TxBDs[i].dataAD=&amp;TxBuff[i*TX_BUFF_SIZE];<br />
&nbsp;}<br />
&nbsp;TxBDs[NUM_TXBDS-1].status|=MCF_FEC_TxBD_W;<br />
&nbsp;<br />
}</span></div>
<div style="text-align: left; line-height: 21.6pt; text-indent: 18pt" align="left"><span style="color: black; font-size: 12pt">//</span><span style="color: black; font-size: 12pt">用于数据</span><span style="color: black; font-size: 12pt">copy<br />
void memcpy(uint8* des,uint8* src,uint16 num)<br />
{<br />
&nbsp;while(num&gt;0)<br />
&nbsp;{<br />
&nbsp;&nbsp;*des++=*src++;<br />
&nbsp;&nbsp;num--;<br />
&nbsp;}<br />
}</span></div>]]></description></item></channel></rss>