00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #include <avr/io.h>
00019 #include <avr/interrupt.h>
00020 
00021 #include "buffer.h"
00022 #include "uart.h"
00023 
00024 
00025 
00026 volatile u08   uartReadyTx;         
00027 volatile u08   uartBufferedTx;      
00028 
00029 cBuffer uartRxBuffer;               
00030 cBuffer uartTxBuffer;               
00031 unsigned short uartRxOverflow;      
00032 
00033 #ifndef UART_BUFFERS_EXTERNAL_RAM
00034     
00035     
00036     static char uartRxData[UART_RX_BUFFER_SIZE];
00037     static char uartTxData[UART_TX_BUFFER_SIZE];
00038 #endif
00039 
00040 typedef void (*voidFuncPtru08)(unsigned char);
00041 volatile static voidFuncPtru08 UartRxFunc;
00042 
00043 
00044 void uartInit(void)
00045 {
00046     
00047     uartInitBuffers();
00048     
00049     UartRxFunc = 0;
00050 
00051     
00052     outb(UCR, BV(RXCIE)|BV(TXCIE)|BV(RXEN)|BV(TXEN));
00053 
00054     
00055     uartSetBaudRate(UART_DEFAULT_BAUD_RATE);  
00056     
00057     uartReadyTx = TRUE;
00058     uartBufferedTx = FALSE;
00059     
00060     uartRxOverflow = 0;
00061     
00062     sei();
00063 }
00064 
00065 
00066 void uartInitBuffers(void)
00067 {
00068     #ifndef UART_BUFFERS_EXTERNAL_RAM
00069         
00070         bufferInit(&uartRxBuffer, uartRxData, UART_RX_BUFFER_SIZE);
00071         
00072         bufferInit(&uartTxBuffer, uartTxData, UART_TX_BUFFER_SIZE);
00073     #else
00074         
00075         bufferInit(&uartRxBuffer, (u08*) UART_RX_BUFFER_ADDR, UART_RX_BUFFER_SIZE);
00076         
00077         bufferInit(&uartTxBuffer, (u08*) UART_TX_BUFFER_ADDR, UART_TX_BUFFER_SIZE);
00078     #endif
00079 }
00080 
00081 
00082 void uartSetRxHandler(void (*rx_func)(unsigned char c))
00083 {
00084     
00085     UartRxFunc = rx_func;
00086 }
00087 
00088 
00089 void uartSetBaudRate(u32 baudrate)
00090 {
00091     
00092     u16 bauddiv = ((F_CPU+(baudrate*8L))/(baudrate*16L)-1);
00093     outb(UBRRL, bauddiv);
00094     #ifdef UBRRH
00095     outb(UBRRH, bauddiv>>8);
00096     #endif
00097 }
00098 
00099 
00100 cBuffer* uartGetRxBuffer(void)
00101 {
00102     
00103     return &uartRxBuffer;
00104 }
00105 
00106 
00107 cBuffer* uartGetTxBuffer(void)
00108 {
00109     
00110     return &uartTxBuffer;
00111 }
00112 
00113 
00114 void uartSendByte(u08 txData)
00115 {
00116     
00117     while(!uartReadyTx);
00118     
00119     outb(UDR, txData);
00120     
00121     uartReadyTx = FALSE;
00122 }
00123 
00124 
00125 int uartGetByte(void)
00126 {
00127     u08 c;
00128     if(uartReceiveByte(&c))
00129         return c;
00130     else
00131         return -1;
00132 }
00133 
00134 
00135 u08 uartReceiveByte(u08* rxData)
00136 {
00137     
00138     if(uartRxBuffer.size)
00139     {
00140         
00141         if(uartRxBuffer.datalength)
00142         {
00143             
00144             *rxData = bufferGetFromFront(&uartRxBuffer);
00145             return TRUE;
00146         }
00147         else
00148         {
00149             
00150             return FALSE;
00151         }
00152     }
00153     else
00154     {
00155         
00156         return FALSE;
00157     }
00158 }
00159 
00160 
00161 void uartFlushReceiveBuffer(void)
00162 {
00163     
00164     
00165     
00166     uartRxBuffer.datalength = 0;
00167 }
00168 
00169 
00170 u08 uartReceiveBufferIsEmpty(void)
00171 {
00172     if(uartRxBuffer.datalength == 0)
00173     {
00174         return TRUE;
00175     }
00176     else
00177     {
00178         return FALSE;
00179     }
00180 }
00181 
00182 
00183 u08 uartAddToTxBuffer(u08 data)
00184 {
00185     
00186     return bufferAddToEnd(&uartTxBuffer, data);
00187 }
00188 
00189 
00190 void uartSendTxBuffer(void)
00191 {
00192     
00193     uartBufferedTx = TRUE;
00194     
00195     uartSendByte(bufferGetFromFront(&uartTxBuffer));
00196 }
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 
00223 
00224 
00225 
00226 
00227 
00228 
00229 
00230 UART_INTERRUPT_HANDLER(SIG_UART_TRANS)
00231 {
00232     
00233     if(uartBufferedTx)
00234     {
00235         
00236         if(uartTxBuffer.datalength)
00237         {
00238             
00239             outb(UDR, bufferGetFromFront(&uartTxBuffer));
00240         }
00241         else
00242         {
00243             
00244             uartBufferedTx = FALSE;
00245             
00246             uartReadyTx = TRUE;
00247         }
00248     }
00249     else
00250     {
00251         
00252         
00253         uartReadyTx = TRUE;
00254     }
00255 }
00256 
00257 
00258 UART_INTERRUPT_HANDLER(SIG_UART_RECV)
00259 {
00260     u08 c;
00261     
00262     
00263     c = inb(UDR);
00264 
00265     
00266     if(UartRxFunc)
00267     {
00268         
00269         UartRxFunc(c);
00270     }
00271     else
00272     {
00273         
00274         
00275         
00276         if( !bufferAddToEnd(&uartRxBuffer, c) )
00277         {
00278             
00279             
00280             uartRxOverflow++;
00281         }
00282     }
00283 }