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 }