TX and RX FIFO. RX FIFO was tested. TX FIFO not fully tested.

Dependents:   STM32F030R8_SOMO-14D

Committer:
issaiass
Date:
Fri Mar 13 01:11:54 2015 +0000
Revision:
0:35d1a2c4fb6d
TX and RX bufer.; ; The buffers are not fully tested, just only the receive buffer.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
issaiass 0:35d1a2c4fb6d 1 /*
issaiass 0:35d1a2c4fb6d 2 *******************************************************************************
issaiass 0:35d1a2c4fb6d 3 * CERES CONTROLS
issaiass 0:35d1a2c4fb6d 4 * PANAMA, REPULIC OF PANAMA
issaiass 0:35d1a2c4fb6d 5 *
issaiass 0:35d1a2c4fb6d 6 * File : MessageQueue.cpp
issaiass 0:35d1a2c4fb6d 7 * Programmer(s) : Rangel Alvarado
issaiass 0:35d1a2c4fb6d 8 * Language : ANSI-C
issaiass 0:35d1a2c4fb6d 9 * Description : Function prototypes of serial Tx and Rx, buffer and utils.
issaiass 0:35d1a2c4fb6d 10 *
issaiass 0:35d1a2c4fb6d 11 * Note : Dependancies of mbed libraries...
issaiass 0:35d1a2c4fb6d 12 * - Serial
issaiass 0:35d1a2c4fb6d 13 * RX Buffer fully developed
issaiass 0:35d1a2c4fb6d 14 * TX Buffer is not fully implemented, can't change IRQ from
issaiass 0:35d1a2c4fb6d 15 * TX Empty to other interrupt without be hardware specific.
issaiass 0:35d1a2c4fb6d 16 * ----------------------------------------------------------------------------
issaiass 0:35d1a2c4fb6d 17 * HISTORY
issaiass 0:35d1a2c4fb6d 18 * DD MM AA
issaiass 0:35d1a2c4fb6d 19 * 09 03 15 Created.
issaiass 0:35d1a2c4fb6d 20 * 09 03 15 Modified.
issaiass 0:35d1a2c4fb6d 21 * 12 03 15 Import to mbed platform.
issaiass 0:35d1a2c4fb6d 22 *******************************************************************************
issaiass 0:35d1a2c4fb6d 23 */
issaiass 0:35d1a2c4fb6d 24
issaiass 0:35d1a2c4fb6d 25 /*
issaiass 0:35d1a2c4fb6d 26 *******************************************************************************
issaiass 0:35d1a2c4fb6d 27 * INCLUDE FILES
issaiass 0:35d1a2c4fb6d 28 *******************************************************************************
issaiass 0:35d1a2c4fb6d 29 */
issaiass 0:35d1a2c4fb6d 30
issaiass 0:35d1a2c4fb6d 31 #include "includes.h" /* General Include file */
issaiass 0:35d1a2c4fb6d 32 Serial ser(MSG_TX_PIN, MSG_RX_PIN); /* Serial Port configuration */
issaiass 0:35d1a2c4fb6d 33
issaiass 0:35d1a2c4fb6d 34
issaiass 0:35d1a2c4fb6d 35 /*
issaiass 0:35d1a2c4fb6d 36 *******************************************************************************
issaiass 0:35d1a2c4fb6d 37 * DATA TYPES
issaiass 0:35d1a2c4fb6d 38 *******************************************************************************
issaiass 0:35d1a2c4fb6d 39 */
issaiass 0:35d1a2c4fb6d 40
issaiass 0:35d1a2c4fb6d 41 MSG_BUF MsgFifo; /* Call a buffer */
issaiass 0:35d1a2c4fb6d 42
issaiass 0:35d1a2c4fb6d 43
issaiass 0:35d1a2c4fb6d 44 /*
issaiass 0:35d1a2c4fb6d 45 *******************************************************************************
issaiass 0:35d1a2c4fb6d 46 *
issaiass 0:35d1a2c4fb6d 47 * CONFIGURE RECEIVER INTERRUPT
issaiass 0:35d1a2c4fb6d 48 *
issaiass 0:35d1a2c4fb6d 49 * Description : Configure a function to attach an interrupt for the receiver
issaiass 0:35d1a2c4fb6d 50 * Arguments : msgfunc pointer to the function to call
issaiass 0:35d1a2c4fb6d 51 * Return : None
issaiass 0:35d1a2c4fb6d 52 * Notes : Character arrived interrupt
issaiass 0:35d1a2c4fb6d 53 *******************************************************************************
issaiass 0:35d1a2c4fb6d 54 */
issaiass 0:35d1a2c4fb6d 55
issaiass 0:35d1a2c4fb6d 56 void MsgRxISRCfg(void (*msgfunc)(void)) {
issaiass 0:35d1a2c4fb6d 57 ser.attach(msgfunc, Serial::RxIrq); /* Attach a function to RX ISR */
issaiass 0:35d1a2c4fb6d 58 }
issaiass 0:35d1a2c4fb6d 59
issaiass 0:35d1a2c4fb6d 60
issaiass 0:35d1a2c4fb6d 61 /*
issaiass 0:35d1a2c4fb6d 62 *******************************************************************************
issaiass 0:35d1a2c4fb6d 63 *
issaiass 0:35d1a2c4fb6d 64 * CONFIGURE TRANSMITTER INTERRUPT
issaiass 0:35d1a2c4fb6d 65 *
issaiass 0:35d1a2c4fb6d 66 * Description : Configure a function to attach an interrupt for transmitter
issaiass 0:35d1a2c4fb6d 67 * Arguments : msgfunc pointer to the function to call
issaiass 0:35d1a2c4fb6d 68 * Return : None
issaiass 0:35d1a2c4fb6d 69 * Notes : TX Empty Interrupt only
issaiass 0:35d1a2c4fb6d 70 *******************************************************************************
issaiass 0:35d1a2c4fb6d 71 */
issaiass 0:35d1a2c4fb6d 72
issaiass 0:35d1a2c4fb6d 73 void MsgTxISRCfg(void (*msgfunc)(void)) {
issaiass 0:35d1a2c4fb6d 74 ser.attach(msgfunc, Serial::TxIrq); /* Attach a function to TX ISR */
issaiass 0:35d1a2c4fb6d 75 }
issaiass 0:35d1a2c4fb6d 76
issaiass 0:35d1a2c4fb6d 77
issaiass 0:35d1a2c4fb6d 78 /*
issaiass 0:35d1a2c4fb6d 79 *******************************************************************************
issaiass 0:35d1a2c4fb6d 80 *
issaiass 0:35d1a2c4fb6d 81 * GENERATE CHECKSUM FROM THE BUFFER
issaiass 0:35d1a2c4fb6d 82 *
issaiass 0:35d1a2c4fb6d 83 * Description : Get an array and calculate the CRC8
issaiass 0:35d1a2c4fb6d 84 * Arguments : pdata pointer to the data to analyze
issaiass 0:35d1a2c4fb6d 85 * size the lenght of the array to calculate the checksum
issaiass 0:35d1a2c4fb6d 86 * Return : A byte that represents the checksum of the array
issaiass 0:35d1a2c4fb6d 87 * Notes : None
issaiass 0:35d1a2c4fb6d 88 *******************************************************************************
issaiass 0:35d1a2c4fb6d 89 */
issaiass 0:35d1a2c4fb6d 90
issaiass 0:35d1a2c4fb6d 91 INT8U MsgChkSum(INT8U *pdata, INT8U size) {
issaiass 0:35d1a2c4fb6d 92 INT8U i; /* Iterator */
issaiass 0:35d1a2c4fb6d 93 INT8U crc; /* CRC calculator */
issaiass 0:35d1a2c4fb6d 94
issaiass 0:35d1a2c4fb6d 95
issaiass 0:35d1a2c4fb6d 96 crc = 0; /* Initialize CRC result */
issaiass 0:35d1a2c4fb6d 97 for (i = 0; i < size; i++) /* Iterate from the first to last */
issaiass 0:35d1a2c4fb6d 98 crc += *pdata++; /* Sum the last and next byte */
issaiass 0:35d1a2c4fb6d 99 crc ^= 0xFF; /* XOR the value */
issaiass 0:35d1a2c4fb6d 100 return (crc); /* return the CRC result */
issaiass 0:35d1a2c4fb6d 101 }
issaiass 0:35d1a2c4fb6d 102
issaiass 0:35d1a2c4fb6d 103
issaiass 0:35d1a2c4fb6d 104 /*
issaiass 0:35d1a2c4fb6d 105 *******************************************************************************
issaiass 0:35d1a2c4fb6d 106 *
issaiass 0:35d1a2c4fb6d 107 * INITIALIZE THE TRANSMISSION AND RECEIVER BUFFER
issaiass 0:35d1a2c4fb6d 108 *
issaiass 0:35d1a2c4fb6d 109 * Description : Default values for the TX and RX Buffer
issaiass 0:35d1a2c4fb6d 110 * Arguments : None
issaiass 0:35d1a2c4fb6d 111 * Return : None
issaiass 0:35d1a2c4fb6d 112 * Notes : None
issaiass 0:35d1a2c4fb6d 113 *******************************************************************************
issaiass 0:35d1a2c4fb6d 114 */
issaiass 0:35d1a2c4fb6d 115
issaiass 0:35d1a2c4fb6d 116 void MsgBufInit(void) {
issaiass 0:35d1a2c4fb6d 117 MsgFifo.MsgRxBufHd = 0; /* Buffer RX head at position 0 */
issaiass 0:35d1a2c4fb6d 118 MsgFifo.MsgRxBufTl = 0; /* Buffer RX tail at position 0 */
issaiass 0:35d1a2c4fb6d 119 MsgFifo.MsgRxBufCtr = 0; /* Buffer RX counter at 0 */
issaiass 0:35d1a2c4fb6d 120 MsgFifo.MsgTxBufHd = 0; /* Buffer TX head at position 0 */
issaiass 0:35d1a2c4fb6d 121 MsgFifo.MsgTxBufTl = 0; /* Buffer TX tail at position 0 */
issaiass 0:35d1a2c4fb6d 122 MsgFifo.MsgTxBufCtr = 0; /* Buffer TX counter at 0 */
issaiass 0:35d1a2c4fb6d 123 }
issaiass 0:35d1a2c4fb6d 124
issaiass 0:35d1a2c4fb6d 125
issaiass 0:35d1a2c4fb6d 126 /*
issaiass 0:35d1a2c4fb6d 127 *******************************************************************************
issaiass 0:35d1a2c4fb6d 128 *
issaiass 0:35d1a2c4fb6d 129 * RECEIVE A BYTE FROM THE SERIAL PORT
issaiass 0:35d1a2c4fb6d 130 *
issaiass 0:35d1a2c4fb6d 131 * Description : Read a byte
issaiass 0:35d1a2c4fb6d 132 * Arguments : None
issaiass 0:35d1a2c4fb6d 133 * Return : The received byte from the serial port
issaiass 0:35d1a2c4fb6d 134 * Notes : None
issaiass 0:35d1a2c4fb6d 135 *******************************************************************************
issaiass 0:35d1a2c4fb6d 136 */
issaiass 0:35d1a2c4fb6d 137
issaiass 0:35d1a2c4fb6d 138 INT8U MsgGet(void) {
issaiass 0:35d1a2c4fb6d 139 return(ser.getc()); /* Return the byte from serial */
issaiass 0:35d1a2c4fb6d 140 }
issaiass 0:35d1a2c4fb6d 141
issaiass 0:35d1a2c4fb6d 142
issaiass 0:35d1a2c4fb6d 143 /*
issaiass 0:35d1a2c4fb6d 144 *******************************************************************************
issaiass 0:35d1a2c4fb6d 145 *
issaiass 0:35d1a2c4fb6d 146 * GET A BYTE FROM THE RECEIVER BUFFER
issaiass 0:35d1a2c4fb6d 147 *
issaiass 0:35d1a2c4fb6d 148 * Description : Get a byte from the buffer
issaiass 0:35d1a2c4fb6d 149 * Arguments : None
issaiass 0:35d1a2c4fb6d 150 * Return : Returns a byte from the receiver buffer
issaiass 0:35d1a2c4fb6d 151 * Notes : None
issaiass 0:35d1a2c4fb6d 152 *******************************************************************************
issaiass 0:35d1a2c4fb6d 153 */
issaiass 0:35d1a2c4fb6d 154
issaiass 0:35d1a2c4fb6d 155 INT8U MsgGetChar(void) {
issaiass 0:35d1a2c4fb6d 156 INT8U temp; /* Temporal for byte return */
issaiass 0:35d1a2c4fb6d 157
issaiass 0:35d1a2c4fb6d 158
issaiass 0:35d1a2c4fb6d 159 temp = 0; /* Initialize return data */
issaiass 0:35d1a2c4fb6d 160 OS_ENTER_CRITICAL(); /* Disable Global Interrupts */
issaiass 0:35d1a2c4fb6d 161 if (MsgFifo.MsgRxBufCtr > 0) { /* If there is something on FIFO */
issaiass 0:35d1a2c4fb6d 162 MsgFifo.MsgRxBufCtr--; /* Substract quantity on RX FIFO */
issaiass 0:35d1a2c4fb6d 163 temp = MsgFifo.MsgRxBuf[MsgFifo.MsgRxBufTl++]; /* Get from RX Buffer */
issaiass 0:35d1a2c4fb6d 164 if (MsgFifo.MsgRxBufTl == MSG_RX_MAX_CHAR) /* If RX FIFO is Full */
issaiass 0:35d1a2c4fb6d 165 MsgFifo.MsgRxBufTl = 0; /* No characters to extract */
issaiass 0:35d1a2c4fb6d 166 }
issaiass 0:35d1a2c4fb6d 167 OS_EXIT_CRITICAL(); /* Enable Global Interrupts */
issaiass 0:35d1a2c4fb6d 168 return (temp); /* Return the data */
issaiass 0:35d1a2c4fb6d 169 }
issaiass 0:35d1a2c4fb6d 170
issaiass 0:35d1a2c4fb6d 171
issaiass 0:35d1a2c4fb6d 172 /*
issaiass 0:35d1a2c4fb6d 173 *******************************************************************************
issaiass 0:35d1a2c4fb6d 174 *
issaiass 0:35d1a2c4fb6d 175 * INSERT A BYTE ON THE RX BUFFER
issaiass 0:35d1a2c4fb6d 176 *
issaiass 0:35d1a2c4fb6d 177 * Description : Insert a byte in the RX buffer
issaiass 0:35d1a2c4fb6d 178 * Arguments : data a byte that holds the character to insert
issaiass 0:35d1a2c4fb6d 179 * Return : None
issaiass 0:35d1a2c4fb6d 180 * Notes : None
issaiass 0:35d1a2c4fb6d 181 *******************************************************************************
issaiass 0:35d1a2c4fb6d 182 */
issaiass 0:35d1a2c4fb6d 183
issaiass 0:35d1a2c4fb6d 184 void MsgPutRxChar(INT8U data) {
issaiass 0:35d1a2c4fb6d 185 if (MsgFifo.MsgRxBufCtr < MSG_RX_MAX_CHAR) { /* If is still space on FIFO */
issaiass 0:35d1a2c4fb6d 186 MsgFifo.MsgRxBufCtr++; /* Increase the size by one */
issaiass 0:35d1a2c4fb6d 187 MsgFifo.MsgRxBuf[MsgFifo.MsgRxBufHd++] = data; /* Insert the byte */
issaiass 0:35d1a2c4fb6d 188 if (MsgFifo.MsgRxBufHd == MSG_RX_MAX_CHAR) /* If FIFO is Full */
issaiass 0:35d1a2c4fb6d 189 MsgFifo.MsgRxBufHd = 0; /* Insertion FIFO restored to 0 */
issaiass 0:35d1a2c4fb6d 190 }
issaiass 0:35d1a2c4fb6d 191 }
issaiass 0:35d1a2c4fb6d 192
issaiass 0:35d1a2c4fb6d 193
issaiass 0:35d1a2c4fb6d 194 /*
issaiass 0:35d1a2c4fb6d 195 *******************************************************************************
issaiass 0:35d1a2c4fb6d 196 *
issaiass 0:35d1a2c4fb6d 197 * CHECK IF RECEIVER BUFFER EMPTY
issaiass 0:35d1a2c4fb6d 198 *
issaiass 0:35d1a2c4fb6d 199 * Description : Check if is still space on the RX FIFO
issaiass 0:35d1a2c4fb6d 200 * Arguments : None
issaiass 0:35d1a2c4fb6d 201 * Return : TRUE if FIFO is empty
issaiass 0:35d1a2c4fb6d 202 * FALSE if FIFO is not empty
issaiass 0:35d1a2c4fb6d 203 * Notes : None
issaiass 0:35d1a2c4fb6d 204 *******************************************************************************
issaiass 0:35d1a2c4fb6d 205 */
issaiass 0:35d1a2c4fb6d 206
issaiass 0:35d1a2c4fb6d 207 BOOLEAN MsgRxBufEmpty(void) {
issaiass 0:35d1a2c4fb6d 208 INT8U status; /* a status byte flag */
issaiass 0:35d1a2c4fb6d 209
issaiass 0:35d1a2c4fb6d 210
issaiass 0:35d1a2c4fb6d 211 status = FALSE; /* Initialy false */
issaiass 0:35d1a2c4fb6d 212 if (MsgFifo.MsgRxBufCtr == 0) /* If isn't a byte on the buffer */
issaiass 0:35d1a2c4fb6d 213 status = TRUE; /* TRUE, flag that is empty */
issaiass 0:35d1a2c4fb6d 214 return (status); /* return current state of FIFO */
issaiass 0:35d1a2c4fb6d 215 }
issaiass 0:35d1a2c4fb6d 216
issaiass 0:35d1a2c4fb6d 217
issaiass 0:35d1a2c4fb6d 218 /*
issaiass 0:35d1a2c4fb6d 219 *******************************************************************************
issaiass 0:35d1a2c4fb6d 220 *
issaiass 0:35d1a2c4fb6d 221 * GET A LINE FROM THE INPUT DATA BUFFER
issaiass 0:35d1a2c4fb6d 222 *
issaiass 0:35d1a2c4fb6d 223 * Description : Read bytes up to encounter the <CR> character
issaiass 0:35d1a2c4fb6d 224 * Arguments : pdata pointer that holds the data to read
issaiass 0:35d1a2c4fb6d 225 * Return : None
issaiass 0:35d1a2c4fb6d 226 * Notes : None
issaiass 0:35d1a2c4fb6d 227 *******************************************************************************
issaiass 0:35d1a2c4fb6d 228 */
issaiass 0:35d1a2c4fb6d 229
issaiass 0:35d1a2c4fb6d 230 void MsgGetLine(INT8U *pdata) {
issaiass 0:35d1a2c4fb6d 231 INT8U data; /* Character for data */
issaiass 0:35d1a2c4fb6d 232
issaiass 0:35d1a2c4fb6d 233
issaiass 0:35d1a2c4fb6d 234 data = 0; /* Initialize the data */
issaiass 0:35d1a2c4fb6d 235 do {
issaiass 0:35d1a2c4fb6d 236 data = MsgGetChar(); /* Get one byte */
issaiass 0:35d1a2c4fb6d 237 if (data != '\r' && data) /* Analys if is <CR> */
issaiass 0:35d1a2c4fb6d 238 *pdata++ = data; /* Move to the array or pointer */
issaiass 0:35d1a2c4fb6d 239 } while (data); /* Repeato until is something */
issaiass 0:35d1a2c4fb6d 240 }
issaiass 0:35d1a2c4fb6d 241
issaiass 0:35d1a2c4fb6d 242
issaiass 0:35d1a2c4fb6d 243 /*
issaiass 0:35d1a2c4fb6d 244 *******************************************************************************
issaiass 0:35d1a2c4fb6d 245 *
issaiass 0:35d1a2c4fb6d 246 * DISABLE THE RECEIVER INTERRUPT
issaiass 0:35d1a2c4fb6d 247 *
issaiass 0:35d1a2c4fb6d 248 * Description : Disables the receiver interrupt
issaiass 0:35d1a2c4fb6d 249 * Arguments : None
issaiass 0:35d1a2c4fb6d 250 * Return : None
issaiass 0:35d1a2c4fb6d 251 * Notes : Dependancy on MsgRxISRCfg()
issaiass 0:35d1a2c4fb6d 252 *******************************************************************************
issaiass 0:35d1a2c4fb6d 253 */
issaiass 0:35d1a2c4fb6d 254
issaiass 0:35d1a2c4fb6d 255 void MsgRxIntDis(void) {
issaiass 0:35d1a2c4fb6d 256 MsgRxISRCfg(NULL); /* NULL pointer to RX ISR */
issaiass 0:35d1a2c4fb6d 257 }
issaiass 0:35d1a2c4fb6d 258
issaiass 0:35d1a2c4fb6d 259
issaiass 0:35d1a2c4fb6d 260 /*
issaiass 0:35d1a2c4fb6d 261 *******************************************************************************
issaiass 0:35d1a2c4fb6d 262 *
issaiass 0:35d1a2c4fb6d 263 * ENABLES THE RECEIVER INTERRUPT
issaiass 0:35d1a2c4fb6d 264 *
issaiass 0:35d1a2c4fb6d 265 * Description : Enables the receiver interrupt
issaiass 0:35d1a2c4fb6d 266 * Arguments : pfunc pointer to function (callback) to the ISR
issaiass 0:35d1a2c4fb6d 267 * Return : None
issaiass 0:35d1a2c4fb6d 268 * Notes : Dependancy on MsgRxISRCfg()
issaiass 0:35d1a2c4fb6d 269 *******************************************************************************
issaiass 0:35d1a2c4fb6d 270 */
issaiass 0:35d1a2c4fb6d 271
issaiass 0:35d1a2c4fb6d 272 void MsgRxIntEn(void (*pfunc)(void)) {
issaiass 0:35d1a2c4fb6d 273 MsgRxISRCfg(pfunc); /* Pointer to the enabled func */
issaiass 0:35d1a2c4fb6d 274 }
issaiass 0:35d1a2c4fb6d 275
issaiass 0:35d1a2c4fb6d 276
issaiass 0:35d1a2c4fb6d 277 /*
issaiass 0:35d1a2c4fb6d 278 *******************************************************************************
issaiass 0:35d1a2c4fb6d 279 *
issaiass 0:35d1a2c4fb6d 280 * CLEAN THE RX BUFFER
issaiass 0:35d1a2c4fb6d 281 *
issaiass 0:35d1a2c4fb6d 282 * Description : Return the RX buffer to the initial values
issaiass 0:35d1a2c4fb6d 283 * Arguments : None
issaiass 0:35d1a2c4fb6d 284 * Return : None
issaiass 0:35d1a2c4fb6d 285 * Notes : None
issaiass 0:35d1a2c4fb6d 286 *******************************************************************************
issaiass 0:35d1a2c4fb6d 287 */
issaiass 0:35d1a2c4fb6d 288
issaiass 0:35d1a2c4fb6d 289 void MsgRxBufFlush(void) {
issaiass 0:35d1a2c4fb6d 290 MsgFifo.MsgRxBufHd = 0; /* Return head to beginning */
issaiass 0:35d1a2c4fb6d 291 MsgFifo.MsgRxBufTl = 0; /* Return tail to beginning */
issaiass 0:35d1a2c4fb6d 292 MsgFifo.MsgRxBufCtr = 0; /* Return counter to beginning */
issaiass 0:35d1a2c4fb6d 293 }
issaiass 0:35d1a2c4fb6d 294
issaiass 0:35d1a2c4fb6d 295
issaiass 0:35d1a2c4fb6d 296 /*
issaiass 0:35d1a2c4fb6d 297 *******************************************************************************
issaiass 0:35d1a2c4fb6d 298 *
issaiass 0:35d1a2c4fb6d 299 * PUT A BYTE OUT OF THE SERIAL PORT
issaiass 0:35d1a2c4fb6d 300 *
issaiass 0:35d1a2c4fb6d 301 * Description : Sends a byte through serial
issaiass 0:35d1a2c4fb6d 302 * Arguments : data the byte to send
issaiass 0:35d1a2c4fb6d 303 * Return : None
issaiass 0:35d1a2c4fb6d 304 * Notes : None
issaiass 0:35d1a2c4fb6d 305 *******************************************************************************
issaiass 0:35d1a2c4fb6d 306 */
issaiass 0:35d1a2c4fb6d 307
issaiass 0:35d1a2c4fb6d 308 void MsgPut(INT8U data) {
issaiass 0:35d1a2c4fb6d 309 ser.putc(data); /* Send a byte */
issaiass 0:35d1a2c4fb6d 310 }
issaiass 0:35d1a2c4fb6d 311
issaiass 0:35d1a2c4fb6d 312
issaiass 0:35d1a2c4fb6d 313 /*
issaiass 0:35d1a2c4fb6d 314 *******************************************************************************
issaiass 0:35d1a2c4fb6d 315 *
issaiass 0:35d1a2c4fb6d 316 * PUT A BYTE ON THE TRANSMITTER BUFFER
issaiass 0:35d1a2c4fb6d 317 *
issaiass 0:35d1a2c4fb6d 318 * Description : Sends a byte to the transmitter buffer
issaiass 0:35d1a2c4fb6d 319 * Arguments : data the byte to send to the FIFO
issaiass 0:35d1a2c4fb6d 320 * Return : None
issaiass 0:35d1a2c4fb6d 321 * Notes : None
issaiass 0:35d1a2c4fb6d 322 *******************************************************************************
issaiass 0:35d1a2c4fb6d 323 */
issaiass 0:35d1a2c4fb6d 324
issaiass 0:35d1a2c4fb6d 325 void MsgPutChar(INT8U data) {
issaiass 0:35d1a2c4fb6d 326 if(!MsgTxBufFull()) { /* If the buffer is not full */
issaiass 0:35d1a2c4fb6d 327 OS_ENTER_CRITICAL(); /* Disable global interrupts */
issaiass 0:35d1a2c4fb6d 328 MsgFifo.MsgTxBufCtr++; /* Increase the FIFO counter */
issaiass 0:35d1a2c4fb6d 329 MsgFifo.MsgTxBuf[MsgFifo.MsgTxBufHd++] = data; /* Insert the data */
issaiass 0:35d1a2c4fb6d 330 if(MsgFifo.MsgTxBufHd == MSG_TX_MAX_CHAR) { /* If TX FIFO isn't full */
issaiass 0:35d1a2c4fb6d 331 MsgFifo.MsgTxBufHd = 0; /* FIFO head is initialized */
issaiass 0:35d1a2c4fb6d 332 }
issaiass 0:35d1a2c4fb6d 333 if (MsgFifo.MsgTxBufCtr == 1) { /* If is the first byte */
issaiass 0:35d1a2c4fb6d 334 // MsgTxIntEn(); /* Enable transmitter interrupt */
issaiass 0:35d1a2c4fb6d 335 }
issaiass 0:35d1a2c4fb6d 336 OS_EXIT_CRITICAL(); /* Enable global interrupts */
issaiass 0:35d1a2c4fb6d 337 }
issaiass 0:35d1a2c4fb6d 338 }
issaiass 0:35d1a2c4fb6d 339
issaiass 0:35d1a2c4fb6d 340
issaiass 0:35d1a2c4fb6d 341 /*
issaiass 0:35d1a2c4fb6d 342 *******************************************************************************
issaiass 0:35d1a2c4fb6d 343 *
issaiass 0:35d1a2c4fb6d 344 * PUT A LINE THROUGH THE SERIAL PORT
issaiass 0:35d1a2c4fb6d 345 *
issaiass 0:35d1a2c4fb6d 346 * Description : Sends a line of characters to the serial port
issaiass 0:35d1a2c4fb6d 347 * Arguments : pdata the array or pointer holder of the data to send
issaiass 0:35d1a2c4fb6d 348 * Return : None
issaiass 0:35d1a2c4fb6d 349 * Notes : None
issaiass 0:35d1a2c4fb6d 350 *******************************************************************************
issaiass 0:35d1a2c4fb6d 351 */
issaiass 0:35d1a2c4fb6d 352
issaiass 0:35d1a2c4fb6d 353 void MsgPutLine(INT8U *pdata) {
issaiass 0:35d1a2c4fb6d 354 INT8U data; /* Data to send */
issaiass 0:35d1a2c4fb6d 355
issaiass 0:35d1a2c4fb6d 356
issaiass 0:35d1a2c4fb6d 357 data = 0; /* Initialize data */
issaiass 0:35d1a2c4fb6d 358 while (*pdata != '\0') { /* Up to string end */
issaiass 0:35d1a2c4fb6d 359 data = *pdata++; /* Get the data to send */
issaiass 0:35d1a2c4fb6d 360 // MsgPutChar(data);
issaiass 0:35d1a2c4fb6d 361 MsgPut(data); /* Put the data out of the MCU */
issaiass 0:35d1a2c4fb6d 362 }
issaiass 0:35d1a2c4fb6d 363 }
issaiass 0:35d1a2c4fb6d 364
issaiass 0:35d1a2c4fb6d 365
issaiass 0:35d1a2c4fb6d 366 /*
issaiass 0:35d1a2c4fb6d 367 *******************************************************************************
issaiass 0:35d1a2c4fb6d 368 *
issaiass 0:35d1a2c4fb6d 369 * CHECKS IF THE TRANSMITTER BUFFER IS FULL
issaiass 0:35d1a2c4fb6d 370 *
issaiass 0:35d1a2c4fb6d 371 * Description : Check the status of the transmitter buffer
issaiass 0:35d1a2c4fb6d 372 * Arguments : None
issaiass 0:35d1a2c4fb6d 373 * Return : TRUE if transmitter buffer is full
issaiass 0:35d1a2c4fb6d 374 * FALSE if transmitter buffer is empty
issaiass 0:35d1a2c4fb6d 375 * Notes : None
issaiass 0:35d1a2c4fb6d 376 *******************************************************************************
issaiass 0:35d1a2c4fb6d 377 */
issaiass 0:35d1a2c4fb6d 378
issaiass 0:35d1a2c4fb6d 379 BOOLEAN MsgTxBufFull(void) {
issaiass 0:35d1a2c4fb6d 380 INT8U status; /* A status byte for the buffer */
issaiass 0:35d1a2c4fb6d 381
issaiass 0:35d1a2c4fb6d 382
issaiass 0:35d1a2c4fb6d 383 status = FALSE; /* Initialize the status flag */
issaiass 0:35d1a2c4fb6d 384 if(MsgFifo.MsgTxBufCtr >= MSG_TX_MAX_CHAR) {/* If the buffer is full */
issaiass 0:35d1a2c4fb6d 385 status = TRUE; /* The buffer is full, flag it */
issaiass 0:35d1a2c4fb6d 386 }
issaiass 0:35d1a2c4fb6d 387 return status; /* Return the current status */
issaiass 0:35d1a2c4fb6d 388 }
issaiass 0:35d1a2c4fb6d 389
issaiass 0:35d1a2c4fb6d 390
issaiass 0:35d1a2c4fb6d 391 /*
issaiass 0:35d1a2c4fb6d 392 *******************************************************************************
issaiass 0:35d1a2c4fb6d 393 *
issaiass 0:35d1a2c4fb6d 394 * DISABLES TRANSMITTER INTERRUPTS
issaiass 0:35d1a2c4fb6d 395 *
issaiass 0:35d1a2c4fb6d 396 * Description : Disable the transmitter interrupt
issaiass 0:35d1a2c4fb6d 397 * Arguments : None
issaiass 0:35d1a2c4fb6d 398 * Return : None
issaiass 0:35d1a2c4fb6d 399 * Notes : None
issaiass 0:35d1a2c4fb6d 400 *******************************************************************************
issaiass 0:35d1a2c4fb6d 401 */
issaiass 0:35d1a2c4fb6d 402
issaiass 0:35d1a2c4fb6d 403 void MsgTxIntDis(void) {
issaiass 0:35d1a2c4fb6d 404 MsgTxISRCfg(NULL); /* Disable the TX interrupt */
issaiass 0:35d1a2c4fb6d 405 }
issaiass 0:35d1a2c4fb6d 406
issaiass 0:35d1a2c4fb6d 407 /*
issaiass 0:35d1a2c4fb6d 408 *******************************************************************************
issaiass 0:35d1a2c4fb6d 409 *
issaiass 0:35d1a2c4fb6d 410 * ENABLES TRANSMITTER INTERRUPTS
issaiass 0:35d1a2c4fb6d 411 *
issaiass 0:35d1a2c4fb6d 412 * Description : Enable the transmitter interrupt
issaiass 0:35d1a2c4fb6d 413 * Arguments : pfunc pointer to function (callback) to the ISR
issaiass 0:35d1a2c4fb6d 414 * Return : None
issaiass 0:35d1a2c4fb6d 415 * Notes : None
issaiass 0:35d1a2c4fb6d 416 *******************************************************************************
issaiass 0:35d1a2c4fb6d 417 */
issaiass 0:35d1a2c4fb6d 418
issaiass 0:35d1a2c4fb6d 419 void MsgTxIntEn(void (*pfunc)(void)) {
issaiass 0:35d1a2c4fb6d 420 MsgTxISRCfg(pfunc); /* Enables the TX interrupt */
issaiass 0:35d1a2c4fb6d 421 }
issaiass 0:35d1a2c4fb6d 422
issaiass 0:35d1a2c4fb6d 423
issaiass 0:35d1a2c4fb6d 424 /*
issaiass 0:35d1a2c4fb6d 425 *******************************************************************************
issaiass 0:35d1a2c4fb6d 426 *
issaiass 0:35d1a2c4fb6d 427 * GET THE BYTES FROM THE BUFFER TO TRANSMIT
issaiass 0:35d1a2c4fb6d 428 *
issaiass 0:35d1a2c4fb6d 429 * Description : Get the byte from the TX buffer if exists
issaiass 0:35d1a2c4fb6d 430 * Arguments : None
issaiass 0:35d1a2c4fb6d 431 * Return : A byte from the buffer to transmitt
issaiass 0:35d1a2c4fb6d 432 * Notes : If there is no byte to transmit, a NULL (0) will be sent
issaiass 0:35d1a2c4fb6d 433 *******************************************************************************
issaiass 0:35d1a2c4fb6d 434 */
issaiass 0:35d1a2c4fb6d 435
issaiass 0:35d1a2c4fb6d 436 INT8U MsgGetTxChar(void) {
issaiass 0:35d1a2c4fb6d 437 INT8U data; /* Data byte */
issaiass 0:35d1a2c4fb6d 438
issaiass 0:35d1a2c4fb6d 439
issaiass 0:35d1a2c4fb6d 440 if(MsgFifo.MsgTxBufCtr > 0) { /* If there is something to send*/
issaiass 0:35d1a2c4fb6d 441 MsgFifo.MsgTxBufCtr--; /* Decrease the byte counter */
issaiass 0:35d1a2c4fb6d 442 data = MsgFifo.MsgTxBuf[MsgFifo.MsgTxBufTl++]; /* Get from the buffer */
issaiass 0:35d1a2c4fb6d 443 if(MsgFifo.MsgTxBufTl == MSG_TX_MAX_CHAR) { /* If is the max char */
issaiass 0:35d1a2c4fb6d 444 MsgFifo.MsgTxBufTl = 0; /* Return the buffer to initial */
issaiass 0:35d1a2c4fb6d 445 }
issaiass 0:35d1a2c4fb6d 446 return data; /* Return the data */
issaiass 0:35d1a2c4fb6d 447 } else { /* Otherwise */
issaiass 0:35d1a2c4fb6d 448 return NULL; /* Return a NULL (0) character */
issaiass 0:35d1a2c4fb6d 449 }
issaiass 0:35d1a2c4fb6d 450 }