uc-sdk
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
lpc17xx_uart.c
Go to the documentation of this file.
1 /***********************************************************************/
20 /* Peripheral group ----------------------------------------------------------- */
25 /* Includes ------------------------------------------------------------------- */
26 #include "lpc17xx_uart.h"
27 #include "lpc17xx_clkpwr.h"
28 
29 /* If this source file built with example, the LPC17xx FW library configuration
30  * file in each example directory ("lpc17xx_libcfg.h") must be included,
31  * otherwise the default FW library configuration file must be included instead
32  */
33 #ifdef __BUILD_WITH_EXAMPLE__
34 #include "lpc17xx_libcfg.h"
35 #else
36 #include "lpc17xx_libcfg_default.h"
37 #endif /* __BUILD_WITH_EXAMPLE__ */
38 
39 
40 #ifdef _UART
41 
42 /* Private Functions ---------------------------------------------------------- */
43 
44 static Status uart_set_divisors(LPC_UART_TypeDef *UARTx, uint32_t baudrate);
45 
46 
47 /*********************************************************************/
59 static Status uart_set_divisors(LPC_UART_TypeDef *UARTx, uint32_t baudrate)
60 {
61  Status errorStatus = ERROR;
62 
63  uint32_t uClk = 0;
64  uint32_t calcBaudrate = 0;
65  uint32_t temp = 0;
66 
67  uint32_t mulFracDiv, dividerAddFracDiv;
68  uint32_t diviser = 0 ;
69  uint32_t mulFracDivOptimal = 1;
70  uint32_t dividerAddOptimal = 0;
71  uint32_t diviserOptimal = 0;
72 
73  uint32_t relativeError = 0;
74  uint32_t relativeOptimalError = 100000;
75 
76  /* get UART block clock */
77  if (UARTx == LPC_UART0)
78  {
80  }
81  else if (UARTx == (LPC_UART_TypeDef *)LPC_UART1)
82  {
84  }
85  else if (UARTx == LPC_UART2)
86  {
88  }
89  else if (UARTx == LPC_UART3)
90  {
92  }
93 
94 
95  uClk = uClk >> 4; /* div by 16 */
96  /* In the Uart IP block, baud rate is calculated using FDR and DLL-DLM registers
97  * The formula is :
98  * BaudRate= uClk * (mulFracDiv/(mulFracDiv+dividerAddFracDiv) / (16 * (DLL)
99  * It involves floating point calculations. That's the reason the formulae are adjusted with
100  * Multiply and divide method.*/
101  /* The value of mulFracDiv and dividerAddFracDiv should comply to the following expressions:
102  * 0 < mulFracDiv <= 15, 0 <= dividerAddFracDiv <= 15 */
103  for (mulFracDiv = 1 ; mulFracDiv <= 15 ;mulFracDiv++)
104  {
105  for (dividerAddFracDiv = 0 ; dividerAddFracDiv <= 15 ;dividerAddFracDiv++)
106  {
107  temp = (mulFracDiv * uClk) / ((mulFracDiv + dividerAddFracDiv));
108 
109  diviser = temp / baudrate;
110  if ((temp % baudrate) > (baudrate / 2))
111  diviser++;
112 
113  if (diviser > 2 && diviser < 65536)
114  {
115  calcBaudrate = temp / diviser;
116 
117  if (calcBaudrate <= baudrate)
118  relativeError = baudrate - calcBaudrate;
119  else
120  relativeError = calcBaudrate - baudrate;
121 
122  if ((relativeError < relativeOptimalError))
123  {
124  mulFracDivOptimal = mulFracDiv ;
125  dividerAddOptimal = dividerAddFracDiv;
126  diviserOptimal = diviser;
127  relativeOptimalError = relativeError;
128  if (relativeError == 0)
129  break;
130  }
131  } /* End of if */
132  } /* end of inner for loop */
133  if (relativeError == 0)
134  break;
135  } /* end of outer for loop */
136 
137  if (relativeOptimalError < ((baudrate * UART_ACCEPTED_BAUDRATE_ERROR)/100))
138  {
139  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
140  {
141  ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN;
142  ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/DLM = UART_LOAD_DLM(diviserOptimal);
143  ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/DLL = UART_LOAD_DLL(diviserOptimal);
144  /* Then reset DLAB bit */
145  ((LPC_UART1_TypeDef *)UARTx)->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK;
146  ((LPC_UART1_TypeDef *)UARTx)->FDR = (UART_FDR_MULVAL(mulFracDivOptimal) \
147  | UART_FDR_DIVADDVAL(dividerAddOptimal)) & UART_FDR_BITMASK;
148  }
149  else
150  {
151  UARTx->LCR |= UART_LCR_DLAB_EN;
152  UARTx->/*DLIER.*/DLM = UART_LOAD_DLM(diviserOptimal);
153  UARTx->/*RBTHDLR.*/DLL = UART_LOAD_DLL(diviserOptimal);
154  /* Then reset DLAB bit */
155  UARTx->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK;
156  UARTx->FDR = (UART_FDR_MULVAL(mulFracDivOptimal) \
157  | UART_FDR_DIVADDVAL(dividerAddOptimal)) & UART_FDR_BITMASK;
158  }
159  errorStatus = SUCCESS;
160  }
161 
162  return errorStatus;
163 }
164 
165 /* End of Private Functions ---------------------------------------------------- */
166 
167 
168 /* Public Functions ----------------------------------------------------------- */
172 /* UART Init/DeInit functions -------------------------------------------------*/
173 /********************************************************************/
186 void UART_Init(LPC_UART_TypeDef *UARTx, UART_CFG_Type *UART_ConfigStruct)
187 {
188  uint32_t tmp;
189 
190  // For debug mode
191  CHECK_PARAM(PARAM_UARTx(UARTx));
192  CHECK_PARAM(PARAM_UART_DATABIT(UART_ConfigStruct->Databits));
193  CHECK_PARAM(PARAM_UART_STOPBIT(UART_ConfigStruct->Stopbits));
194  CHECK_PARAM(PARAM_UART_PARITY(UART_ConfigStruct->Parity));
195 
196 #ifdef _UART0
197  if(UARTx == LPC_UART0)
198  {
199  /* Set up clock and power for UART module */
201  }
202 #endif
203 
204 #ifdef _UART1
205  if(((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
206  {
207  /* Set up clock and power for UART module */
209  }
210 #endif
211 
212 #ifdef _UART2
213  if(UARTx == LPC_UART2)
214  {
215  /* Set up clock and power for UART module */
217  }
218 #endif
219 
220 #ifdef _UART3
221  if(UARTx == LPC_UART3)
222  {
223  /* Set up clock and power for UART module */
225  }
226 #endif
227 
228  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
229  {
230  /* FIFOs are empty */
231  ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN \
233  // Disable FIFO
234  ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = 0;
235 
236  // Dummy reading
237  while (((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_RDR)
238  {
239  tmp = ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR;
240  }
241 
242  ((LPC_UART1_TypeDef *)UARTx)->TER = UART_TER_TXEN;
243  // Wait for current transmit complete
244  while (!(((LPC_UART1_TypeDef *)UARTx)->LSR & UART_LSR_THRE));
245  // Disable Tx
246  ((LPC_UART1_TypeDef *)UARTx)->TER = 0;
247 
248  // Disable interrupt
249  ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER = 0;
250  // Set LCR to default state
251  ((LPC_UART1_TypeDef *)UARTx)->LCR = 0;
252  // Set ACR to default state
253  ((LPC_UART1_TypeDef *)UARTx)->ACR = 0;
254  // Set Modem Control to default state
255  ((LPC_UART1_TypeDef *)UARTx)->MCR = 0;
256  // Set RS485 control to default state
257  ((LPC_UART1_TypeDef *)UARTx)->RS485CTRL = 0;
258  // Set RS485 delay timer to default state
259  ((LPC_UART1_TypeDef *)UARTx)->RS485DLY = 0;
260  // Set RS485 addr match to default state
261  ((LPC_UART1_TypeDef *)UARTx)->ADRMATCH = 0;
262  //Dummy Reading to Clear Status
263  tmp = ((LPC_UART1_TypeDef *)UARTx)->MSR;
264  tmp = ((LPC_UART1_TypeDef *)UARTx)->LSR;
265  }
266  else
267  {
268  /* FIFOs are empty */
269  UARTx->/*IIFCR.*/FCR = ( UART_FCR_FIFO_EN | UART_FCR_RX_RS | UART_FCR_TX_RS);
270  // Disable FIFO
271  UARTx->/*IIFCR.*/FCR = 0;
272 
273  // Dummy reading
274  while (UARTx->LSR & UART_LSR_RDR)
275  {
276  tmp = UARTx->/*RBTHDLR.*/RBR;
277  }
278 
279  UARTx->TER = UART_TER_TXEN;
280  // Wait for current transmit complete
281  while (!(UARTx->LSR & UART_LSR_THRE));
282  // Disable Tx
283  UARTx->TER = 0;
284 
285  // Disable interrupt
286  UARTx->/*DLIER.*/IER = 0;
287  // Set LCR to default state
288  UARTx->LCR = 0;
289  // Set ACR to default state
290  UARTx->ACR = 0;
291  // Dummy reading
292  tmp = UARTx->LSR;
293  }
294 
295  if (UARTx == LPC_UART3)
296  {
297  // Set IrDA to default state
298  UARTx->ICR = 0;
299  }
300 
301  // Set Line Control register ----------------------------
302 
303  uart_set_divisors(UARTx, (UART_ConfigStruct->Baud_rate));
304 
305  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
306  {
307  tmp = (((LPC_UART1_TypeDef *)UARTx)->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) \
309  }
310  else
311  {
312  tmp = (UARTx->LCR & (UART_LCR_DLAB_EN | UART_LCR_BREAK_EN)) & UART_LCR_BITMASK;
313  }
314 
315  switch (UART_ConfigStruct->Databits){
316  case UART_DATABIT_5:
317  tmp |= UART_LCR_WLEN5;
318  break;
319  case UART_DATABIT_6:
320  tmp |= UART_LCR_WLEN6;
321  break;
322  case UART_DATABIT_7:
323  tmp |= UART_LCR_WLEN7;
324  break;
325  case UART_DATABIT_8:
326  default:
327  tmp |= UART_LCR_WLEN8;
328  break;
329  }
330 
331  if (UART_ConfigStruct->Parity == UART_PARITY_NONE)
332  {
333  // Do nothing...
334  }
335  else
336  {
337  tmp |= UART_LCR_PARITY_EN;
338  switch (UART_ConfigStruct->Parity)
339  {
340  case UART_PARITY_ODD:
341  tmp |= UART_LCR_PARITY_ODD;
342  break;
343 
344  case UART_PARITY_EVEN:
345  tmp |= UART_LCR_PARITY_EVEN;
346  break;
347 
348  case UART_PARITY_SP_1:
349  tmp |= UART_LCR_PARITY_F_1;
350  break;
351 
352  case UART_PARITY_SP_0:
353  tmp |= UART_LCR_PARITY_F_0;
354  break;
355  default:
356  break;
357  }
358  }
359 
360  switch (UART_ConfigStruct->Stopbits){
361  case UART_STOPBIT_2:
362  tmp |= UART_LCR_STOPBIT_SEL;
363  break;
364  case UART_STOPBIT_1:
365  default:
366  // Do no thing
367  break;
368  }
369 
370 
371  // Write back to LCR, configure FIFO and Disable Tx
372  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
373  {
374  ((LPC_UART1_TypeDef *)UARTx)->LCR = (uint8_t)(tmp & UART_LCR_BITMASK);
375  }
376  else
377  {
378  UARTx->LCR = (uint8_t)(tmp & UART_LCR_BITMASK);
379  }
380 }
381 
382 /*********************************************************************/
392 void UART_DeInit(LPC_UART_TypeDef* UARTx)
393 {
394  // For debug mode
395  CHECK_PARAM(PARAM_UARTx(UARTx));
396 
397  UART_TxCmd(UARTx, DISABLE);
398 
399 #ifdef _UART0
400  if (UARTx == LPC_UART0)
401  {
402  /* Set up clock and power for UART module */
404  }
405 #endif
406 
407 #ifdef _UART1
408  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
409  {
410  /* Set up clock and power for UART module */
412  }
413 #endif
414 
415 #ifdef _UART2
416  if (UARTx == LPC_UART2)
417  {
418  /* Set up clock and power for UART module */
420  }
421 #endif
422 
423 #ifdef _UART3
424  if (UARTx == LPC_UART3)
425  {
426  /* Set up clock and power for UART module */
428  }
429 #endif
430 }
431 
432 /*****************************************************************************/
442 void UART_ConfigStructInit(UART_CFG_Type *UART_InitStruct)
443 {
444  UART_InitStruct->Baud_rate = 9600;
445  UART_InitStruct->Databits = UART_DATABIT_8;
446  UART_InitStruct->Parity = UART_PARITY_NONE;
447  UART_InitStruct->Stopbits = UART_STOPBIT_1;
448 }
449 
450 /* UART Send/Recieve functions -------------------------------------------------*/
451 /*********************************************************************/
461 void UART_SendByte(LPC_UART_TypeDef* UARTx, uint8_t Data)
462 {
463  CHECK_PARAM(PARAM_UARTx(UARTx));
464 
465  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
466  {
467  ((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT;
468  }
469  else
470  {
471  UARTx->/*RBTHDLR.*/THR = Data & UART_THR_MASKBIT;
472  }
473 
474 }
475 
476 
477 /*********************************************************************/
486 uint8_t UART_ReceiveByte(LPC_UART_TypeDef* UARTx)
487 {
488  CHECK_PARAM(PARAM_UARTx(UARTx));
489 
490  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
491  {
492  return (((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT);
493  }
494  else
495  {
496  return (UARTx->/*RBTHDLR.*/RBR & UART_RBR_MASKBIT);
497  }
498 }
499 
500 /*********************************************************************/
516 uint32_t UART_Send(LPC_UART_TypeDef *UARTx, uint8_t *txbuf,
517  uint32_t buflen, TRANSFER_BLOCK_Type flag)
518 {
519  uint32_t bToSend, bSent, timeOut, fifo_cnt;
520  uint8_t *pChar = txbuf;
521 
522  bToSend = buflen;
523 
524  // blocking mode
525  if (flag == BLOCKING) {
526  bSent = 0;
527  while (bToSend){
528  timeOut = UART_BLOCKING_TIMEOUT;
529  // Wait for THR empty with timeout
530  while (!(UARTx->LSR & UART_LSR_THRE)) {
531  if (timeOut == 0) break;
532  timeOut--;
533  }
534  // Time out!
535  if(timeOut == 0) break;
536  fifo_cnt = UART_TX_FIFO_SIZE;
537  while (fifo_cnt && bToSend){
538  UART_SendByte(UARTx, (*pChar++));
539  fifo_cnt--;
540  bToSend--;
541  bSent++;
542  }
543  }
544  }
545  // None blocking mode
546  else {
547  bSent = 0;
548  while (bToSend) {
549  if (!(UARTx->LSR & UART_LSR_THRE)){
550  break;
551  }
552  fifo_cnt = UART_TX_FIFO_SIZE;
553  while (fifo_cnt && bToSend) {
554  UART_SendByte(UARTx, (*pChar++));
555  bToSend--;
556  fifo_cnt--;
557  bSent++;
558  }
559  }
560  }
561  return bSent;
562 }
563 
564 /*********************************************************************/
581 uint32_t UART_Receive(LPC_UART_TypeDef *UARTx, uint8_t *rxbuf, \
582  uint32_t buflen, TRANSFER_BLOCK_Type flag)
583 {
584  uint32_t bToRecv, bRecv, timeOut;
585  uint8_t *pChar = rxbuf;
586 
587  bToRecv = buflen;
588 
589  // Blocking mode
590  if (flag == BLOCKING) {
591  bRecv = 0;
592  while (bToRecv){
593  timeOut = UART_BLOCKING_TIMEOUT;
594  while (!(UARTx->LSR & UART_LSR_RDR)){
595  if (timeOut == 0) break;
596  timeOut--;
597  }
598  // Time out!
599  if(timeOut == 0) break;
600  // Get data from the buffer
601  (*pChar++) = UART_ReceiveByte(UARTx);
602  bToRecv--;
603  bRecv++;
604  }
605  }
606  // None blocking mode
607  else {
608  bRecv = 0;
609  while (bToRecv) {
610  if (!(UARTx->LSR & UART_LSR_RDR)) {
611  break;
612  } else {
613  (*pChar++) = UART_ReceiveByte(UARTx);
614  bRecv++;
615  bToRecv--;
616  }
617  }
618  }
619  return bRecv;
620 }
621 
622 /*********************************************************************/
633 {
634  CHECK_PARAM(PARAM_UARTx(UARTx));
635 
636  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
637  {
638  ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_BREAK_EN;
639  }
640  else
641  {
642  UARTx->LCR |= UART_LCR_BREAK_EN;
643  }
644 }
645 
646 
647 /********************************************************************/
669 void UART_IntConfig(LPC_UART_TypeDef *UARTx, UART_INT_Type UARTIntCfg, FunctionalState NewState)
670 {
671  uint32_t tmp = 0;
672 
673  CHECK_PARAM(PARAM_UARTx(UARTx));
675 
676  switch(UARTIntCfg){
677  case UART_INTCFG_RBR:
678  tmp = UART_IER_RBRINT_EN;
679  break;
680  case UART_INTCFG_THRE:
681  tmp = UART_IER_THREINT_EN;
682  break;
683  case UART_INTCFG_RLS:
684  tmp = UART_IER_RLSINT_EN;
685  break;
686  case UART1_INTCFG_MS:
687  tmp = UART1_IER_MSINT_EN;
688  break;
689  case UART1_INTCFG_CTS:
690  tmp = UART1_IER_CTSINT_EN;
691  break;
692  case UART_INTCFG_ABEO:
693  tmp = UART_IER_ABEOINT_EN;
694  break;
695  case UART_INTCFG_ABTO:
696  tmp = UART_IER_ABTOINT_EN;
697  break;
698  }
699 
700  if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1)
701  {
702  CHECK_PARAM((PARAM_UART_INTCFG(UARTIntCfg)) || (PARAM_UART1_INTCFG(UARTIntCfg)));
703  }
704  else
705  {
706  CHECK_PARAM(PARAM_UART_INTCFG(UARTIntCfg));
707  }
708 
709  if (NewState == ENABLE)
710  {
711  if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1)
712  {
713  ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER |= tmp;
714  }
715  else
716  {
717  UARTx->/*DLIER.*/IER |= tmp;
718  }
719  }
720  else
721  {
722  if ((LPC_UART1_TypeDef *) UARTx == LPC_UART1)
723  {
724  ((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/IER &= (~tmp) & UART1_IER_BITMASK;
725  }
726  else
727  {
728  UARTx->/*DLIER.*/IER &= (~tmp) & UART_IER_BITMASK;
729  }
730  }
731 }
732 
733 
734 /********************************************************************/
750 uint8_t UART_GetLineStatus(LPC_UART_TypeDef* UARTx)
751 {
752  CHECK_PARAM(PARAM_UARTx(UARTx));
753 
754  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
755  {
756  return ((((LPC_UART1_TypeDef *)LPC_UART1)->LSR) & UART_LSR_BITMASK);
757  }
758  else
759  {
760  return ((UARTx->LSR) & UART_LSR_BITMASK);
761  }
762 }
763 
764 /********************************************************************/
773 uint32_t UART_GetIntId(LPC_UART_TypeDef* UARTx)
774 {
775  CHECK_PARAM(PARAM_UARTx(UARTx));
776  return (UARTx->IIR & 0x03CF);
777 }
778 
779 /*********************************************************************/
789 {
790  if (UARTx->LSR & UART_LSR_TEMT){
791  return RESET;
792  } else {
793  return SET;
794  }
795 }
796 
797 
798 /*********************************************************************/
810 {
811  uint8_t tmp = 0;
812 
813  CHECK_PARAM(PARAM_UARTx(UARTx));
818 
819  tmp |= UART_FCR_FIFO_EN;
820  switch (FIFOCfg->FIFO_Level){
821  case UART_FIFO_TRGLEV0:
822  tmp |= UART_FCR_TRG_LEV0;
823  break;
824  case UART_FIFO_TRGLEV1:
825  tmp |= UART_FCR_TRG_LEV1;
826  break;
827  case UART_FIFO_TRGLEV2:
828  tmp |= UART_FCR_TRG_LEV2;
829  break;
830  case UART_FIFO_TRGLEV3:
831  default:
832  tmp |= UART_FCR_TRG_LEV3;
833  break;
834  }
835 
836  if (FIFOCfg->FIFO_ResetTxBuf == ENABLE)
837  {
838  tmp |= UART_FCR_TX_RS;
839  }
840  if (FIFOCfg->FIFO_ResetRxBuf == ENABLE)
841  {
842  tmp |= UART_FCR_RX_RS;
843  }
844  if (FIFOCfg->FIFO_DMAMode == ENABLE)
845  {
846  tmp |= UART_FCR_DMAMODE_SEL;
847  }
848 
849 
850  //write to FIFO control register
851  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
852  {
853  ((LPC_UART1_TypeDef *)UARTx)->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK;
854  }
855  else
856  {
857  UARTx->/*IIFCR.*/FCR = tmp & UART_FCR_BITMASK;
858  }
859 }
860 
861 /*****************************************************************************/
873 void UART_FIFOConfigStructInit(UART_FIFO_CFG_Type *UART_FIFOInitStruct)
874 {
875  UART_FIFOInitStruct->FIFO_DMAMode = DISABLE;
876  UART_FIFOInitStruct->FIFO_Level = UART_FIFO_TRGLEV0;
877  UART_FIFOInitStruct->FIFO_ResetRxBuf = ENABLE;
878  UART_FIFOInitStruct->FIFO_ResetTxBuf = ENABLE;
879 }
880 
881 
882 /*********************************************************************/
899 void UART_ABCmd(LPC_UART_TypeDef *UARTx, UART_AB_CFG_Type *ABConfigStruct, \
900  FunctionalState NewState)
901 {
902  uint32_t tmp;
903 
904  CHECK_PARAM(PARAM_UARTx(UARTx));
906 
907  tmp = 0;
908  if (NewState == ENABLE) {
909  if (ABConfigStruct->ABMode == UART_AUTOBAUD_MODE1){
910  tmp |= UART_ACR_MODE;
911  }
912  if (ABConfigStruct->AutoRestart == ENABLE){
913  tmp |= UART_ACR_AUTO_RESTART;
914  }
915  }
916 
917  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
918  {
919  if (NewState == ENABLE)
920  {
921  // Clear DLL and DLM value
922  ((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN;
923  ((LPC_UART1_TypeDef *)UARTx)->DLL = 0;
924  ((LPC_UART1_TypeDef *)UARTx)->DLM = 0;
925  ((LPC_UART1_TypeDef *)UARTx)->LCR &= ~UART_LCR_DLAB_EN;
926  // FDR value must be reset to default value
927  ((LPC_UART1_TypeDef *)UARTx)->FDR = 0x10;
928  ((LPC_UART1_TypeDef *)UARTx)->ACR = UART_ACR_START | tmp;
929  }
930  else
931  {
932  ((LPC_UART1_TypeDef *)UARTx)->ACR = 0;
933  }
934  }
935  else
936  {
937  if (NewState == ENABLE)
938  {
939  // Clear DLL and DLM value
940  UARTx->LCR |= UART_LCR_DLAB_EN;
941  UARTx->DLL = 0;
942  UARTx->DLM = 0;
943  UARTx->LCR &= ~UART_LCR_DLAB_EN;
944  // FDR value must be reset to default value
945  UARTx->FDR = 0x10;
946  UARTx->ACR = UART_ACR_START | tmp;
947  }
948  else
949  {
950  UARTx->ACR = 0;
951  }
952  }
953 }
954 
955 /*********************************************************************/
968 {
969  CHECK_PARAM(PARAM_UARTx(UARTx));
970  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
971  {
972  UARTx->ACR |= ABIntType;
973  }
974  else
975  UARTx->ACR |= ABIntType;
976 }
977 
978 /*********************************************************************/
990 void UART_TxCmd(LPC_UART_TypeDef *UARTx, FunctionalState NewState)
991 {
992  CHECK_PARAM(PARAM_UARTx(UARTx));
994 
995  if (NewState == ENABLE)
996  {
997  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
998  {
999  ((LPC_UART1_TypeDef *)UARTx)->TER |= UART_TER_TXEN;
1000  }
1001  else
1002  {
1003  UARTx->TER |= UART_TER_TXEN;
1004  }
1005  }
1006  else
1007  {
1008  if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
1009  {
1010  ((LPC_UART1_TypeDef *)UARTx)->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK;
1011  }
1012  else
1013  {
1014  UARTx->TER &= (~UART_TER_TXEN) & UART_TER_BITMASK;
1015  }
1016  }
1017 }
1018 
1019 /* UART IrDA functions ---------------------------------------------------*/
1020 
1021 #ifdef _UART3
1022 
1023 /*********************************************************************/
1033 {
1034  CHECK_PARAM(PARAM_UART_IrDA(UARTx));
1036 
1037  if (NewState == ENABLE)
1038  {
1039  UARTx->ICR |= UART_ICR_IRDAINV;
1040  }
1041  else if (NewState == DISABLE)
1042  {
1043  UARTx->ICR &= (~UART_ICR_IRDAINV) & UART_ICR_BITMASK;
1044  }
1045 }
1046 
1047 
1048 /*********************************************************************/
1056 void UART_IrDACmd(LPC_UART_TypeDef* UARTx, FunctionalState NewState)
1057 {
1058  CHECK_PARAM(PARAM_UART_IrDA(UARTx));
1060 
1061  if (NewState == ENABLE)
1062  {
1063  UARTx->ICR |= UART_ICR_IRDAEN;
1064  }
1065  else
1066  {
1067  UARTx->ICR &= (~UART_ICR_IRDAEN) & UART_ICR_BITMASK;
1068  }
1069 }
1070 
1071 
1072 /*********************************************************************/
1089 {
1090  uint32_t tmp, tmp1;
1091  CHECK_PARAM(PARAM_UART_IrDA(UARTx));
1093 
1094  tmp1 = UART_ICR_PULSEDIV(PulseDiv);
1095  tmp = UARTx->ICR & (~UART_ICR_PULSEDIV(7));
1096  tmp |= tmp1 | UART_ICR_FIXPULSE_EN;
1097  UARTx->ICR = tmp & UART_ICR_BITMASK;
1098 }
1099 
1100 #endif
1101 
1102 
1103 /* UART1 FullModem function ---------------------------------------------*/
1104 
1105 #ifdef _UART1
1106 
1107 /*********************************************************************/
1119  UART1_SignalState NewState)
1120 {
1121  uint8_t tmp = 0;
1122 
1126 
1127  switch (Pin){
1128  case UART1_MODEM_PIN_DTR:
1129  tmp = UART1_MCR_DTR_CTRL;
1130  break;
1131  case UART1_MODEM_PIN_RTS:
1132  tmp = UART1_MCR_RTS_CTRL;
1133  break;
1134  default:
1135  break;
1136  }
1137 
1138  if (NewState == ACTIVE){
1139  UARTx->MCR |= tmp;
1140  } else {
1141  UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK;
1142  }
1143 }
1144 
1145 
1146 /*********************************************************************/
1159  FunctionalState NewState)
1160 {
1161  uint8_t tmp = 0;
1162 
1166 
1167  switch(Mode){
1169  tmp = UART1_MCR_LOOPB_EN;
1170  break;
1172  tmp = UART1_MCR_AUTO_RTS_EN;
1173  break;
1175  tmp = UART1_MCR_AUTO_CTS_EN;
1176  break;
1177  default:
1178  break;
1179  }
1180 
1181  if (NewState == ENABLE)
1182  {
1183  UARTx->MCR |= tmp;
1184  }
1185  else
1186  {
1187  UARTx->MCR &= (~tmp) & UART1_MCR_BITMASK;
1188  }
1189 }
1190 
1191 
1192 /*********************************************************************/
1205 {
1207  return ((UARTx->MSR) & UART1_MSR_BITMASK);
1208 }
1209 
1210 
1211 /* UART RS485 functions --------------------------------------------------------------*/
1212 
1213 /*********************************************************************/
1222 void UART_RS485Config(LPC_UART1_TypeDef *UARTx, UART1_RS485_CTRLCFG_Type *RS485ConfigStruct)
1223 {
1224  uint32_t tmp;
1225 
1230  CHECK_PARAM(PARAM_SETSTATE(RS485ConfigStruct->DirCtrlPol_Level));
1234  CHECK_PARAM(PARAM_FUNCTIONALSTATE(RS485ConfigStruct->Rx_State));
1235 
1236  tmp = 0;
1237  // If Auto Direction Control is enabled - This function is used in Master mode
1238  if (RS485ConfigStruct->AutoDirCtrl_State == ENABLE)
1239  {
1240  tmp |= UART1_RS485CTRL_DCTRL_EN;
1241 
1242  // Set polar
1243  if (RS485ConfigStruct->DirCtrlPol_Level == SET)
1244  {
1245  tmp |= UART1_RS485CTRL_OINV_1;
1246  }
1247 
1248  // Set pin according to
1249  if (RS485ConfigStruct->DirCtrlPin == UART1_RS485_DIRCTRL_DTR)
1250  {
1251  tmp |= UART1_RS485CTRL_SEL_DTR;
1252  }
1253 
1254  // Fill delay time
1255  UARTx->RS485DLY = RS485ConfigStruct->DelayValue & UART1_RS485DLY_BITMASK;
1256  }
1257 
1258  // MultiDrop mode is enable
1259  if (RS485ConfigStruct->NormalMultiDropMode_State == ENABLE)
1260  {
1261  tmp |= UART1_RS485CTRL_NMM_EN;
1262  }
1263 
1264  // Auto Address Detect function
1265  if (RS485ConfigStruct->AutoAddrDetect_State == ENABLE)
1266  {
1267  tmp |= UART1_RS485CTRL_AADEN;
1268  // Fill Match Address
1269  UARTx->ADRMATCH = RS485ConfigStruct->MatchAddrValue & UART1_RS485ADRMATCH_BITMASK;
1270  }
1271 
1272 
1273  // Receiver is disable
1274  if (RS485ConfigStruct->Rx_State == DISABLE)
1275  {
1276  tmp |= UART1_RS485CTRL_RX_DIS;
1277  }
1278 
1279  // write back to RS485 control register
1280  UARTx->RS485CTRL = tmp & UART1_RS485CTRL_BITMASK;
1281 
1282  // Enable Parity function and leave parity in stick '0' parity as default
1284 }
1285 
1286 /*********************************************************************/
1295 {
1296  if (NewState == ENABLE){
1297  UARTx->RS485CTRL &= ~UART1_RS485CTRL_RX_DIS;
1298  } else {
1300  }
1301 }
1302 
1303 /*********************************************************************/
1311 uint32_t UART_RS485Send(LPC_UART1_TypeDef *UARTx, uint8_t *pDatFrm, \
1312  uint32_t size, uint8_t ParityStick)
1313 {
1314  uint8_t tmp, save;
1315  uint32_t cnt;
1316 
1317  if (ParityStick){
1318  save = tmp = UARTx->LCR & UART_LCR_BITMASK;
1319  tmp &= ~(UART_LCR_PARITY_EVEN);
1320  UARTx->LCR = tmp;
1321  cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING);
1322  while (!(UARTx->LSR & UART_LSR_TEMT));
1323  UARTx->LCR = save;
1324  } else {
1325  cnt = UART_Send((LPC_UART_TypeDef *)UARTx, pDatFrm, size, BLOCKING);
1326  while (!(UARTx->LSR & UART_LSR_TEMT));
1327  }
1328  return cnt;
1329 }
1330 
1331 /*********************************************************************/
1337 void UART_RS485SendSlvAddr(LPC_UART1_TypeDef *UARTx, uint8_t SlvAddr)
1338 {
1339  UART_RS485Send(UARTx, &SlvAddr, 1, 1);
1340 }
1341 
1342 /*********************************************************************/
1349 uint32_t UART_RS485SendData(LPC_UART1_TypeDef *UARTx, uint8_t *pData, uint32_t size)
1350 {
1351  return (UART_RS485Send(UARTx, pData, size, 0));
1352 }
1353 
1354 #endif /* _UART1 */
1355 
1356 #endif /* _UART */
1357 
1365 /* --------------------------------- End Of File ------------------------------ */
1366