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

📄 usart_8c-source.html

📁 avr32100.zip Embedded demo
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name="l00429"></a>00429 }<a name="l00430"></a>00430 <a name="l00431"></a>00431 <a name="l00432"></a>00432 <span class="comment">/*</span><a name="l00433"></a>00433 <span class="comment"> * Description: Checks if a overrun error has occured since last status reset</span><a name="l00434"></a>00434 <span class="comment"> * Arguments:   *usart:  Base address of the usart</span><a name="l00435"></a>00435 <span class="comment"> * Returns:     1 if a overrun error has been detected, otherwise 0</span><a name="l00436"></a>00436 <span class="comment"> */</span><a name="l00437"></a><a class="code" href="usart_8c.html#f19dc6969879984f29017d93fb7eb457">00437</a> <span class="keywordtype">int</span> <a class="code" href="usart_8c.html#f19dc6969879984f29017d93fb7eb457">usart_overrun_error</a>(<span class="keyword">volatile</span> <span class="keyword">struct</span> avr32_usart_t * usart)<a name="l00438"></a>00438 {<a name="l00439"></a>00439         <span class="keywordflow">return</span> ((usart-&gt;csr &amp; AVR32_USART_CSR_OVRE_OFFSET)) != 0;<a name="l00440"></a>00440 }<a name="l00441"></a>00441 <a name="l00442"></a>00442 <a name="l00443"></a>00443 <a name="l00444"></a>00444  <span class="comment">/*---------------------------------------------------------------------------+</span><a name="l00445"></a>00445 <span class="comment"> |                                                                            |</span><a name="l00446"></a>00446 <span class="comment"> |                         TRANSMIT/RECEIVE FUNCTIONS                         |</span><a name="l00447"></a>00447 <span class="comment"> |                                                                            |</span><a name="l00448"></a>00448 <span class="comment"> +---------------------------------------------------------------------------*/</span><a name="l00449"></a>00449 <a name="l00450"></a>00450 <span class="comment">/*</span><a name="l00451"></a>00451 <span class="comment"> * Description: While in RS485-mode, receviers only accept data addressed to them.</span><a name="l00452"></a>00452 <span class="comment"> *              A packet/char with the address tag set has to preceed any data.</span><a name="l00453"></a>00453 <span class="comment"> *              usart_send_address() is used to address a receiver. This receiver should read</span><a name="l00454"></a>00454 <span class="comment"> *              all the following data, until an address packet addresses someone else.</span><a name="l00455"></a>00455 <span class="comment"> * Arguments:   *usart:  Base address of the usart</span><a name="l00456"></a>00456 <span class="comment"> *              addr: the address of the target device</span><a name="l00457"></a>00457 <span class="comment"> * Returns:     USART_SUCCESS if the current mode is RS485</span><a name="l00458"></a>00458 <span class="comment"> *              USART_MODE_FAULT if called while in wrong mode</span><a name="l00459"></a>00459 <span class="comment"> */</span><a name="l00460"></a>00460 <a name="l00461"></a><a class="code" href="usart_8c.html#a5490f06d469da4ce5723c9e1555d269">00461</a> <span class="keywordtype">int</span> <a class="code" href="usart_8c.html#a5490f06d469da4ce5723c9e1555d269">usart_send_address</a>(<span class="keyword">volatile</span> <span class="keyword">struct</span> avr32_usart_t * usart, <span class="keywordtype">int</span> address)<a name="l00462"></a>00462 {<a name="l00463"></a>00463         <span class="comment">/* Check if usart is in multidrop / RS485 mode */</span><a name="l00464"></a>00464         <span class="keywordflow">if</span> ( <a class="code" href="usart_8c.html#8130f0bc38f83949813164455b44c215">usart_mode_is_multidrop</a>(usart) )<a name="l00465"></a>00465         {<a name="l00466"></a>00466                 <span class="comment">/* Prepare to send an address */</span><a name="l00467"></a>00467                 usart-&gt;cr |= (1&lt;&lt;AVR32_USART_CR_SENDA_OFFSET);<a name="l00468"></a>00468 <a name="l00469"></a>00469                 <span class="comment">/* Write the address to TX */</span><a name="l00470"></a>00470                 <a class="code" href="usart_8c.html#0cd4c3b95035f5943696ffd9b56ee494">usart_bw_write_char</a>(usart, address);<a name="l00471"></a>00471                 <span class="keywordflow">return</span> <a class="code" href="usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>;<a name="l00472"></a>00472         } <span class="keywordflow">else</span> {<a name="l00473"></a>00473                 <span class="keywordflow">return</span> <a class="code" href="usart_8h.html#e4cc0f3559c44ca2c72a8bd3a340b480">USART_MODE_FAULT</a>;<a name="l00474"></a>00474         }<a name="l00475"></a>00475 }<a name="l00476"></a>00476 <a name="l00477"></a>00477 <span class="comment">/*</span><a name="l00478"></a>00478 <span class="comment"> * Description: Wait until the transmitter it ready (potentially forever),</span><a name="l00479"></a>00479 <span class="comment"> *              then transmit the given character</span><a name="l00480"></a>00480 <span class="comment"> * Arguments:   *usart:  Base address of the usart</span><a name="l00481"></a>00481 <span class="comment"> *              c:       The character (up to 9 bits) to transmit</span><a name="l00482"></a>00482 <span class="comment"> * Returns:     nothing</span><a name="l00483"></a>00483 <span class="comment"> */</span><a name="l00484"></a><a class="code" href="usart_8h.html#0cd4c3b95035f5943696ffd9b56ee494">00484</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="usart_8c.html#0cd4c3b95035f5943696ffd9b56ee494">usart_bw_write_char</a>(<span class="keyword">volatile</span> <span class="keyword">struct</span> avr32_usart_t * usart, <span class="keywordtype">int</span> c)<a name="l00485"></a>00485 {<a name="l00486"></a>00486         <span class="keywordflow">while</span> (<a class="code" href="usart_8c.html#26a849327e3bccdef17734f30667d9bd">usart_write_char</a>(usart, c) != <a class="code" href="usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>) {<a name="l00487"></a>00487         }<a name="l00488"></a>00488 <a name="l00489"></a>00489         <span class="keywordflow">return</span>;<a name="l00490"></a>00490 }<a name="l00491"></a>00491 <a name="l00492"></a><a class="code" href="usart_8h.html#26a849327e3bccdef17734f30667d9bd">00492</a> <span class="keywordtype">int</span> <a class="code" href="usart_8c.html#26a849327e3bccdef17734f30667d9bd">usart_write_char</a>(<span class="keyword">volatile</span> <span class="keyword">struct</span> avr32_usart_t * usart, <span class="keywordtype">int</span> c)<a name="l00493"></a>00493 {<a name="l00494"></a>00494 <a name="l00495"></a>00495         <span class="keywordflow">if</span> ((usart-&gt;csr &amp; (1&lt;&lt;AVR32_USART_CSR_TXRDY_OFFSET)) != 0) {<a name="l00496"></a>00496                 usart-&gt;thr = c;<a name="l00497"></a>00497                 <span class="keywordflow">return</span> <a class="code" href="usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>;<a name="l00498"></a>00498         }<a name="l00499"></a>00499         <span class="keywordflow">else</span><a name="l00500"></a>00500                 <span class="keywordflow">return</span> <a class="code" href="usart_8h.html#481df5bfed5fec78ff5697b335ab5947">USART_TX_BUSY</a>;<a name="l00501"></a>00501 }<a name="l00502"></a>00502 <a name="l00503"></a>00503 <a name="l00504"></a><a class="code" href="usart_8h.html#ada9ca86fda25626da4a1c4b1e723682">00504</a> <span class="keywordtype">int</span> <a class="code" href="usart_8c.html#ada9ca86fda25626da4a1c4b1e723682">usart_read_char</a>(<span class="keyword">volatile</span> <span class="keyword">struct</span> avr32_usart_t * usart, <span class="keywordtype">int</span> * c)<a name="l00505"></a>00505 {<a name="l00506"></a>00506         <span class="comment">/* Check for errors; Frame, parity and overrun In RS485 mode a parity</span><a name="l00507"></a>00507 <span class="comment">                error would mean that we received an address char */</span><a name="l00508"></a>00508         <span class="keywordflow">if</span> (usart-&gt;csr &amp;<a name="l00509"></a>00509                         ((1 &lt;&lt; AVR32_USART_CSR_OVRE_OFFSET) |<a name="l00510"></a>00510                         (1 &lt;&lt; AVR32_USART_CSR_FRAME_OFFSET) |<a name="l00511"></a>00511                         (1 &lt;&lt; AVR32_USART_CSR_PARE_OFFSET))) {<a name="l00512"></a>00512                 <span class="keywordflow">return</span> <a class="code" href="usart_8h.html#ffa1a7abf4e6ce54c0b64cc0826f8b4d">USART_RX_ERROR</a>;<a name="l00513"></a>00513         }<a name="l00514"></a>00514         <span class="comment">/* No error; if we really did receive a char, read it and return SUCCESS */</span><a name="l00515"></a>00515         <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((usart-&gt;csr &amp; (1&lt;&lt;AVR32_USART_CSR_RXRDY_OFFSET)) != 0) {<a name="l00516"></a>00516                 *c = (<span class="keywordtype">unsigned</span> short)usart-&gt;rhr;<a name="l00517"></a>00517                 <span class="keywordflow">return</span> <a class="code" href="usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>;<a name="l00518"></a>00518         } <span class="keywordflow">else</span> {<a name="l00519"></a>00519                 <span class="keywordflow">return</span> <a class="code" href="usart_8h.html#deb9432170d2d09a4ffbb098a1b4335e">USART_RX_EMPTY</a>;<a name="l00520"></a>00520         }<a name="l00521"></a>00521 } <span class="comment">/* usart_read */</span><a name="l00522"></a>00522 <a name="l00523"></a>00523 <a name="l00524"></a><a class="code" href="usart_8h.html#ad19b20067ca5ccf90d584e3b09ab02a">00524</a> <span class="keywordtype">int</span> <a class="code" href="usart_8c.html#ad19b20067ca5ccf90d584e3b09ab02a">usart_getchar</a>(<span class="keyword">volatile</span> <span class="keyword">struct</span> avr32_usart_t * usart)<a name="l00525"></a>00525 {<a name="l00526"></a>00526         <span class="keywordtype">int</span> c, ret;<a name="l00527"></a>00527 <a name="l00528"></a>00528         <span class="keywordflow">while</span> (((ret = <a class="code" href="usart_8c.html#ada9ca86fda25626da4a1c4b1e723682">usart_read_char</a>(usart, &amp;c)) == <a class="code" href="usart_8h.html#deb9432170d2d09a4ffbb098a1b4335e">USART_RX_EMPTY</a>)) {<a name="l00529"></a>00529         }<a name="l00530"></a>00530 <a name="l00531"></a>00531         <span class="keywordflow">if</span> (ret == <a class="code" href="usart_8h.html#ffa1a7abf4e6ce54c0b64cc0826f8b4d">USART_RX_ERROR</a>)<a name="l00532"></a>00532                 <span class="keywordflow">return</span> -1;<a name="l00533"></a>00533         <span class="keywordflow">else</span><a name="l00534"></a>00534                 <span class="keywordflow">return</span> c;<a name="l00535"></a>00535 }<a name="l00536"></a>00536 <a name="l00537"></a>00537 <a name="l00538"></a><a class="code" href="usart_8h.html#908695fc913f77a6c1ab2a89e201a1fd">00538</a> <span class="keywordtype">int</span> <a class="code" href="usart_8c.html#908695fc913f77a6c1ab2a89e201a1fd">usart_putchar</a>(<span class="keyword">volatile</span> <span class="keyword">struct</span> avr32_usart_t * usart, <span class="keywordtype">int</span> c)<a name="l00539"></a>00539 {<a name="l00540"></a>00540         <span class="keywordtype">int</span> timeout = <a class="code" href="usart_8h.html#c8dc7a35914ec78bd7382630499bd856">USART_DEFAULT_TIMEOUT</a>;<a name="l00541"></a>00541 <a name="l00542"></a>00542         <span class="keywordflow">if</span> (c == <span class="charliteral">'\n'</span>){<a name="l00543"></a>00543           <span class="keywordflow">while</span> ((<a class="code" href="usart_8c.html#26a849327e3bccdef17734f30667d9bd">usart_write_char</a>(usart, <span class="charliteral">'\r'</span>) != <a class="code" href="usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>) &amp;&amp; (timeout&gt;0) ){<a name="l00544"></a>00544             timeout--;<a name="l00545"></a>00545           }<a name="l00546"></a>00546         <a name="l00547"></a>00547           <span class="keywordflow">if</span> (timeout == 0)<a name="l00548"></a>00548             <span class="keywordflow">return</span> -1;<a name="l00549"></a>00549           timeout = <a class="code" href="usart_8h.html#c8dc7a35914ec78bd7382630499bd856">USART_DEFAULT_TIMEOUT</a>;<a name="l00550"></a>00550         }<a name="l00551"></a>00551 <a name="l00552"></a>00552         <span class="keywordflow">while</span> ((<a class="code" href="usart_8c.html#26a849327e3bccdef17734f30667d9bd">usart_write_char</a>(usart, c) != <a class="code" href="usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>) &amp;&amp; ( timeout&gt;0 )){<a name="l00553"></a>00553           timeout--;<a name="l00554"></a>00554         }<a name="l00555"></a>00555         <span class="keywordflow">if</span> (timeout == 0)<a name="l00556"></a>00556                 <span class="keywordflow">return</span> -1;<a name="l00557"></a>00557         <span class="keywordflow">else</span><a name="l00558"></a>00558                 <span class="keywordflow">return</span> 0;<a name="l00559"></a>00559 }<a name="l00560"></a>00560 </pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu May 10 14:17:56 2007 for AVR321000 Communication with the AVR32 USART by&nbsp;<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address></body></html>

⌨️ 快捷键说明

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