00001
00034 #include <ioavr.h>
00035 #include <inavr.h>
00036 #include "stdint.h"
00037 #include "single_wire_UART.h"
00038
00039
00040 #define UART_STATE_IDLE 0
00041 #define RECEIVE_FIRST_DATA 3
00042 #define RECEIVE_LAST_DATA 17
00043 #define RECEIVE_STOP_1 19
00044 #define RECEIVE_FINISH 23
00045 #define TRANSMIT_FIRST_DATA 2
00046 #define TRANSMIT_LAST_DATA 16
00047 #define TRANSMIT_STOP_1 18
00048 #define TRANSMIT_STOP_2 20
00049 #define TRANSMIT_FINISH 22
00050
00051
00052 void SW_UART_Complete_Transfer(void);
00053 void SW_UART_Initiate_Transmission(void);
00054
00055 volatile uint8_t SW_UART_status;
00056 static volatile uint8_t UART_counter;
00057
00058
00059 static volatile uint8_t UART_Tx_data;
00060 static volatile uint8_t UART_Rx_data;
00061 static volatile uint8_t UART_Tx_buffer;
00062 static volatile uint8_t UART_Rx_buffer;
00063
00064
00077 void SW_UART_Enable(void)
00078 {
00079
00080 INITIALIZE_UART_PIN();
00081
00082 SW_UART_status = 0x00;
00083 UART_counter = UART_STATE_IDLE;
00084 CLEAR_UART_TIMER_ON_COMPARE_MATCH();
00085
00086
00087 INITIALIZE_UART_EXTERNAL_INTERRUPT();
00088 CLEAR_UART_EXTERNAL_INTERRUPT_FLAG();
00089 ENABLE_UART_EXTERNAL_INTERRUPT();
00090 }
00091
00092
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00121 void SW_UART_Transmit(uint8_t data)
00122 {
00123 SET_FLAG( SW_UART_status, SW_UART_TX_BUFFER_FULL );
00124 UART_Tx_buffer = data;
00125
00126
00127 if( UART_counter == UART_STATE_IDLE )
00128 {
00129
00130 UART_Tx_data = UART_Tx_buffer;
00131 CLEAR_FLAG( SW_UART_status, SW_UART_TX_BUFFER_FULL );
00132
00133 DISABLE_UART_EXTERNAL_INTERRUPT();
00134 CLEAR_UART_PIN();
00135 UART_counter = TRANSMIT_FIRST_DATA;
00136 CLEAR_UART_TIMER();
00137 SET_UART_TIMER_COMPARE_START_TRANSMIT();
00138 CLEAR_UART_TIMER_INTERRUPT_FLAG();
00139 ENABLE_UART_TIMER_INTERRUPT();
00140 START_UART_TIMER();
00141 }
00142 }
00143
00144
00156 uint8_t SW_UART_Receive(void)
00157 {
00158 uint8_t data;
00159 data = UART_Rx_buffer;
00160 CLEAR_FLAG( SW_UART_status, SW_UART_RX_BUFFER_FULL );
00161 return data;
00162 }
00163
00164
00173 #pragma vector=SW_UART_EXTERNAL_INTERRUPT_VECTOR
00174 __interrupt void External_SW_UART_ISR(void)
00175 {
00176
00177 if(!READ_UART_PIN())
00178 {
00179 UART_counter = RECEIVE_FIRST_DATA;
00180 UART_Rx_data = 0x00;
00181 STOP_UART_TIMER();
00182 CLEAR_UART_TIMER();
00183 SET_UART_TIMER_COMPARE_START_RECEIVE();
00184 DISABLE_UART_EXTERNAL_INTERRUPT();
00185 CLEAR_UART_TIMER_INTERRUPT_FLAG();
00186 ENABLE_UART_TIMER_INTERRUPT();
00187 START_UART_TIMER();
00188 }
00189 }
00190
00191
00203 #pragma vector=SW_UART_TIMER_COMPARE_INTERRUPT_VECTOR
00204 __interrupt void Timer_SW_UART_ISR(void)
00205 {
00206 SET_UART_TIMER_COMPARE_WAIT_ONE();
00207
00208
00209 uint8_t bit_in = 0x00;
00210 if(READ_UART_PIN())
00211 {
00212 bit_in = 0x01;
00213 }
00214
00216
00218 if(UART_counter & 0x01)
00219 {
00220
00221 if(UART_counter <= RECEIVE_LAST_DATA)
00222 {
00223 UART_Rx_data = ( UART_Rx_data >> 1 );
00224 if(bit_in)
00225 {
00226 UART_Rx_data |= 0x80;
00227 }
00228 }
00229
00230
00231 else if(UART_counter == RECEIVE_STOP_1)
00232 {
00233
00234 if(!bit_in)
00235 {
00236 SET_FLAG( SW_UART_status, SW_UART_FRAME_ERROR );
00237
00238 }
00239
00240
00241 if( READ_FLAG(SW_UART_status, SW_UART_RX_BUFFER_FULL))
00242 {
00243 SET_FLAG(SW_UART_status, SW_UART_RX_BUFFER_OVERFLOW);
00244 }
00245
00246 UART_Rx_buffer = UART_Rx_data;
00247 SET_FLAG( SW_UART_status, SW_UART_RX_BUFFER_FULL );
00248 CLEAR_UART_EXTERNAL_INTERRUPT_FLAG();
00249 ENABLE_UART_EXTERNAL_INTERRUPT();
00250 }
00251
00252
00253 else if(UART_counter == RECEIVE_FINISH)
00254 {
00255
00256
00257 if( READ_FLAG(SW_UART_status, SW_UART_TX_BUFFER_FULL) )
00258 {
00259 UART_Tx_data = UART_Tx_buffer;
00260 CLEAR_FLAG( SW_UART_status, SW_UART_TX_BUFFER_FULL );
00261 DISABLE_UART_EXTERNAL_INTERRUPT();
00262 CLEAR_UART_PIN();
00263 UART_counter = TRANSMIT_FIRST_DATA;
00264 STOP_UART_TIMER();
00265 CLEAR_UART_TIMER();
00266 SET_UART_TIMER_COMPARE_START_TRANSMIT();
00267 CLEAR_UART_TIMER_INTERRUPT_FLAG();
00268 START_UART_TIMER();
00269 return;
00270 }
00271
00272
00273 else
00274 {
00275 STOP_UART_TIMER();
00276 DISABLE_UART_TIMER_INTERRUPT();
00277 UART_counter = UART_STATE_IDLE;
00278 return;
00279 }
00280 }
00281 }
00282
00284
00286 else
00287 {
00288 uint8_t bit_out = 0x00;
00289
00290
00291 if(UART_counter != TRANSMIT_FIRST_DATA)
00292 {
00293 uint8_t last_bit_sent = 0x01;
00294
00295 if(UART_counter <= TRANSMIT_STOP_1)
00296 {
00297 last_bit_sent = UART_Tx_data & 0x01;
00298 UART_Tx_data = UART_Tx_data >> 1;
00299 }
00300
00301
00302 if( last_bit_sent != bit_in )
00303 {
00304 SET_FLAG(SW_UART_status, SW_UART_FRAME_ERROR);
00305
00306 }
00307 }
00308
00309
00310 if(UART_counter <= TRANSMIT_LAST_DATA)
00311 {
00312 if( UART_Tx_data & 0x01 )
00313 {
00314 bit_out = 0x01;
00315 }
00316 }
00317
00318
00319 else if(UART_counter == TRANSMIT_STOP_1)
00320 {
00321 bit_out = 0x01;
00322 }
00323 else if(UART_counter == TRANSMIT_STOP_2)
00324 {
00325 CLEAR_UART_EXTERNAL_INTERRUPT_FLAG();
00326 ENABLE_UART_EXTERNAL_INTERRUPT();
00327 bit_out = 0x01;
00328 }
00329
00330
00331
00332 else
00333 {
00334
00335
00336 if(!READ_FLAG(SW_UART_status, SW_UART_TX_BUFFER_FULL))
00337 {
00338 STOP_UART_TIMER();
00339 DISABLE_UART_TIMER_INTERRUPT();
00340 UART_counter = UART_STATE_IDLE;
00341 return;
00342 }
00343
00344
00345 else
00346 {
00347 UART_Tx_data = UART_Tx_buffer;
00348 CLEAR_FLAG( SW_UART_status, SW_UART_TX_BUFFER_FULL );
00349 UART_counter = TRANSMIT_FIRST_DATA - 2;
00350 DISABLE_UART_EXTERNAL_INTERRUPT();
00351
00352 }
00353 }
00354
00355
00356 if( bit_out )
00357 {
00358 SET_UART_PIN();
00359 }
00360 else
00361 {
00362 CLEAR_UART_PIN();
00363 }
00364 }
00365 UART_counter = UART_counter + 2;
00366 }