00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <avr/io.h>
00042 #include <avr/interrupt.h>
00043 #include <stdlib.h>
00044
00045
00046 #include "uart0.h"
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 #ifndef UART0_TX_BUFFER_SIZE
00057 #define UART0_TX_BUFFER_SIZE 64
00058 #endif
00059
00060 #ifndef UART0_RX_BUFFER_SIZE
00061 #define UART0_RX_BUFFER_SIZE 64
00062 #endif
00063
00064
00065
00066
00067 #define UART0_UBBR_VALUE(Baud) (DIV(F_CPU,(16ul*Baud))-1)
00068
00069
00070 #define UART0_NEXT_INDEX(index,buffer_size) \
00071 { \
00072 u8_t temp = index; \
00073 temp++; \
00074 \
00075 if((buffer_size&(buffer_size-1)) == 0) \
00076 { \
00077 \
00078 temp &= buffer_size-1; \
00079 } \
00080 else \
00081 { \
00082 \
00083 if(temp == (u8_t)buffer_size) temp = 0; \
00084 } \
00085 index = temp; \
00086 }
00087
00088
00089
00090 static u8_t uart0_rx_buffer[UART0_RX_BUFFER_SIZE];
00091 static u8_t uart0_rx_out;
00092 static volatile u8_t uart0_rx_in;
00093
00094
00095 static u8_t uart0_tx_buffer[UART0_TX_BUFFER_SIZE];
00096 static volatile u8_t uart0_tx_out;
00097 static u8_t uart0_tx_in;
00098
00099
00100 static bool_t uart0_tx_finished_flag;
00101
00102
00103
00104 ISR(USART0_RX_vect)
00105 {
00106 u8_t ucsra = UCSR0A;
00107 u8_t data = UDR0;
00108 u8_t index = uart0_rx_in;
00109
00110
00111 UART0_NEXT_INDEX(index, UART0_RX_BUFFER_SIZE);
00112
00113
00114 if(index == uart0_rx_out)
00115 {
00116
00117 return;
00118 }
00119
00120
00121 if(ucsra & ((1<<FE)|(1<<DOR)|(1<<UPE)))
00122 {
00123
00124 return;
00125 }
00126
00127
00128 uart0_rx_buffer[uart0_rx_in] = data;
00129
00130
00131 uart0_rx_in = index;
00132 }
00133
00134
00135 ISR(USART0_UDRE_vect)
00136 {
00137
00138 if(uart0_tx_out == uart0_tx_in)
00139 {
00140
00141 BIT_SET_LO(UCSR0B, UDRIE);
00142
00143
00144 BIT_SET_HI(UCSR0B, TXCIE);
00145
00146 return;
00147 }
00148
00149
00150 uart0_tx_finished_flag = FALSE;
00151
00152
00153 UDR0 = uart0_tx_buffer[uart0_tx_out];
00154
00155
00156 UART0_NEXT_INDEX(uart0_tx_out, UART0_TX_BUFFER_SIZE);
00157 }
00158
00159
00160 ISR(USART0_TX_vect)
00161 {
00162
00163 uart0_tx_finished_flag = TRUE;
00164
00165
00166 BIT_SET_LO(UCSR0B, TXCIE);
00167 }
00168
00169
00170 void uart0_init(u32_t baud,
00171 u8_t data_bits,
00172 uart0_parity_t parity,
00173 u8_t stop_bits)
00174 {
00175 u8_t ucsrc = 0x00;
00176
00177
00178 uart0_rx_out = 0;
00179 uart0_rx_in = 0;
00180 uart0_tx_out = 0;
00181 uart0_tx_in = 0;
00182 uart0_tx_finished_flag = TRUE;
00183
00184 switch(parity)
00185 {
00186 case UART0_ODD_PARITY :
00187
00188 ucsrc |= (1<<UPM01) | (1<<UPM00);
00189 break;
00190 case UART0_EVEN_PARITY :
00191
00192 ucsrc |= (1<<UPM01) | (0<<UPM00);
00193 break;
00194 case UART0_NO_PARITY :
00195
00196 default:
00197
00198 ucsrc |= (0<<UPM01) | (0<<UPM00);
00199 break;
00200 }
00201
00202 switch(data_bits)
00203 {
00204 case 5:
00205
00206 ucsrc |= (0<<UCSZ02) | (0<<UCSZ01) | (0<<UCSZ00);
00207 break;
00208 case 6:
00209
00210 ucsrc |= (0<<UCSZ02) | (0<<UCSZ01) | (1<<UCSZ00);
00211 break;
00212 case 7:
00213
00214 ucsrc |= (0<<UCSZ02) | (1<<UCSZ01) | (0<<UCSZ00);
00215 break;
00216 case 8:
00217
00218 default:
00219
00220 ucsrc |= (0<<UCSZ02) | (1<<UCSZ01) | (1<<UCSZ00);
00221 break;
00222 }
00223
00224 uart0_change_baud(baud);
00225 }
00226
00227 void uart0_change_baud(u32_t baud)
00228 {
00229 u16_t ubrr;
00230 ldiv_t div;
00231
00232
00233 UCSR0B = 0;
00234
00235
00236 baud <<= 4;
00237 div = ldiv(F_CPU, baud);
00238 ubrr = (u16_t)div.quot;
00239 baud >>= 1;
00240 if((u32_t)(div.rem) < baud)
00241 {
00242 ubrr--;
00243 }
00244
00245 UBRR0H = U16_HI8(ubrr);
00246 UBRR0L = U16_LO8(ubrr);
00247
00248
00249 UCSR0B = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
00250 }
00251
00252 bool_t uart0_rx_buffer_empty(void)
00253 {
00254
00255 if(uart0_rx_out == uart0_rx_in)
00256 {
00257 return FALSE;
00258 }
00259 else
00260 {
00261 return TRUE;
00262 }
00263 }
00264
00265
00266 bool_t uart0_get_rx_byte(u8_t* data)
00267 {
00268
00269 if(uart0_rx_out == uart0_rx_in)
00270 {
00271 return FALSE;
00272 }
00273
00274 *data = uart0_rx_buffer[uart0_rx_out];
00275
00276
00277 UART0_NEXT_INDEX(uart0_rx_out, UART0_RX_BUFFER_SIZE);
00278
00279 return TRUE;
00280 }
00281
00282 u8_t uart0_get_rx_data(u8_t* buffer, u8_t max_buf_size)
00283 {
00284 u8_t data_received = 0;
00285
00286 while(max_buf_size)
00287 {
00288
00289 if(uart0_rx_out == uart0_rx_in)
00290 {
00291 break;
00292 }
00293
00294 *buffer++ = uart0_rx_buffer[uart0_rx_out];
00295
00296
00297 UART0_NEXT_INDEX(uart0_rx_out, UART0_RX_BUFFER_SIZE);
00298
00299
00300 data_received++;
00301 max_buf_size--;
00302 }
00303
00304 return data_received;
00305 }
00306
00307 bool_t uart0_tx_buffer_full(void)
00308 {
00309 u8_t index = uart0_tx_in;
00310
00311
00312 UART0_NEXT_INDEX(index, UART0_TX_BUFFER_SIZE);
00313
00314 if(index == uart0_tx_out)
00315 {
00316 return TRUE;
00317 }
00318 else
00319 {
00320 return FALSE;
00321 }
00322 }
00323
00324 bool_t uart0_tx_buffer_empty(void)
00325 {
00326 if(uart0_tx_out == uart0_tx_in)
00327 {
00328 return TRUE;
00329 }
00330 else
00331 {
00332 return FALSE;
00333 }
00334 }
00335
00336 bool_t uart0_tx_finished(void)
00337 {
00338 if(uart0_tx_out != uart0_tx_in)
00339 {
00340 return FALSE;
00341 }
00342 return uart0_tx_finished_flag;
00343 }
00344
00345 bool_t uart0_tx_byte(u8_t data)
00346 {
00347 u8_t index = uart0_tx_in;
00348
00349
00350 UART0_NEXT_INDEX(index, UART0_TX_BUFFER_SIZE);
00351
00352
00353 if(index == uart0_tx_out)
00354 {
00355 return FALSE;
00356 }
00357
00358
00359 uart0_tx_buffer[uart0_tx_in] = data;
00360
00361
00362 uart0_tx_in = index;
00363
00364
00365 BIT_SET_HI(UCSR0B, UDRIE);
00366
00367 return TRUE;
00368 }
00369
00370 u8_t uart0_tx_data(const u8_t* data, u8_t bytes_to_send)
00371 {
00372 u8_t bytes_buffered = 0;
00373 u8_t index;
00374
00375 while(bytes_to_send)
00376 {
00377
00378 index = uart0_tx_in;
00379 UART0_NEXT_INDEX(index, UART0_TX_BUFFER_SIZE);
00380
00381
00382 if(index == uart0_tx_out)
00383 {
00384 break;
00385 }
00386
00387
00388 uart0_tx_buffer[uart0_tx_in] = *data++;
00389
00390
00391 uart0_tx_in = index;
00392
00393
00394 bytes_buffered++;
00395 bytes_to_send--;
00396 }
00397
00398
00399 BIT_SET_HI(UCSR0B, UDRIE);
00400
00401 return bytes_buffered;
00402 }
00403
00404
00405
00406
00407
00408
00409
00410