📄 usart_8c-source.html
字号:
<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->csr & 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->cr |= (1<<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->csr & (1<<AVR32_USART_CSR_TXRDY_OFFSET)) != 0) {<a name="l00496"></a>00496 usart->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->csr &<a name="l00509"></a>00509 ((1 << AVR32_USART_CSR_OVRE_OFFSET) |<a name="l00510"></a>00510 (1 << AVR32_USART_CSR_FRAME_OFFSET) |<a name="l00511"></a>00511 (1 << 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->csr & (1<<AVR32_USART_CSR_RXRDY_OFFSET)) != 0) {<a name="l00516"></a>00516 *c = (<span class="keywordtype">unsigned</span> short)usart->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, &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>) && (timeout>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>) && ( timeout>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 <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 + -