ser_i196.c
Go to the documentation of this file.00001
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 #include "hw.h"
00063 #include "serhw.h"
00064
00065 #define SER_HW_ENABLE_TX \
00066 ATOMIC( \
00067 if (!ser_sending) \
00068 { \
00069 ser_sending = true; \
00070 (INT_PEND1 |= INT1F_TI) \
00071 } \
00072 );
00073
00074 static volatile bool ser_sending;
00075
00076
00077 INTERRUPT(0x30) void TI_interrupt(void)
00078 {
00079 if (CANT_SEND)
00080 {
00081 ser_sending = false;
00082 return;
00083 }
00084
00085
00086 if (SP_STAT & SPSF_TX_EMPTY)
00087 {
00088 SBUF = fifo_pop(&ser_txfifo);
00089
00090 if (CANT_SEND)
00091 {
00092 ser_sending = false;
00093 return;
00094 }
00095 }
00096
00097 SBUF = fifo_pop(&ser_txfifo);
00098 }
00099
00100 INTERRUPT(0x32) void RI_interrupt(void)
00101 {
00102 ser_status |= SP_STAT &
00103 (SPSF_OVERRUN_ERROR | SPSF_PARITY_ERROR | SPSF_FRAMING_ERROR);
00104 if (fifo_isfull(&ser_rxfifo))
00105 ser_status |= SERRF_RXFIFOOVERRUN;
00106 else
00107 fifo_push(&ser_rxfifo, SBUF);
00108 }
00109
00110 static void ser_setbaudrate(unsigned long rate)
00111 {
00112
00113 uint16_t baud = (uint16_t)(((CPU_FREQ / 16) / rate) - 1) | 0x8000;
00114 BAUD_RATE = (uint8_t)baud;
00115 BAUD_RATE = (uint8_t)(baud >> 8);
00116 }
00117
00118 static void ser_hw_init(void)
00119 {
00120
00121 SP_CON = SPCF_RECEIVE_ENABLE | SPCF_MODE1;
00122 ioc1_img |= IOC1F_TXD_SEL | IOC1F_EXTINT_SRC;
00123 IOC1 = ioc1_img;
00124
00125
00126 {
00127 uint8_t dummy = SBUF;
00128 }
00129
00130
00131 INT_MASK1 |= INT1F_TI | INT1F_RI;
00132 }
00133