00001 /************************************************************************************************** 00002 Title : PIC24F Series UART Driver 00003 Programmer : Ryuz 00004 Programmer : Yosuke FURUSAWA 00005 Copyright : Copyright (C) 1998-2000 Ryuz. (Imported HOS-v3) 00006 Copyright : Copyright (C) 2000-2010 Yosuke FURUSAWA. 00007 License : 4-clause BSD License 00008 Since : 1998/xx/xx 00009 00010 Filename : libuart.h 00011 Last up date : 2010/08/11 00012 Kanji-Code : Shift-JIS 00013 TAB Space : 4 00014 **************************************************************************************************/ 00015 00016 00017 /*================================================================================================= 00018 ヘッダファイルをインクロード 00019 =================================================================================================*/ 00020 #include <p24FJ64GA002.h> 00021 00022 #include "table.h" 00023 #include "libuart.h" 00024 00025 00026 /*================================================================================================= 00027 マクロ定義 00028 ================================================================================================*/ 00029 #define abs(a) (((a)>0) ? (a) : -(a)) 00030 00031 00032 /*================================================================================================= 00033 グローバル変数 00034 ================================================================================================*/ 00035 /* 送信バッファ */ 00036 char uart1_tx_buf[UART1_TX_BUFFER_SIZE]; 00037 unsigned char uart1_tx_stptr; 00038 unsigned char uart1_tx_enptr; 00039 00040 char uart2_tx_buf[UART2_TX_BUFFER_SIZE]; 00041 unsigned char uart2_tx_stptr; 00042 unsigned char uart2_tx_enptr; 00043 00044 /* 受信バッファ */ 00045 char uart1_rx_buf[UART1_RX_BUFFER_SIZE]; 00046 unsigned char uart1_rx_stptr; 00047 unsigned char uart1_rx_enptr; 00048 00049 char uart2_rx_buf[UART2_RX_BUFFER_SIZE]; 00050 unsigned char uart2_rx_stptr; 00051 unsigned char uart2_rx_enptr; 00052 00053 00054 /************************************************************************************************** 00055 UART1 送信割込 00056 **************************************************************************************************/ 00057 void __attribute__((interrupt, auto_psv)) _U1TXInterrupt(void) 00058 { 00059 unsigned char nxptr; 00060 00061 IFS0bits.U1TXIF = 0; 00062 00063 /* 送信バッファが空 */ 00064 if ( uart1_tx_stptr == uart1_tx_enptr ) { 00065 //IFS0bits.U1TXIF = 0; 00066 return; 00067 } 00068 00069 /* 送信バッファから 1文字取り出して送信 */ 00070 while(!U1STAbits.TRMT); 00071 U1TXREG = uart1_tx_buf[uart1_tx_stptr]; 00072 00073 /* ポインタ更新 */ 00074 nxptr = uart1_tx_stptr + 1; 00075 if (nxptr >= UART1_TX_BUFFER_SIZE) nxptr = 0; 00076 uart1_tx_stptr = nxptr; 00077 00078 return; 00079 } 00080 00081 00082 /************************************************************************************************** 00083 UART2 送信割込 00084 **************************************************************************************************/ 00085 void __attribute__((interrupt, auto_psv)) _U2TXInterrupt(void) 00086 { 00087 unsigned char nxptr; 00088 00089 IFS1bits.U2TXIF = 0; 00090 00091 /* 送信バッファが空 */ 00092 if ( uart2_tx_stptr == uart2_tx_enptr ) { 00093 //IFS1bits.U2TXIF = 0; 00094 return; 00095 } 00096 00097 /* 送信バッファから 1文字取り出して送信 */ 00098 while(!U2STAbits.TRMT); 00099 U2TXREG = uart2_tx_buf[uart2_tx_stptr]; 00100 00101 /* ポインタ更新 */ 00102 nxptr = uart2_tx_stptr + 1; 00103 if (nxptr >= UART2_TX_BUFFER_SIZE) nxptr = 0; 00104 uart2_tx_stptr = nxptr; 00105 00106 return; 00107 } 00108 00109 00110 /************************************************************************************************** 00111 UART1 受信割込 00112 **************************************************************************************************/ 00113 void __attribute__((interrupt, auto_psv)) _U1RXInterrupt(void) 00114 { 00115 unsigned char nxptr; 00116 00117 IFS0bits.U1RXIF = 0; 00118 00119 if(U1STAbits.URXDA){ 00120 /* ポインタ更新 */ 00121 nxptr = uart1_rx_enptr + 1; 00122 if(nxptr >= UART1_RX_BUFFER_SIZE) nxptr = 0; 00123 if(uart1_rx_stptr != nxptr){ 00124 uart1_rx_buf[ uart1_rx_enptr ] = U1RXREG; 00125 uart1_rx_enptr = nxptr; 00126 } else { 00127 /* バッファが満杯 */ 00128 /* 取りこぼすことにする */ 00129 } 00130 } 00131 00132 return; 00133 } 00134 00135 00136 /************************************************************************************************** 00137 UART2 受信割込 00138 **************************************************************************************************/ 00139 void __attribute__((interrupt, auto_psv)) _U2RXInterrupt(void) 00140 { 00141 unsigned char nxptr; 00142 00143 IFS1bits.U2RXIF = 0; 00144 00145 if(U2STAbits.URXDA){ 00146 /* ポインタ更新 */ 00147 nxptr = uart2_rx_enptr + 1; 00148 if(nxptr >= UART2_RX_BUFFER_SIZE) nxptr = 0; 00149 if(uart2_rx_stptr != nxptr){ 00150 uart2_rx_buf[ uart2_rx_enptr ] = U2RXREG; 00151 uart2_rx_enptr = nxptr; 00152 } else { 00153 /* バッファが満杯 */ 00154 /* 取りこぼすことにする */ 00155 } 00156 } 00157 00158 return; 00159 } 00160 00161 00162 /************************************************************************************************** 00163 初期化 00164 **************************************************************************************************/ 00165 void UART1_init(unsigned long baud) 00166 { 00167 RPINR18bits.U1RXR = 5; /* RXD : RP5 */ 00168 RPOR2bits.RP4R = 3; /* TXD : RP4 */ 00169 00170 U1MODE = 0b1000100000001000; 00171 U1STA = 0b0010010000000000; 00172 U1BRG = UART_get_brg(baud); 00173 00174 /* 送信割込 */ 00175 IPC3bits.U1TXIP = 3; 00176 IEC0bits.U1TXIE = 1; 00177 IFS0bits.U1TXIF = 0; 00178 00179 /* 受信割込 */ 00180 IPC2bits.U1RXIP = 4; 00181 IEC0bits.U1RXIE = 1; 00182 IFS0bits.U1RXIF = 0; 00183 00184 UART1_buf_clear(); 00185 return; 00186 } 00187 00188 00189 void UART2_init(unsigned long baud) 00190 { 00191 RPINR19bits.U2RXR = 6; /* RXD : RP6 */ 00192 RPOR3bits.RP7R = 5; /* TXD : RP7 */ 00193 00194 U2MODE = 0b1000100000001000; 00195 U2STA = 0b0010010000000000; 00196 U2BRG = UART_get_brg(baud); 00197 00198 /* 送信割込 */ 00199 IPC7bits.U2TXIP = 3; 00200 IEC1bits.U2TXIE = 1; 00201 IFS1bits.U2TXIF = 0; 00202 00203 /* 受信割込 */ 00204 IPC7bits.U2RXIP = 4; 00205 IEC1bits.U2RXIE = 1; 00206 IFS1bits.U2RXIF = 0; 00207 00208 UART2_buf_clear(); 00209 return; 00210 } 00211 00212 00213 /************************************************************************************************** 00214 バッファクリア 00215 **************************************************************************************************/ 00216 void UART1_buf_clear(void) 00217 { 00218 uart1_tx_stptr = 0; 00219 uart1_tx_enptr = 0; 00220 00221 uart1_rx_stptr = 0; 00222 uart1_rx_enptr = 0; 00223 00224 return; 00225 } 00226 00227 void UART2_buf_clear(void) 00228 { 00229 uart2_tx_stptr = 0; 00230 uart2_tx_enptr = 0; 00231 00232 uart2_rx_stptr = 0; 00233 uart2_rx_enptr = 0; 00234 00235 return; 00236 } 00237 00238 00239 /************************************************************************************************** 00240 1byte受信 00241 **************************************************************************************************/ 00242 int UART1_getch(void) 00243 { 00244 unsigned char buf; 00245 unsigned char nxptr; 00246 unsigned char ipl; 00247 00248 ipl = SRbits.IPL; 00249 SRbits.IPL = 5; 00250 Nop(); 00251 00252 /* バッファが空 */ 00253 if(uart1_rx_stptr == uart1_rx_enptr){ 00254 SRbits.IPL = ipl; 00255 return(-1); 00256 } 00257 00258 /* バッファから1byte取り出す */ 00259 buf = uart1_rx_buf[ uart1_rx_stptr ]; 00260 00261 /* ポインタ更新 */ 00262 nxptr = uart1_rx_stptr + 1; 00263 if(nxptr >= UART1_RX_BUFFER_SIZE) nxptr = 0; 00264 uart1_rx_stptr = nxptr; 00265 00266 SRbits.IPL = ipl; 00267 return(buf); 00268 } 00269 00270 int UART2_getch(void) 00271 { 00272 unsigned char buf; 00273 unsigned char nxptr; 00274 unsigned char ipl; 00275 00276 ipl = SRbits.IPL; 00277 SRbits.IPL = 5; 00278 Nop(); 00279 00280 /* バッファが空 */ 00281 if(uart2_rx_stptr == uart2_rx_enptr){ 00282 SRbits.IPL = ipl; 00283 return(-1); 00284 } 00285 00286 /* バッファから1byte取り出す */ 00287 buf = uart2_rx_buf[ uart2_rx_stptr ]; 00288 00289 /* ポインタ更新 */ 00290 nxptr = uart2_rx_stptr + 1; 00291 if(nxptr >= UART2_RX_BUFFER_SIZE) nxptr = 0; 00292 uart2_rx_stptr = nxptr; 00293 00294 SRbits.IPL = ipl; 00295 return(buf); 00296 } 00297 00298 00299 /************************************************************************************************** 00300 1byte送信 00301 **************************************************************************************************/ 00302 int UART1_putch(unsigned char buf) 00303 { 00304 unsigned char nxptr; 00305 unsigned char ipl; 00306 00307 ipl = SRbits.IPL; 00308 SRbits.IPL = 4; 00309 Nop(); 00310 00311 if(uart1_tx_stptr == uart1_tx_enptr){ 00312 while(!U1STAbits.TRMT); 00313 U1TXREG = buf; 00314 SRbits.IPL = ipl; 00315 return(buf); 00316 } 00317 00318 nxptr = uart1_tx_enptr + 1; 00319 if(nxptr >= UART1_TX_BUFFER_SIZE) nxptr = 0; 00320 if(uart1_tx_stptr == nxptr){ 00321 SRbits.IPL = ipl; 00322 return(-1); 00323 } 00324 00325 /* 送信バッファに1文字入れる */ 00326 uart1_tx_buf[uart1_tx_enptr] = buf; 00327 uart1_tx_enptr = nxptr; 00328 00329 SRbits.IPL = ipl; 00330 return(buf); 00331 } 00332 00333 int UART2_putch(unsigned char buf) 00334 { 00335 unsigned char nxptr; 00336 unsigned char ipl; 00337 00338 ipl = SRbits.IPL; 00339 SRbits.IPL = 4; 00340 Nop(); 00341 00342 if(uart2_tx_stptr == uart2_tx_enptr){ 00343 while(!U2STAbits.TRMT); 00344 U2TXREG = buf; 00345 SRbits.IPL = ipl; 00346 return(buf); 00347 } 00348 00349 nxptr = uart2_tx_enptr + 1; 00350 if(nxptr >= UART2_TX_BUFFER_SIZE) nxptr = 0; 00351 if(uart2_tx_stptr == nxptr){ 00352 SRbits.IPL = ipl; 00353 return(-1); 00354 } 00355 00356 /* 送信バッファに1文字入れる */ 00357 uart2_tx_buf[uart2_tx_enptr] = buf; 00358 uart2_tx_enptr = nxptr; 00359 00360 SRbits.IPL = ipl; 00361 return(buf); 00362 } 00363 00364 00365 /************************************************************************************************** 00366 Nbyte送信 00367 **************************************************************************************************/ 00368 void UART1_putstr(char *buf) 00369 { 00370 while(*buf){ 00371 while(UART1_putch(*buf) < 0); 00372 *buf++; 00373 } 00374 00375 return; 00376 } 00377 00378 void UART2_putstr(char *buf) 00379 { 00380 while(*buf){ 00381 while(UART2_putch(*buf) < 0); 00382 *buf++; 00383 } 00384 00385 return; 00386 } 00387 00388 00389 /************************************************************************************************** 00390 10進送信 00391 **************************************************************************************************/ 00392 void UART1_putint(int digit) 00393 { 00394 if(digit < 0) UART1_putch('-'); 00395 00396 digit = abs(digit); 00397 00398 if(digit > 9999) UART1_putch('0' + digit / 10000 % 10); 00399 if(digit > 999) UART1_putch('0' + digit / 1000 % 10); 00400 if(digit > 99) UART1_putch('0' + digit / 100 % 10); 00401 if(digit > 9) UART1_putch('0' + digit / 10 % 10); 00402 00403 UART1_putch('0' + digit % 10); 00404 return; 00405 } 00406 00407 void UART2_putint(int digit) 00408 { 00409 if(digit < 0) UART2_putch('-'); 00410 00411 digit = abs(digit); 00412 00413 if(digit > 9999) UART2_putch('0' + digit / 10000 % 10); 00414 if(digit > 999) UART2_putch('0' + digit / 1000 % 10); 00415 if(digit > 99) UART2_putch('0' + digit / 100 % 10); 00416 if(digit > 9) UART2_putch('0' + digit / 10 % 10); 00417 00418 UART2_putch('0' + digit % 10); 00419 return; 00420 } 00421 00422 void UART1_putdouble(double digit, unsigned char size2) 00423 { 00424 if(digit < 0) UART1_putch('-'); 00425 00426 digit = abs(digit); 00427 00428 if(digit > 9999) UART1_putch('0' + (unsigned char)(digit / 10000) % 10); 00429 if(digit > 999) UART1_putch('0' + (unsigned char)(digit / 1000) % 10); 00430 if(digit > 99) UART1_putch('0' + (unsigned char)(digit / 100) % 10); 00431 if(digit > 9) UART1_putch('0' + (unsigned char)(digit / 10) % 10); 00432 UART1_putch('0' + (unsigned char)digit % 10); 00433 UART1_putch('.'); 00434 UART1_putch('0' + (unsigned int)(digit * 10.0) % 10); 00435 if(size2 > 1) UART1_putch('0' + (unsigned int)(digit * 100.0) % 10); 00436 if(size2 > 2) UART1_putch('0' + (unsigned int)(digit * 1000.0) % 10); 00437 if(size2 > 3) UART1_putch('0' + (unsigned int)(digit * 10000.0) % 10); 00438 00439 return; 00440 } 00441 00442 void UART2_putdouble(double digit, unsigned char size2) 00443 { 00444 if(digit < 0) UART2_putch('-'); 00445 00446 digit = abs(digit); 00447 00448 if(digit > 9999) UART2_putch('0' + (unsigned char)(digit / 10000) % 10); 00449 if(digit > 999) UART2_putch('0' + (unsigned char)(digit / 1000) % 10); 00450 if(digit > 99) UART2_putch('0' + (unsigned char)(digit / 100) % 10); 00451 if(digit > 9) UART2_putch('0' + (unsigned char)(digit / 10) % 10); 00452 UART2_putch('0' + (unsigned char)digit % 10); 00453 UART2_putch('.'); 00454 UART2_putch('0' + (unsigned int)(digit * 10.0) % 10); 00455 if(size2 > 1) UART2_putch('0' + (unsigned int)(digit * 100.0) % 10); 00456 if(size2 > 2) UART2_putch('0' + (unsigned int)(digit * 1000.0) % 10); 00457 if(size2 > 3) UART2_putch('0' + (unsigned int)(digit * 10000.0) % 10); 00458 00459 return; 00460 } 00461 00462 00463 /************************************************************************************************** 00464 16進送信 00465 **************************************************************************************************/ 00466 void UART1_puthex(unsigned char a) 00467 { 00468 UART1_putch(hex[(a >> 4) & 0x0f]); 00469 UART1_putch(hex[ a & 0x0f]); 00470 return; 00471 } 00472 00473 void UART2_puthex(unsigned char a) 00474 { 00475 UART2_putch(hex[(a >> 4) & 0x0f]); 00476 UART2_putch(hex[ a & 0x0f]); 00477 return; 00478 } 00479 00480 00481 /************************************************************************************************** 00482 空き送信バッファサイズ 00483 **************************************************************************************************/ 00484 unsigned char UART1_get_sendbuf(void) 00485 { 00486 if(uart1_tx_stptr >= uart1_tx_enptr) return(UART1_TX_BUFFER_SIZE - (uart1_tx_stptr - uart1_tx_enptr)); 00487 else return(UART1_TX_BUFFER_SIZE - uart1_tx_enptr + uart1_tx_stptr); 00488 } 00489 00490 unsigned char UART2_get_sendbuf(void) 00491 { 00492 if(uart2_tx_stptr >= uart2_tx_enptr) return(UART2_TX_BUFFER_SIZE - (uart2_tx_stptr - uart2_tx_enptr)); 00493 else return(UART2_TX_BUFFER_SIZE - uart2_tx_enptr + uart2_tx_stptr); 00494 } 00495 00496 00497 /************************************************************************************************** 00498 空き受信バッファサイズ 00499 **************************************************************************************************/ 00500 unsigned char UART1_get_recvbuf(void) 00501 { 00502 if(uart1_rx_stptr >= uart1_rx_enptr) return(UART1_RX_BUFFER_SIZE - (uart1_rx_stptr - uart1_rx_enptr)); 00503 else return(UART1_RX_BUFFER_SIZE - uart1_rx_enptr + uart1_rx_stptr); 00504 } 00505 00506 unsigned char UART2_get_recvbuf(void) 00507 { 00508 if(uart2_rx_stptr >= uart2_rx_enptr) return(UART2_RX_BUFFER_SIZE - (uart2_rx_stptr - uart2_rx_enptr)); 00509 else return(UART2_RX_BUFFER_SIZE - uart2_rx_enptr + uart2_rx_stptr); 00510 } 00511 00512 00513 /************************************************************************************************** 00514 BRGを得る / ボーレートを得る 00515 **************************************************************************************************/ 00516 unsigned int UART_get_brg(unsigned long baud) 00517 { 00518 return( ((cpu_fcy[ OSCTUN ] >> 2) / baud) - 1 ); 00519 } 00520 00521 unsigned long UART1_get_baud(void) 00522 { 00523 return( (unsigned long)(cpu_fcy[ OSCTUN ] >> 2) / (unsigned long)(U1BRG + 1)); 00524 } 00525 00526 unsigned long UART2_get_baud(void) 00527 { 00528 return( (unsigned long)(cpu_fcy[ OSCTUN ] >> 2) / (unsigned long)(U2BRG + 1)); 00529 }