00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <io.h>
00019 #include <interrupt.h>
00020 #include <sig-avr.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
00033
00034 SIGNAL(SIG_UART_TRANS)
00035 {
00036
00037 if(uartBufferedTx)
00038 {
00039
00040 if(uartTxBuffer.datalength)
00041 {
00042
00043 outp( bufferGetFromFront(&uartTxBuffer), UDR );
00044 }
00045 else
00046 {
00047
00048 uartBufferedTx = FALSE;
00049
00050 uartReadyTx = TRUE;
00051 }
00052 }
00053 else
00054 {
00055
00056
00057 uartReadyTx = TRUE;
00058 }
00059 }
00060
00061
00062 SIGNAL(SIG_UART_RECV)
00063 {
00064
00065
00066 if( !bufferAddToEnd(&uartRxBuffer, inp(UDR)) )
00067 {
00068
00069
00070 }
00071 }
00072
00073 void uartInitBuffers(void)
00074 {
00075
00076 bufferInit(&uartRxBuffer, (u08*) UART_RX_BUFFER_ADDR, UART_RX_BUFFER_SIZE);
00077
00078 bufferInit(&uartTxBuffer, (u08*) UART_TX_BUFFER_ADDR, UART_TX_BUFFER_SIZE);
00079 }
00080
00081 void uartSetBaudRate(u16 baudrate)
00082 {
00083
00084 outp( (u08)((F_CPU+(baudrate*8L))/(baudrate*16L)-1), UBRR);
00085 }
00086
00087 void uartInit(void)
00088 {
00089
00090 uartInitBuffers();
00091
00092
00093
00094
00095
00096 outp(BV(RXCIE)|BV(TXCIE)|BV(RXEN)|BV(TXEN),UCSRB);
00097
00098
00099 uartSetBaudRate(UART_BAUD_RATE);
00100
00101 sei();
00102
00103 uartReadyTx = TRUE;
00104 }
00105
00106 cBuffer* uartGetRxBuffer(void)
00107 {
00108
00109 return &uartRxBuffer;
00110 }
00111
00112 cBuffer* uartGetTxBuffer(void)
00113 {
00114
00115 return &uartTxBuffer;
00116 }
00117
00118 void uartSendByte(u08 txData)
00119 {
00120
00121 while(!uartReadyTx);
00122
00123 outp( txData, UDR );
00124
00125 uartReadyTx = FALSE;
00126 }
00127
00128 u08 uartReceiveByte(u08* rxData)
00129 {
00130
00131 if(uartRxBuffer.size)
00132 {
00133
00134 if(uartRxBuffer.datalength)
00135 {
00136
00137 *rxData = bufferGetFromFront(&uartRxBuffer);
00138 return TRUE;
00139 }
00140 else
00141 {
00142
00143 return FALSE;
00144 }
00145 }
00146 else
00147 {
00148
00149 return FALSE;
00150 }
00151 }
00152
00153 void uartFlushReceiveBuffer(void)
00154 {
00155
00156 bufferFlush(&uartRxBuffer);
00157
00158
00159 }
00160
00161 u08 uartReceiveBufferIsEmpty(void)
00162 {
00163 if(uartRxBuffer.datalength == 0)
00164 {
00165 return TRUE;
00166 }
00167 else
00168 {
00169 return FALSE;
00170 }
00171 }
00172
00173 void uartSendTxBuffer(void)
00174 {
00175
00176 uartBufferedTx = TRUE;
00177
00178 uartSendByte(bufferGetFromFront(&uartTxBuffer));
00179 }
00180
00181 u08 uartSendBuffer(char *buffer, u16 nBytes)
00182 {
00183 register u08 first;
00184 register u16 i;
00185
00186
00187 if((uartTxBuffer.datalength + nBytes < uartTxBuffer.size) && nBytes)
00188 {
00189
00190 first = *buffer++;
00191
00192 for(i = 0; i < nBytes-1; i++)
00193 {
00194
00195 uartTxBuffer.dataptr[(uartTxBuffer.dataindex + uartTxBuffer.datalength) % uartTxBuffer.size] = *buffer++;
00196
00197 uartTxBuffer.datalength++;
00198 }
00199
00200
00201 uartBufferedTx = TRUE;
00202 uartSendByte(first);
00203
00204 return TRUE;
00205 }
00206 else
00207 {
00208
00209 return FALSE;
00210 }
00211 }