⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ax88796_8c-source.html

📁 单片机的软件
💻 HTML
📖 第 1 页 / 共 3 页
字号:
00230 00231     <span class="keywordflow">if</span>(ax88796Read(GPI) &amp; I_SPD)        <span class="comment">// check PHY speed setting</span>00232         tcrFduFlag = FDU;               <span class="comment">// if 100base, do full duplex</span>00233     <span class="keywordflow">else</span>00234         tcrFduFlag = 0;                 <span class="comment">// if 10base, do half duplex</span>00235         00236     ax88796Write(TCR,(tcrFduFlag|TCR_INIT));00237 00238     ax88796Write(GPOC,MPSEL);           <span class="comment">// select media interface</span>00239   00240     ax88796Write(TPSR,TXSTART_INIT);00241 00242     ax88796Write(CR,(RD2|STOP));00243     ax88796Write(DCR,DCR_INIT);00244     ax88796Write(CR,(RD2|START));00245     ax88796Write(ISR,0xFF);00246     ax88796Write(IMR,IMR_INIT);00247     ax88796Write(TCR,(tcrFduFlag|TCR_INIT));00248 00249     <span class="comment">//test</span>00250 <span class="comment">/*</span>00251 <span class="comment">    while(1)</span>00252 <span class="comment">    {</span>00253 <span class="comment">        vt100SetCursorPos(18,0);</span>00254 <span class="comment">        ax88796RegDump();</span>00255 <span class="comment">    }</span>00256 <span class="comment">*/</span>00257 }00258 00259 00260 <span class="keywordtype">void</span> ax88796BeginPacketSend(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> packetLength)00261 {00262     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sendPacketLength;00263     sendPacketLength = (packetLength&gt;=ETHERNET_MIN_PACKET_LENGTH)?00264                         (packetLength):(ETHERNET_MIN_PACKET_LENGTH);00265     00266     <span class="comment">//start the NIC</span>00267     ax88796Write(CR,(RD2|START));00268     00269     <span class="comment">// still transmitting a packet - wait for it to finish</span>00270     <span class="keywordflow">while</span>( ax88796Read(CR) &amp; TXP );00271 00272     <span class="comment">//load beginning page for transmit buffer</span>00273     ax88796Write(TPSR,TXSTART_INIT);00274     00275     <span class="comment">//set start address for remote DMA operation</span>00276     ax88796Write(RSAR0,0x00);00277     ax88796Write(RSAR1,0x40);00278     00279     <span class="comment">//clear the packet stored interrupt</span>00280     ax88796Write(ISR, PTX);00281 00282     <span class="comment">//load data byte count for remote DMA</span>00283     ax88796Write(RBCR0, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(packetLength));00284     ax88796Write(RBCR1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(packetLength&gt;&gt;8));00285 00286     ax88796Write(TBCR0, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(sendPacketLength));00287     ax88796Write(TBCR1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)((sendPacketLength)&gt;&gt;8));00288     00289     <span class="comment">//do remote write operation</span>00290     ax88796Write(CR,0x12);00291 }00292 00293 00294 <span class="keywordtype">void</span> ax88796SendPacketData(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * localBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00295 {00296     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00297     00298     <span class="keywordflow">for</span>(i=0;i&lt;length;i++)00299         ax88796Write(RDMAPORT, localBuffer[i]);00300 }00301 00302 00303 <span class="keywordtype">void</span> ax88796EndPacketSend(<span class="keywordtype">void</span>)00304 {00305     <span class="comment">//send the contents of the transmit buffer onto the network</span>00306     ax88796Write(CR,(RD2|TXP));00307     00308     <span class="comment">// clear the remote DMA interrupt</span>00309     ax88796Write(ISR, RDC);00310 }00311 00312 00313 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ax88796BeginPacketRetreive(<span class="keywordtype">void</span>)00314 {00315     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> writePagePtr;00316     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> readPagePtr;00317     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> bnryPagePtr;00318     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> i;00319     00320     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> pageheader[4];00321     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rxlen;00322     00323     <span class="comment">// check for and handle an overflow</span>00324     ax88796ProcessInterrupt();00325     00326     <span class="comment">// read CURR from page 1</span>00327     ax88796Write(CR,(PS0|RD2|START));00328     writePagePtr = ax88796Read(CURR);00329     <span class="comment">// read the boundary register from page 0</span>00330     ax88796Write(CR,(RD2|START));00331     bnryPagePtr = ax88796Read(BNRY);00332 00333     <span class="comment">// first packet is at page bnryPtr+1</span>00334     readPagePtr = bnryPagePtr+1;00335     <span class="keywordflow">if</span>(readPagePtr &gt;= RXSTOP_INIT) readPagePtr = RXSTART_INIT;00336     00337     <span class="comment">// return if there is no packet in the buffer</span>00338     <span class="keywordflow">if</span>( readPagePtr == writePagePtr )00339     {00340         <span class="keywordflow">return</span> 0;00341     }00342     00343     <span class="comment">// clear the packet received interrupt flag</span>00344     ax88796Write(ISR, PRX);00345     00346     <span class="comment">// if the boundary pointer is invalid,</span>00347     <span class="comment">// reset the contents of the buffer and exit</span>00348     <span class="keywordflow">if</span>( (bnryPagePtr &lt; RXSTART_INIT) || (bnryPagePtr &gt;= RXSTOP_INIT) )00349     {00350         ax88796Write(BNRY, RXSTART_INIT);00351         ax88796Write(CR, (PS0|RD2|START));00352         ax88796Write(CURR, RXSTART_INIT+1);00353         ax88796Write(CR, (RD2|START));00354         00355 <span class="comment">//      rprintf("B");</span>00356         <span class="keywordflow">return</span> 0;00357     }00358 00359     <span class="comment">// initiate DMA to transfer the RTL8019 packet header</span>00360     ax88796Write(RBCR0, 4);00361     ax88796Write(RBCR1, 0);00362     ax88796Write(RSAR0, 0);00363     ax88796Write(RSAR1, readPagePtr);00364     ax88796Write(CR, (RD0|START));00365     <span class="keywordflow">for</span>(i=0;i&lt;4;i++)00366         pageheader[i] = ax88796Read(RDMAPORT);00367 00368     <span class="comment">// end the DMA operation</span>00369     ax88796Write(CR, (RD2|START));00370     <span class="keywordflow">for</span>(i = 0; i &lt;= 20; i++)00371         <span class="keywordflow">if</span>(ax88796Read(ISR) &amp; RDC)00372             <span class="keywordflow">break</span>;00373     ax88796Write(ISR, RDC);00374     00375     rxlen = (pageheader[PKTHEADER_PKTLENH]&lt;&lt;8) + pageheader[PKTHEADER_PKTLENL];00376     NextPage = pageheader[PKTHEADER_NEXTPAGE];00377     00378     CurrentRetreiveAddress = (readPagePtr&lt;&lt;8) + 4;00379     00380     <span class="comment">// if the NextPage pointer is invalid, the packet is not ready yet - exit</span>00381     <span class="keywordflow">if</span>( (NextPage &gt;= RXSTOP_INIT) || (NextPage &lt; RXSTART_INIT) )00382     {00383 <span class="comment">//      rprintf("N");</span>00384 <span class="comment">//      rprintfu08(nextPage);</span>00385         <span class="keywordflow">return</span> 0;00386     }00387 00388     <span class="keywordflow">return</span> rxlen-4;00389 }00390 00391 00392 <span class="keywordtype">void</span> ax88796RetreivePacketData(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * localBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00393 {00394     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00395     00396     <span class="comment">// initiate DMA to transfer the data</span>00397     ax88796Write(RBCR0, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)length);00398     ax88796Write(RBCR1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(length&gt;&gt;8));00399     ax88796Write(RSAR0, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)CurrentRetreiveAddress);00400     ax88796Write(RSAR1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(CurrentRetreiveAddress&gt;&gt;8));00401     ax88796Write(CR, (RD0|START));00402     <span class="keywordflow">for</span>(i=0;i&lt;length;i++)00403         localBuffer[i] = ax88796Read(RDMAPORT);00404 00405     <span class="comment">// end the DMA operation</span>00406     ax88796Write(CR, (RD2|START));00407     <span class="keywordflow">for</span>(i = 0; i &lt;= 20; i++)00408         <span class="keywordflow">if</span>(ax88796Read(ISR) &amp; RDC)00409             <span class="keywordflow">break</span>;00410     ax88796Write(ISR, RDC);00411     00412     CurrentRetreiveAddress += length;00413     <span class="keywordflow">if</span>( CurrentRetreiveAddress &gt;= 0x6000 )00414         CurrentRetreiveAddress -= (0x6000-0x4600) ;00415 }00416 00417 00418 <span class="keywordtype">void</span> ax88796EndPacketRetreive(<span class="keywordtype">void</span>)00419 {00420     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> i;00421     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> bnryPagePtr;00422 00423     <span class="comment">// end the DMA operation</span>00424     ax88796Write(CR, (RD2|START));00425     <span class="keywordflow">for</span>(i = 0; i &lt;= 20; i++)00426         <span class="keywordflow">if</span>(ax88796Read(ISR) &amp; RDC)00427             <span class="keywordflow">break</span>;00428     ax88796Write(ISR, RDC);00429 00430     <span class="comment">// set the boundary register to point</span>00431     <span class="comment">// to the start of the next packet-1</span>00432     bnryPagePtr = NextPage-1;00433     <span class="keywordflow">if</span>(bnryPagePtr &lt; RXSTART_INIT) bnryPagePtr = RXSTOP_INIT-1;00434 00435     ax88796Write(BNRY, bnryPagePtr);00436 }00437 00438 00439 <span class="keywordtype">void</span> ax88796ProcessInterrupt(<span class="keywordtype">void</span>)00440 {00441     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> intr = ax88796Read(ISR);00442     00443     <span class="comment">// check for receive overflow</span>00444     <span class="keywordflow">if</span>( intr &amp; OVW )00445         ax88796ReceiveOverflowRecover();00446 }00447 00448 00449 <span class="keywordtype">void</span> ax88796ReceiveOverflowRecover(<span class="keywordtype">void</span>)00450 {00451     <span class="comment">// receive buffer overflow handling procedure</span>00452     <span class="comment">// as specified in the AX88796 datasheet</span>00453 00454     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cmdReg;00455     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> resend=0;00456 00457     <span class="comment">// check if we were transmitting something</span>00458     cmdReg = ax88796Read(CR);00459     <span class="comment">// stop the interface</span>00460     ax88796Write(CR, (RD2|STOP));00461     <span class="comment">// wait for timeout</span>00462     delay_ms(2);00463     <span class="comment">// clear remote byte count registers</span>00464     ax88796Write(RBCR0, 0x00);00465     ax88796Write(RBCR1, 0x00);00466     00467     <span class="comment">// if we were transmitting something</span>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -