📄 testsuite_2bravo__validation_2usart_2usart_8c-source.html
字号:
<a name="l00388"></a>00388 <a name="l00389"></a>00389 <a name="l00390"></a>00390 <a name="l00391"></a>00391 <span class="comment">/*---------------------------------------------------------------------------+</span><a name="l00392"></a>00392 <span class="comment"> | |</span><a name="l00393"></a>00393 <span class="comment"> | TRANSMIT/RECEIVE FUNCTIONS |</span><a name="l00394"></a>00394 <span class="comment"> | |</span><a name="l00395"></a>00395 <span class="comment"> +---------------------------------------------------------------------------*/</span><a name="l00396"></a>00396 <a name="l00397"></a>00397 <span class="comment">/*</span><a name="l00398"></a>00398 <span class="comment"> * Description: While in RS485-mode, receviers only accept data addressed to them.</span><a name="l00399"></a>00399 <span class="comment"> * A packet/char with the address tag set has to preceed any data.</span><a name="l00400"></a>00400 <span class="comment"> * usart_send_address() is used to address a receiver. This receiver should read</span><a name="l00401"></a>00401 <span class="comment"> * all the following data, until an address packet addresses someone else.</span><a name="l00402"></a>00402 <span class="comment"> * Arguments: *usart: Base address of the usart</span><a name="l00403"></a>00403 <span class="comment"> * addr: the address of the target device</span><a name="l00404"></a>00404 <span class="comment"> * Returns: USART_SUCCESS if the current mode is RS485</span><a name="l00405"></a>00405 <span class="comment"> * USART_MODE_FAULT if called while in wrong mode</span><a name="l00406"></a>00406 <span class="comment"> */</span><a name="l00407"></a>00407 <a name="l00408"></a><a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#9f2429a7b9d05f100052dd791fb499df">00408</a> <span class="keywordtype">int</span> <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#9f2429a7b9d05f100052dd791fb499df">usart_send_address</a>(<span class="keyword">volatile</span> avr32_usart_t * usart, <span class="keywordtype">int</span> address)<a name="l00409"></a>00409 {<a name="l00410"></a>00410 <span class="comment">/* Check if usart is in multidrop / RS485 mode */</span><a name="l00411"></a>00411 <span class="keywordflow">if</span> (<a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#cc362133839fdd80c3a8c484ccda0cc6">usart_mode_is_multidrop</a>(usart))<a name="l00412"></a>00412 {<a name="l00413"></a>00413 <span class="comment">/* Prepare to send an address */</span><a name="l00414"></a>00414 usart->cr |= (1<<AVR32_USART_CR_SENDA_OFFSET);<a name="l00415"></a>00415 <a name="l00416"></a>00416 <span class="comment">/* Write the address to TX */</span><a name="l00417"></a>00417 <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#6742a3db6c2d4cf16295223932d33df5">usart_bw_write_char</a>(usart, address);<a name="l00418"></a>00418 <span class="keywordflow">return</span> <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>;<a name="l00419"></a>00419 } <span class="keywordflow">else</span> {<a name="l00420"></a>00420 <span class="keywordflow">return</span> <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8h.html#e4cc0f3559c44ca2c72a8bd3a340b480">USART_MODE_FAULT</a>;<a name="l00421"></a>00421 }<a name="l00422"></a>00422 }<a name="l00423"></a>00423 <a name="l00424"></a>00424 <span class="comment">/*</span><a name="l00425"></a>00425 <span class="comment"> * Description: Wait until the transmitter it ready (potentially forever),</span><a name="l00426"></a>00426 <span class="comment"> * then transmit the given character</span><a name="l00427"></a>00427 <span class="comment"> * Arguments: *usart: Base address of the usart</span><a name="l00428"></a>00428 <span class="comment"> * c: The character (up to 9 bits) to transmit</span><a name="l00429"></a>00429 <span class="comment"> * Returns: nothing</span><a name="l00430"></a>00430 <span class="comment"> */</span><a name="l00431"></a><a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#6742a3db6c2d4cf16295223932d33df5">00431</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#6742a3db6c2d4cf16295223932d33df5">usart_bw_write_char</a>(<span class="keyword">volatile</span> avr32_usart_t * usart, <span class="keywordtype">int</span> c)<a name="l00432"></a>00432 {<a name="l00433"></a>00433 <span class="keywordflow">while</span> (<a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#0c36f4b2ec5445212642ee7f94672805">usart_write_char</a>(usart, c) != <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>) {<a name="l00434"></a>00434 }<a name="l00435"></a>00435 <a name="l00436"></a>00436 <span class="keywordflow">return</span>;<a name="l00437"></a>00437 }<a name="l00438"></a>00438 <a name="l00439"></a><a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#0c36f4b2ec5445212642ee7f94672805">00439</a> <span class="keywordtype">int</span> <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#0c36f4b2ec5445212642ee7f94672805">usart_write_char</a>(<span class="keyword">volatile</span> avr32_usart_t * usart, <span class="keywordtype">int</span> c)<a name="l00440"></a>00440 {<a name="l00441"></a>00441 <a name="l00442"></a>00442 <span class="keywordflow">if</span> ((usart->csr & (1<<AVR32_USART_CSR_TXRDY_OFFSET)) != 0) {<a name="l00443"></a>00443 usart->thr = c;<a name="l00444"></a>00444 <span class="keywordflow">return</span> <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>;<a name="l00445"></a>00445 }<a name="l00446"></a>00446 <span class="keywordflow">else</span><a name="l00447"></a>00447 <span class="keywordflow">return</span> <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8h.html#481df5bfed5fec78ff5697b335ab5947">USART_TX_BUSY</a>;<a name="l00448"></a>00448 }<a name="l00449"></a>00449 <a name="l00450"></a>00450 <a name="l00451"></a><a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#b73fc2f42bd6fe66c03d598b0158436d">00451</a> <span class="keywordtype">int</span> <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#b73fc2f42bd6fe66c03d598b0158436d">usart_read_char</a>(<span class="keyword">volatile</span> avr32_usart_t * usart, <span class="keywordtype">int</span> * c)<a name="l00452"></a>00452 {<a name="l00453"></a>00453 <span class="comment">/* Check for errors; Frame, parity and overrun In RS485 mode a parity</span><a name="l00454"></a>00454 <span class="comment"> error would mean that we received an address char */</span><a name="l00455"></a>00455 <span class="keywordflow">if</span> (usart->csr &<a name="l00456"></a>00456 ((1 << AVR32_USART_CSR_OVRE_OFFSET) |<a name="l00457"></a>00457 (1 << AVR32_USART_CSR_FRAME_OFFSET) |<a name="l00458"></a>00458 (1 << AVR32_USART_CSR_PARE_OFFSET))) {<a name="l00459"></a>00459 <span class="keywordflow">return</span> <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8h.html#ffa1a7abf4e6ce54c0b64cc0826f8b4d">USART_RX_ERROR</a>;<a name="l00460"></a>00460 }<a name="l00461"></a>00461 <span class="comment">/* No error; if we really did receive a char, read it and return SUCCESS */</span><a name="l00462"></a>00462 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((usart->csr & (1<<AVR32_USART_CSR_RXRDY_OFFSET)) != 0) {<a name="l00463"></a>00463 *c = (<span class="keywordtype">unsigned</span> short)usart->rhr;<a name="l00464"></a>00464 <span class="keywordflow">return</span> <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>;<a name="l00465"></a>00465 } <span class="keywordflow">else</span> {<a name="l00466"></a>00466 <span class="keywordflow">return</span> <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8h.html#deb9432170d2d09a4ffbb098a1b4335e">USART_RX_EMPTY</a>;<a name="l00467"></a>00467 }<a name="l00468"></a>00468 } <span class="comment">/* usart_read */</span><a name="l00469"></a>00469 <a name="l00470"></a>00470 <a name="l00471"></a><a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#a751e180b091943b684b48c581aaef3e">00471</a> <span class="keywordtype">int</span> <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#a751e180b091943b684b48c581aaef3e">usart_getchar</a>(<span class="keyword">volatile</span> avr32_usart_t * usart)<a name="l00472"></a>00472 {<a name="l00473"></a>00473 <span class="keywordtype">int</span> c, ret;<a name="l00474"></a>00474 <span class="keywordflow">while</span> (((ret = <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#b73fc2f42bd6fe66c03d598b0158436d">usart_read_char</a>(usart, &c)) == <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8h.html#deb9432170d2d09a4ffbb098a1b4335e">USART_RX_EMPTY</a>)) {<a name="l00475"></a>00475 }<a name="l00476"></a>00476 <a name="l00477"></a>00477 <span class="keywordflow">if</span> (ret == <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8h.html#ffa1a7abf4e6ce54c0b64cc0826f8b4d">USART_RX_ERROR</a>)<a name="l00478"></a>00478 <span class="keywordflow">return</span> -1;<a name="l00479"></a>00479 <span class="keywordflow">else</span><a name="l00480"></a>00480 <span class="keywordflow">return</span> c;<a name="l00481"></a>00481 }<a name="l00482"></a>00482 <a name="l00483"></a>00483 <a name="l00484"></a><a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#2ff96c7ceba22b5663bee08da4633ed9">00484</a> <span class="keywordtype">int</span> <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8c.html#d8d5a1b7705f01b3ace3de0948930600">usart_putchar</a>(<span class="keyword">volatile</span> avr32_usart_t * usart, <span class="keywordtype">int</span> c)<a name="l00485"></a>00485 {<a name="l00486"></a>00486 <span class="keywordtype">int</span> timeout = <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8h.html#c8dc7a35914ec78bd7382630499bd856">USART_DEFAULT_TIMEOUT</a>;<a name="l00487"></a>00487 <a name="l00488"></a>00488 <span class="keywordflow">if</span> (c == <span class="charliteral">'\n'</span>){<a name="l00489"></a>00489 <span class="keywordflow">while</span> ((<a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#0c36f4b2ec5445212642ee7f94672805">usart_write_char</a>(usart, <span class="charliteral">'\r'</span>) != <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>) && --timeout)<a name="l00490"></a>00490 ;<a name="l00491"></a>00491 <span class="keywordflow">if</span> (timeout == 0)<a name="l00492"></a>00492 <span class="keywordflow">return</span> -1;<a name="l00493"></a>00493 timeout = <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8h.html#c8dc7a35914ec78bd7382630499bd856">USART_DEFAULT_TIMEOUT</a>;<a name="l00494"></a>00494 }<a name="l00495"></a>00495 <a name="l00496"></a>00496 <span class="keywordflow">while</span> ((<a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#0c36f4b2ec5445212642ee7f94672805">usart_write_char</a>(usart, c) != <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8h.html#cbf846773f58a382f10f8daf94797059">USART_SUCCESS</a>) && --timeout)<a name="l00497"></a>00497 ;<a name="l00498"></a>00498 <span class="keywordflow">if</span> (timeout == 0)<a name="l00499"></a>00499 <span class="keywordflow">return</span> -1;<a name="l00500"></a>00500 <span class="keywordflow">else</span><a name="l00501"></a>00501 <span class="keywordflow">return</span> 0;<a name="l00502"></a>00502 }<a name="l00503"></a>00503 <a name="l00504"></a>00504 <a name="l00505"></a>00505 <span class="comment">/* Write one character string to the usart */</span><a name="l00506"></a><a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#28b90f556104f041e783662329b64a38">00506</a> <span class="keywordtype">int</span> <a class="code" href="testsuite_2bravo__validation_2usart_2usart_8c.html#28b90f556104f041e783662329b64a38">usart_write_line</a>(<span class="keyword">volatile</span> avr32_usart_t * usart, <span class="keywordtype">char</span> * <a class="code" href="pdc__example_8c.html#ed1cfb225a5fb77461e7972691e68a72">string</a>)<a name="l00507"></a>00507 {<a name="l00508"></a>00508 <span class="keywordflow">while</span> (*string != <span class="charliteral">'\0'</span>)<a name="l00509"></a>00509 <a class="code" href="testsuite_2bravo__validation_2pdc_2usart_8c.html#d8d5a1b7705f01b3ace3de0948930600">usart_putchar</a>(usart, *string++);<a name="l00510"></a>00510 <span class="keywordflow">return</span> 0;<a name="l00511"></a>00511 }</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu May 10 14:14:48 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 + -