| (0); /* Break detect */\r
\r
/** - inialise global transfer variables */\r
- g_sciTransfer[0].mode = 0 << 8;\r
+ g_sciTransfer[0].mode = 1 << 8;\r
g_sciTransfer[0].length = 0;\r
\r
/** - Finaly start SCI */\r
int index = sci == sciREG ? 0 : 1;\r
\r
/* USER CODE BEGIN (11) */\r
- /* Using interrupt, does not work. Sometimes a character is lost */\r
-// if ((g_sciTransfer[index].mode & SCI_TX_INT) != 0)\r
-// {\r
- /* start transmit by sending first byte */\r
-// uint8_t byte = 0;\r
-// if (xQueueReceiveFromISR(outBuffer.buf, (uint8_t *)&byte, NULL) == pdPASS) {\r
-// sci->TD = byte;\r
-// sci->SETINT = SCI_TX_INT;\r
-// }\r
-// }\r
-// else\r
-// {\r
- /* send the data *///\r
-// while (length-- > 0)\r
-// {\r
-// while ((sci->FLR & SCI_TX_INT) == 0) { /* wait */ };\r
-// sci->TD = *data++;\r
-// }\r
-// }\r
/* USER CODE END */\r
\r
if ((g_sciTransfer[index].mode & SCI_TX_INT) != 0)\r
else\r
{\r
/* send the data */\r
- while (xQueueIsQueueEmptyFromISR(outBuffer.buf) != pdTRUE)\r
+ while (length-- > 0)\r
{\r
while ((sci->FLR & SCI_TX_INT) == 0) { /* wait */ };\r
- uint8_t byte;\r
- xQueueReceiveFromISR(outBuffer.buf, (void *)&byte, NULL);\r
- sci->TD = byte;\r
+ sci->TD = *data++;\r
}\r
}\r
\r
/* USER CODE BEGIN (16) */\r
if (sci->SETINT & SCI_RX_INT)\r
{\r
- /* clear error flags */\r
+ /* We are in iterrupt mode, clear error flags */\r
sci->FLR = SCI_FE_INT | SCI_OE_INT | SCI_PE_INT;\r
\r
}\r
}\r
/* USER CODE END */\r
\r
- if (sci->SETINT & SCI_RX_INT)\r
- {\r
- /* we are in interrupt mode */\r
- int index = sci == sciREG ? 0 : 1;\r
- \r
- /* clear error flags */\r
- sci->FLR = SCI_FE_INT | SCI_OE_INT | SCI_PE_INT;\r
-\r
- g_sciTransfer[index].length = length;\r
- g_sciTransfer[index].data = data;\r
- }\r
- else\r
- { \r
- while (length-- > 0)\r
- {\r
- while ((sci->FLR & SCI_RX_INT) == 0) { /* wait */ };\r
- *data++ = sci->RD;\r
- }\r
- }\r
/* USER CODE BEGIN (17) */\r
/* USER CODE END */\r
}\r
\r
case 12:\r
/* transmit */\r
- /* using interrupt, does not work properly, sometimes a character is lost */\r
- /* if (xQueueIsQueueEmptyFromISR(outBuffer.buf) == pdTRUE) {\r
- sciREG->CLRINT = SCI_TX_INT;\r
- sciNotification(sciREG, SCI_TX_INT);\r
- }\r
- else {\r
- uint8_t byte = 0;\r
- xQueueReceiveFromISR(outBuffer.buf, (uint8_t *)&byte, NULL);\r
- while (sciIsTxReady(sciREG) == 0)\r
- ;\r
- sciREG->TD = byte;\r
+ {\r
+ uint8_t byte = 0;\r
+ if (xQueueReceiveFromISR(outBuffer.buf, (uint8_t *)&byte, NULL) == errQUEUE_EMPTY) {\r
+ sciREG->CLRINT = SCI_TX_INT;\r
+ outBuffer.flags &= ~BUF_TRANSFER_IN_PROGRESS;\r
+ }\r
+ else {\r
+ sciREG->TD = byte;\r
+ }\r
}\r
- */\r
- /* transmit */\r
- if (--g_sciTransfer[0].length > 0)\r
- {\r
- sciREG->TD = *g_sciTransfer[0].data++;\r
- }\r
- else\r
- {\r
- sciREG->CLRINT = SCI_TX_INT;\r
- sciNotification(sciREG, SCI_TX_INT);\r
- }\r
- break;\r
-\r
+ break;\r
default:\r
/* phantom interrupt, clear flags and return */\r
sciREG->FLR = ~sciREG->SETINTLVL & 0x07000303;\r
break;\r
}\r
/* USER CODE END */\r
-\r
/* USER CODE BEGIN (27) */\r
/* USER CODE END */\r
}\r
void sciLowLevelInterrupt(void)\r
{\r
uint32_t vec = sciREG->INTVECT1;\r
+\r
/* USER CODE BEGIN (28) */\r
/* USER CODE END */\r
\r