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