25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

775 lines
22 KiB

  1. /*******************************************************************************
  2. * *
  3. * Copyright 2010 Rheinmetall Canada Inc. *
  4. * *
  5. * No part of this document may be reproduced, stored in *
  6. * a retrieval system, or transmitted, in any form or by any means, *
  7. * electronic, mechanical, photocopying, recording, or otherwise, *
  8. * without the prior written permission of Rheinmetall Canada Inc. *
  9. * *
  10. *******************************************************************************/
  11. /*
  12. Description:
  13. This is a template file for standard C code file.
  14. */
  15. /* ************************************************************************** */
  16. /* ¤Revision:
  17. 000 20100616 JFM,
  18. Original version.
  19. ### YYYYMMDD Initial, Bug Identification
  20. Change description.
  21. */
  22. /* ************************************************************************** */
  23. /* Includes */
  24. #include "define.h"
  25. #include "InternalUart.h"
  26. #include "uart.h"
  27. #include <stdio.h>
  28. //#include "Watchdog.h"
  29. #include "digitalio.h"
  30. #include "NetworkProtocol.h"
  31. /* ************************************************************************** */
  32. /* Local variables */
  33. char acIntUartRxBuff[MAX_INTERNAL_UART_PORT][INTERNAL_UART_BUFFER_DEPTH]; //Rx Buffers
  34. stInternalUartData astInternalUartData[MAX_INTERNAL_UART_PORT]; //port management data
  35. unsigned int LoraData = 0;
  36. void process(void);
  37. //-----------------------------------------------------------------------------
  38. //-----------------------------------------------------------------------------
  39. void InternalUartInit(void)
  40. {
  41. //Setup port 1
  42. //
  43. // U1MODEbits.ON = 0; //disable module
  44. // U1STA = 0;
  45. // U1STAbits.UTXEN = 0; //disable transmitter
  46. // IPC6bits.U1IP = 7; //priority 7
  47. // IPC6bits.U1IS = 3; //sub-priority 3
  48. // U1STAbits.UTXSEL = 0b01; //interrupt when all characters are transmitted
  49. //// U1STAbits.UTXSEL = 0b01; // //JFM 2012-08-27
  50. // IFS0bits.U1TXIF = 0; //clear interrupt flag
  51. // IEC0bits.U1TXIE = 1; //enable tx interrupt
  52. // U1STAbits.URXISEL = 0b00; //interrupt for each character received
  53. // IFS0bits.U1RXIF = 0;
  54. //#ifdef POLL_UART1_RX
  55. // IEC0bits.U1RXIE = 0; //disable rx interrupts
  56. //#else
  57. // IEC0bits.U1RXIE = 1; //enable rx interrupts
  58. //#endif
  59. // U1STAbits.URXEN = 1; //enable receiver
  60. // U1MODEbits.ON = 0; //disable module
  61. //Setup port 2
  62. //
  63. U2MODEbits.ON = 0; //disable module
  64. U2STA = 0;
  65. U2STAbits.UTXEN = 0; //disable transmitter
  66. IPC8bits.U2IP = 7; //priority 7
  67. IPC8bits.U2IS = 2; //sub-priority 2
  68. U2STAbits.UTXSEL = 0b01; //interrupt when all characters are transmitted
  69. IFS1bits.U2TXIF = 0; //clear interrupt flag
  70. IEC1bits.U2TXIE = 0; //enable tx interrupt
  71. U2STAbits.URXISEL = 0b00; //interrupt for each character received
  72. IFS1bits.U2RXIF = 0;
  73. #ifdef POLL_UART2_RX
  74. IEC1bits.U2RXIE = 0; //disable rx interrupts
  75. #else
  76. IEC1bits.U2RXIE = 1; //enable rx interrupts
  77. #endif
  78. U2STAbits.URXEN = 1; //enable receiver
  79. U2STAbits.UTXEN = 1;
  80. U2MODEbits.ON = 0; //disable module
  81. //Setup port 5
  82. //
  83. U5MODEbits.ON = 0; //disable module
  84. U5STA = 0;
  85. U5STAbits.UTXEN = 0; //disable transmitter
  86. IPC12bits.U5IP = 7; //priority 7
  87. IPC12bits.U5IS = 1; //sub-priority 1
  88. U5STAbits.UTXSEL = 0b01; //interrupt when all characters are transmitted
  89. IFS2bits.U5TXIF = 0; //clear interrupt flag
  90. IEC2bits.U5TXIE = 0; //enable tx interrupt
  91. U5STAbits.URXISEL = 0b00; //interrupt for each character received
  92. IFS2bits.U5RXIF = 0;
  93. #ifdef POLL_UART2_RX
  94. IEC1bits.U2RXIE = 0; //disable rx interrupts
  95. #else
  96. IEC2bits.U5RXIE = 1; //enable rx interrupts
  97. #endif
  98. U5STAbits.URXEN = 1; //enable receiver
  99. U5STAbits.UTXEN = 1;
  100. U5MODEbits.ON = 0; //disable module
  101. int i;
  102. for(i = 0; i < MAX_INTERNAL_UART_PORT; i++)
  103. {
  104. astInternalUartData[i].pcTxDataPtr = 0;
  105. astInternalUartData[i].iNbFIFOPendingBytes = 0;
  106. astInternalUartData[i].iTxDataSize = 0;
  107. astInternalUartData[i].iTxDataCounter = 0;
  108. astInternalUartData[i].iIsBusy = 0;
  109. astInternalUartData[i].iIsOpened = 0;
  110. astInternalUartData[i].iUartHandle = 0;
  111. }
  112. }
  113. //-----------------------------------------------------------------------------
  114. //-----------------------------------------------------------------------------
  115. //int SetIntalUartInterrupts(int p_iUartPort, int p_iRxInterrupt,int p_iTxInterrupt)
  116. //{
  117. // if(p_iUartPort > MAX_INTERNAL_UART_PORT)
  118. // return UART_INVALID_PORT;
  119. //
  120. // switch(p_iUartPort)
  121. // {
  122. // case INTERNAL_UART_PORT_1:
  123. // {
  124. // if(p_iTxInterrupt)
  125. // {
  126. // IFS0bits.U1TXIF = 0; //clear interrupt flag
  127. // IEC0bits.U1TXIE = 1; //enable tx interrupt
  128. // }
  129. // else
  130. // {
  131. // IEC0bits.U1TXIE = 0; //disable tx interrupt
  132. // U1STAbits.UTXEN = 1; //This bit must be set when working without interrupts
  133. // }
  134. // if(p_iRxInterrupt)
  135. // {
  136. // IFS0bits.U1RXIF = 0;
  137. // IEC0bits.U1RXIE = 1; //enable rx interrupt
  138. // }
  139. // else
  140. // {
  141. // IEC0bits.U1RXIE = 0; //disable rx interrupt
  142. // }
  143. // break;
  144. // }
  145. // case INTERNAL_UART_PORT_2:
  146. // {
  147. // if(p_iTxInterrupt)
  148. // {
  149. // IFS1bits.U2TXIF = 0; //clear interrupt flag
  150. // IEC1bits.U2TXIE = 1; //enable tx interrupt
  151. // }
  152. // else
  153. // {
  154. // IEC1bits.U2TXIE = 0; //disable tx interrupt
  155. // U2STAbits.UTXEN = 1; //This bit must be set when working without interrupts
  156. // }
  157. // if(p_iRxInterrupt)
  158. // {
  159. // IFS1bits.U2RXIF = 0;
  160. // IEC1bits.U2RXIE = 1; //enable rx interrupt
  161. // }
  162. // else
  163. // {
  164. // IEC1bits.U2RXIE = 0; //disable rx interrupt
  165. // }
  166. // break;
  167. // }
  168. // default:
  169. // {
  170. // return UART_INVALID_PORT;
  171. // }
  172. // }
  173. // return UART_OK;
  174. //}
  175. //-----------------------------------------------------------------------------
  176. //-----------------------------------------------------------------------------
  177. int OpenInternalPort(int p_iUartPort,int p_iUartHandle,char *p_pcHeadPtr, char *p_pcTailPtr, int p_iBaudRate, int p_iNbStopBits, int p_iParityEnable)
  178. {
  179. if(p_iUartPort > MAX_INTERNAL_UART_PORT)
  180. return UART_INVALID_PORT;
  181. int iBRG = (PERIPHERAL_FREQ/(4*p_iBaudRate)) - 1;
  182. int iMask = 0;
  183. switch(p_iNbStopBits)
  184. {
  185. case INT_UART_ONE_STOP_BIT:
  186. {
  187. break;
  188. }
  189. case INT_UART_TWO_STOP_BITS:
  190. {
  191. iMask |= 0x00000001;
  192. break;
  193. }
  194. }
  195. astInternalUartData[p_iUartPort].iUartHandle = p_iUartHandle;
  196. switch(p_iParityEnable)
  197. {
  198. case INT_UART_NO_PARITY:
  199. {
  200. break;
  201. }
  202. case INT_UART_EVEN_PARITY:
  203. {
  204. iMask |= 0x00000002;
  205. break;
  206. }
  207. case INT_UART_ODD_PARITY:
  208. {
  209. iMask |= 0x00000004;
  210. break;
  211. }
  212. }
  213. switch(p_iUartPort)
  214. {
  215. case INTERNAL_UART_PORT_1:
  216. {
  217. INTERNAL_UART1_TX_PIN_DIR = PIN_OUTPUT;
  218. INTERNAL_UART1_TX_PIN = 1;
  219. U1MODE = iMask;
  220. U1MODEbits.BRGH = 1;
  221. U1BRG = iBRG;
  222. U1MODEbits.ON = 1; //enable module
  223. break;
  224. }
  225. case INTERNAL_UART_PORT_2:
  226. {
  227. INTERNAL_UART2_TX_PIN_DIR = PIN_OUTPUT;
  228. INTERNAL_UART2_TX_PIN = 1;
  229. U2MODE = iMask;
  230. U2MODEbits.BRGH = 1;
  231. U2BRG = iBRG;
  232. U2MODEbits.ON = 1; //enable module
  233. break;
  234. }
  235. case INTERNAL_UART_PORT_5:
  236. {
  237. INTERNAL_UART5_TX_PIN_DIR = PIN_OUTPUT;
  238. INTERNAL_UART5_TX_PIN = 1;
  239. U5MODE = iMask;
  240. U5MODEbits.BRGH = 1;
  241. U5BRG = iBRG;
  242. U5MODEbits.ON = 1; //enable module
  243. break;
  244. }
  245. }
  246. astInternalUartData[p_iUartPort].iIsOpened = 1;
  247. return UART_OK;
  248. }
  249. //-----------------------------------------------------------------------------
  250. //-----------------------------------------------------------------------------
  251. int SendInternalUartData(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort, char *p_pcSourceBufferHead, char *p_pcSourceBufferTail)
  252. {
  253. int iBufSize;
  254. int iAvailableBufSize;
  255. char *p_cDataPointer;
  256. int i;
  257. stInternalUartData *p_stUartDataPtr = &astInternalUartData[p_iUartPort];
  258. if(p_stUartDataPtr->iIsOpened == 0)
  259. return UART_PORT_NOT_OPENED;
  260. //We use a FIFO stack that must be empty before a new transaction can occur
  261. //if(p_stUartDataPtr->iNbFIFOPendingBytes != 0) //If FIFO not empty
  262. if(p_stUartDataPtr->iIsBusy == 1)
  263. return UART_PORT_BUSY; //no space is available so flag the port as BUSY...
  264. iBufSize = p_iDataSize;
  265. if(iBufSize > INTERNAL_UART_BUFFER_DEPTH)
  266. iBufSize = INTERNAL_UART_BUFFER_DEPTH;
  267. p_cDataPointer = p_stUartDataPtr->pcTxDataPtr = &p_stUartDataPtr->acIntUartTxFIFO[0];
  268. p_stUartDataPtr->iNbFIFOPendingBytes = iBufSize;
  269. //Fill FIFO with data;
  270. for(i = 0; i< iBufSize; i++)
  271. {
  272. *p_cDataPointer++ = *p_pcDataBuf++;
  273. if(p_pcDataBuf > p_pcSourceBufferTail) //check for wrapping of source data circular buffer.
  274. p_pcDataBuf = p_pcSourceBufferHead;
  275. }
  276. p_stUartDataPtr->iIsBusy = 1; //informative flag to know we are TXing.
  277. //Begin Transmission
  278. //A TX interrupt will be generated immediately after setting UTXEN
  279. switch(p_iUartPort)
  280. {
  281. case INTERNAL_UART_PORT_1:
  282. {
  283. if(IEC0bits.U1TXIE)
  284. {
  285. //We consider at this point that the data has been sent for the upper layer.
  286. DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize);
  287. U1STAbits.UTXEN = 1;
  288. }
  289. else
  290. {
  291. int i;
  292. for(i = 0; i < iBufSize; i++)
  293. {
  294. // KickWatchdog();
  295. U1TXREG = *p_stUartDataPtr->pcTxDataPtr++;
  296. while(U1STAbits.TRMT == 0);
  297. }
  298. p_stUartDataPtr->iIsBusy = 0;
  299. DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize);
  300. }
  301. break;
  302. }
  303. case INTERNAL_UART_PORT_2:
  304. {
  305. if(IEC1bits.U2TXIE)
  306. {
  307. //We consider at this point that the data has been sent for the upper layer.
  308. DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize);
  309. U2STAbits.UTXEN = 1;
  310. }
  311. else
  312. {
  313. int i;
  314. for(i = 0; i < iBufSize; i++)
  315. {
  316. // KickWatchdog();
  317. U2TXREG = *p_stUartDataPtr->pcTxDataPtr++;
  318. while(U2STAbits.TRMT == 0);
  319. // LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN;
  320. }
  321. p_stUartDataPtr->iIsBusy = 0;
  322. DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize);
  323. }
  324. break;
  325. }
  326. case INTERNAL_UART_PORT_5:
  327. {
  328. if(IEC2bits.U5TXIE)
  329. {
  330. //We consider at this point that the data has been sent for the upper layer.
  331. DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize);
  332. U5STAbits.UTXEN = 1;
  333. }
  334. else
  335. {
  336. int i;
  337. for(i = 0; i < iBufSize; i++)
  338. {
  339. // KickWatchdog();
  340. U5TXREG = *p_stUartDataPtr->pcTxDataPtr++;
  341. while(U5STAbits.TRMT == 0);
  342. // LTE_MODULE_TX_LED_PIN = ~ LTE_MODULE_TX_LED_PIN;
  343. }
  344. p_stUartDataPtr->iIsBusy = 0;
  345. DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize);
  346. }
  347. break;
  348. }
  349. }
  350. return UART_OK;
  351. }
  352. int SendInternalUartDataBlocking(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort)
  353. {
  354. int i;
  355. switch(p_iUartPort)
  356. {
  357. case INTERNAL_UART_PORT_1:
  358. {
  359. int temp = IEC1;
  360. IEC0bits.U1TXIE = 0;
  361. for(i = 0; i < p_iDataSize; i++)
  362. {
  363. // LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN;
  364. U1TXREG = *p_pcDataBuf++;
  365. while(U1STAbits.TRMT == 0);
  366. }
  367. // LORA_MODULE_TX_LED_PIN = LED_OFF;
  368. IFS0bits.U1TXIF = 0;
  369. IEC1 = temp;
  370. break;
  371. }
  372. case INTERNAL_UART_PORT_2:
  373. {
  374. int temp = IEC1;
  375. IEC1bits.U2TXIE = 0;
  376. for(i = 0; i < p_iDataSize; i++)
  377. {
  378. // LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN;
  379. U2TXREG = *p_pcDataBuf++;
  380. while(U2STAbits.TRMT == 0);
  381. }
  382. // LORA_MODULE_TX_LED_PIN = LED_OFF;
  383. IFS1bits.U2TXIF = 0;
  384. IEC1 = temp;
  385. break;
  386. }
  387. case INTERNAL_UART_PORT_5:
  388. {
  389. int temp = IEC2;
  390. IEC2bits.U5TXIE = 0;
  391. for(i = 0; i < p_iDataSize; i++)
  392. {
  393. // LTE_MODULE_TX_LED_PIN = ~ LTE_MODULE_TX_LED_PIN;
  394. U2TXREG = *p_pcDataBuf++;
  395. while(U5STAbits.TRMT == 0);
  396. }
  397. // LTE_MODULE_TX_LED_PIN = LED_OFF;
  398. IFS2bits.U5TXIF = 0;
  399. IEC2 = temp;
  400. break;
  401. }
  402. }
  403. return UART_OK;
  404. }
  405. void TickInternalUart(void)
  406. {
  407. #ifdef POLL_UART1_RX
  408. if(U1STAbits.URXDA == 1)
  409. {
  410. if(U1STAbits.OERR) //Buffer overrun error. Data is lost.
  411. {
  412. U1STAbits.OERR = 0;
  413. }
  414. int i = 0;
  415. while(U1STAbits.URXDA && i < INTERNAL_UART_BUFFER_DEPTH)
  416. {
  417. char NewByte = U1RXREG;
  418. // DriveProtocolRxData(&NewByte,1);
  419. acIntUartRxBuff[INTERNAL_UART_PORT_1][i++] = NewByte;
  420. }
  421. // UartReceiveData(UART_1,&acIntUartRxBuff[INTERNAL_UART_PORT_1][0], i);
  422. // DriveProtocolRxData(&acIntUartRxBuff[INTERNAL_UART_PORT_1][0], i);
  423. }
  424. #endif
  425. #ifdef POLL_UART2_RX
  426. if(U2STAbits.URXDA == 1)
  427. {
  428. int i = 0;
  429. while(U2STAbits.URXDA == 1 && i < INTERNAL_UART_BUFFER_DEPTH)
  430. {
  431. char NewByte = U2RXREG;
  432. // acIntUartRxBuff[INTERNAL_UART_PORT_2][i++] = NewByte;
  433. LORA_MODULE_RX_LED_PIN = ~LORA_MODULE_RX_LED_PIN;
  434. ProtocolAnalyzeNewData(NewByte);
  435. // LoraData <<= 8;
  436. // unsigned int toto = NewByte;
  437. // toto &= 0x000000FF;
  438. // LoraData |= toto;
  439. //
  440. // if(LoraData == 0xDEADBEEF)
  441. // {
  442. // HEARTBEAT_LED_1_PIN = ~HEARTBEAT_LED_1_PIN;
  443. // LORA_ACTIVITY_LED_PIN = ~LORA_ACTIVITY_LED_PIN;
  444. // LoraData = 0;
  445. // }
  446. // HEARTBEAT_LED_2_PIN = ~HEARTBEAT_LED_2_PIN;
  447. }
  448. if(U2STAbits.OERR) //Buffer overrun error. Data is lost.
  449. {
  450. U2STAbits.OERR = 0;
  451. printf("Overrun\n");
  452. }
  453. // UartReceiveData(UART_2,&acIntUartRxBuff[INTERNAL_UART_PORT_2][0], i);
  454. // CUProtocolRxData(&acIntUartRxBuff[INTERNAL_UART_PORT_2][0], i);
  455. }
  456. #endif
  457. }
  458. //-----------------------------------------------------------------------------
  459. //-----------------------------------------------------------------------------
  460. void __ISR(_UART_1_VECTOR, ipl7) InternalUart1AInterrupt(void)
  461. {
  462. stInternalUartData *p_acUartDataPtr = &astInternalUartData[INTERNAL_UART_PORT_1];
  463. if(IFS0bits.U1TXIF && IEC0bits.U1TXIE)
  464. {
  465. IFS0bits.U1TXIF = 0;
  466. //Check if there is still data to send in FIFO
  467. if(p_acUartDataPtr->iNbFIFOPendingBytes == 0)
  468. {
  469. U1STAbits.UTXEN = 0; //all data sent, stop transmitter
  470. p_acUartDataPtr->iIsBusy = 0;
  471. }
  472. else
  473. {
  474. do
  475. {
  476. U1TXREG = *p_acUartDataPtr->pcTxDataPtr++; //send data
  477. p_acUartDataPtr->iNbFIFOPendingBytes--;
  478. }
  479. while((U1STAbits.UTXBF == 0) && //while there is space in buffer
  480. (p_acUartDataPtr->iNbFIFOPendingBytes != 0)); //and data to send
  481. // HCAM
  482. // if(p_acUartDataPtr->iNbFIFOPendingBytes == 0)
  483. // {
  484. // // U1STAbits.UTXEN = 0; //all data sent, stop transmitter
  485. // p_acUartDataPtr->iIsBusy = 0;
  486. // }
  487. }
  488. }
  489. if(IFS0bits.U1RXIF && IEC0bits.U1RXIE)
  490. {
  491. char NewByte;
  492. int i;
  493. IFS0bits.U1RXIF = 0;
  494. if(U1STAbits.OERR) //Buffer overrun error. Data is lost.
  495. {
  496. U1STAbits.OERR = 0;
  497. IFS0bits.U1RXIF = 0;
  498. printf("UART1 OERR\n");
  499. return;
  500. }
  501. i = 0;
  502. while(U1STAbits.URXDA)
  503. {
  504. NewByte = U1RXREG;
  505. acIntUartRxBuff[INTERNAL_UART_PORT_1][i++] = NewByte;
  506. }
  507. UartReceiveData(p_acUartDataPtr->iUartHandle,&acIntUartRxBuff[INTERNAL_UART_PORT_1][0], i);
  508. }
  509. }
  510. //-----------------------------------------------------------------------------
  511. //-----------------------------------------------------------------------------
  512. void __ISR(_UART_2_VECTOR, ipl7) InternalUart2Interrupt(void)
  513. {
  514. stInternalUartData *p_acUartDataPtr = &astInternalUartData[INTERNAL_UART_PORT_2];
  515. if(IFS1bits.U2TXIF && IEC1bits.U2TXIE)
  516. {
  517. IFS1bits.U2TXIF = 0;
  518. //Check if there is still data to send in FIFO
  519. if(p_acUartDataPtr->iNbFIFOPendingBytes == 0)
  520. {
  521. U2STAbits.UTXEN = 0; //all data sent, stop transmitter
  522. p_acUartDataPtr->iIsBusy = 0;
  523. //LORA_MODULE_TX_LED_PIN = LED_OFF;
  524. }
  525. else
  526. {
  527. do
  528. {
  529. U2TXREG = *p_acUartDataPtr->pcTxDataPtr++; //send data
  530. p_acUartDataPtr->iNbFIFOPendingBytes--;
  531. // LORA_MODULE_TX_LED_PIN = ~ LORA_MODULE_TX_LED_PIN;
  532. }
  533. while((U2STAbits.UTXBF == 0) && //while there is space in buffer
  534. (p_acUartDataPtr->iNbFIFOPendingBytes != 0)); //and data to send
  535. }
  536. }
  537. if(IFS1bits.U2RXIF && IEC1bits.U2RXIE)
  538. {
  539. IFS1bits.U2RXIF = 0;
  540. char NewByte;
  541. int i;
  542. if(U2STAbits.OERR) //Buffer overrun error. Data is lost.
  543. {
  544. U2STAbits.OERR = 0;
  545. IFS1bits.U2RXIF = 0;
  546. printf("UART2 OERR\n");
  547. return;
  548. }
  549. i = 0;
  550. while(U2STAbits.URXDA)
  551. {
  552. NewByte = U2RXREG;
  553. acIntUartRxBuff[INTERNAL_UART_PORT_2][i++] = NewByte;
  554. // LORA_MODULE_RX_LED_PIN = ~LORA_MODULE_RX_LED_PIN;
  555. }
  556. UartReceiveData(p_acUartDataPtr->iUartHandle,&acIntUartRxBuff[INTERNAL_UART_PORT_2][0], i);
  557. }
  558. }
  559. void __ISR(_UART_5_VECTOR, ipl7) InternalUart5Interrupt(void)
  560. {
  561. stInternalUartData *p_acUartDataPtr = &astInternalUartData[INTERNAL_UART_PORT_5];
  562. if(IFS2bits.U5TXIF && IEC2bits.U5TXIE)
  563. {
  564. IFS2bits.U5TXIF = 0;
  565. //Check if there is still data to send in FIFO
  566. if(p_acUartDataPtr->iNbFIFOPendingBytes == 0)
  567. {
  568. U5STAbits.UTXEN = 0; //all data sent, stop transmitter
  569. p_acUartDataPtr->iIsBusy = 0;
  570. //LORA_MODULE_TX_LED_PIN = LED_OFF;
  571. }
  572. else
  573. {
  574. // LTE_MODULE_TX_LED_PIN = LED_ON;
  575. do
  576. {
  577. U5TXREG = *p_acUartDataPtr->pcTxDataPtr++; //send data
  578. p_acUartDataPtr->iNbFIFOPendingBytes--;
  579. }
  580. while((U5STAbits.UTXBF == 0) && //while there is space in buffer
  581. (p_acUartDataPtr->iNbFIFOPendingBytes != 0)); //and data to send
  582. // LTE_MODULE_TX_LED_PIN = LED_OFF;
  583. }
  584. }
  585. if(IFS2bits.U5RXIF && IEC2bits.U5RXIE)
  586. {
  587. IFS2bits.U5RXIF = 0;
  588. char NewByte;
  589. int i;
  590. if(U5STAbits.OERR) //Buffer overrun error. Data is lost.
  591. {
  592. U5STAbits.OERR = 0;
  593. IFS2bits.U5RXIF = 0;
  594. printf("UART5 OERR\n");
  595. return;
  596. }
  597. i = 0;
  598. while(U5STAbits.URXDA)
  599. {
  600. NewByte = U5RXREG;
  601. acIntUartRxBuff[INTERNAL_UART_PORT_5][i++] = NewByte;
  602. // LTE_MODULE_RX_LED_PIN = ~LTE_MODULE_RX_LED_PIN;
  603. }
  604. UartReceiveData(p_acUartDataPtr->iUartHandle,&acIntUartRxBuff[INTERNAL_UART_PORT_5][0], i);
  605. }
  606. }
  607. //-----------------------------------------------------------------------------
  608. //-----------------------------------------------------------------------------
  609. /// Resets UART1 without closing it. Used when comm crashes.
  610. void ResetUart1(void)
  611. {
  612. U1MODEbits.ON = 0; //disable module
  613. U1STAbits.UTXEN = 0; //disable transmitter
  614. IEC0bits.U1TXIE = 0; //disable tx interrupt
  615. IFS0bits.U1TXIF = 0; //clear interrupt flag
  616. IEC0bits.U1TXIE = 1; //enable tx interrupt
  617. IEC0bits.U1RXIE = 0; //disable rx interrupts
  618. IEC0bits.U1RXIE = 0; //disable rx interrupts
  619. IFS0bits.U1RXIF = 0;
  620. #ifdef POLL_UART1_RX
  621. IEC0bits.U1RXIE = 0; //disable rx interrupts
  622. #else
  623. IEC0bits.U1RXIE = 1; //enable rx interrupts
  624. #endif
  625. U1STAbits.URXEN = 1; //enable receiver
  626. astInternalUartData[INTERNAL_UART_PORT_1].pcTxDataPtr = &astInternalUartData[INTERNAL_UART_PORT_1].acIntUartTxFIFO[0];
  627. astInternalUartData[INTERNAL_UART_PORT_1].iTxDataSize = 0;
  628. astInternalUartData[INTERNAL_UART_PORT_1].iIsBusy = 0;
  629. U1MODEbits.ON = 1; //enable module
  630. }
  631. //-----------------------------------------------------------------------------
  632. //-----------------------------------------------------------------------------
  633. void ResetUart2(void)
  634. {
  635. //Setup port 2
  636. //
  637. U2MODEbits.ON = 0; //disable module
  638. U2STAbits.UTXEN = 0; //disable transmitter
  639. IEC1bits.U2TXIE = 0; //disable tx interrupt
  640. IFS1bits.U2TXIF = 0; //clear interrupt flag
  641. IEC1bits.U2TXIE = 0; //enable tx interrupt
  642. IEC1bits.U2RXIE = 0; //disable rx interrupts
  643. IFS1bits.U2RXIF = 1;
  644. #ifdef POLL_UART2_RX
  645. IEC1bits.U2RXIE = 0; //disable rx interrupts
  646. #else
  647. IEC1bits.U2RXIE = 1; //enable rx interrupts
  648. #endif
  649. U2STAbits.URXEN = 1; //enable receiver
  650. astInternalUartData[INTERNAL_UART_PORT_2].pcTxDataPtr = &astInternalUartData[INTERNAL_UART_PORT_2].acIntUartTxFIFO[0];
  651. astInternalUartData[INTERNAL_UART_PORT_2].iTxDataSize = 0;
  652. astInternalUartData[INTERNAL_UART_PORT_2].iIsBusy = 0;
  653. U2MODEbits.ON = 1; //disable module
  654. }
  655. void ResetUart5(void)
  656. {
  657. //Setup port 2
  658. //
  659. U5MODEbits.ON = 0; //disable module
  660. U5STAbits.UTXEN = 0; //disable transmitter
  661. IEC2bits.U5TXIE = 0; //disable tx interrupt
  662. IFS2bits.U5TXIF = 0; //clear interrupt flag
  663. IEC2bits.U5TXIE = 0; //enable tx interrupt
  664. IEC2bits.U5RXIE = 0; //disable rx interrupts
  665. IFS2bits.U5RXIF = 1;
  666. #ifdef POLL_UART2_RX
  667. IEC2bits.U5RXIE = 0; //disable rx interrupts
  668. #else
  669. IEC2bits.U5RXIE = 1; //enable rx interrupts
  670. #endif
  671. U5STAbits.URXEN = 1; //enable receiver
  672. astInternalUartData[INTERNAL_UART_PORT_5].pcTxDataPtr = &astInternalUartData[INTERNAL_UART_PORT_5].acIntUartTxFIFO[0];
  673. astInternalUartData[INTERNAL_UART_PORT_5].iTxDataSize = 0;
  674. astInternalUartData[INTERNAL_UART_PORT_5].iIsBusy = 0;
  675. U5MODEbits.ON = 1; //enable module
  676. }
  677. //-----------------------------------------------------------------------------
  678. void process(void)
  679. {
  680. }
  681. //EOF