Advertisement
Guest User

uart code

a guest
Mar 11th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.98 KB | None | 0 0
  1. unsigned char uart1_transmit_buffer[UART1_XMIT_BUFFER_SIZE];    /* transmit buffer */
  2. unsigned char uart1_receive_buffer[UART1_RECV_BUFFER_SIZE];     /* receive buffer */
  3. unsigned char uart1_xmit_index;             /* xmit data input index */
  4. unsigned char uart1_xmit_outdex;            /* xmit data output index */
  5. unsigned char uart1_recv_index;             /* rcv data input index */
  6. unsigned char uart1_recv_outdex;            /* rcv data output index */
  7. /*
  8.     When a data is comming in the port, it is passed through to the output.
  9.     During that time, the transmit port is "locked".
  10. */
  11. unsigned char uart1_xmit_lock = UNLOCK;
  12.  
  13. /** public functions **/
  14.  
  15. /** private functions **/
  16.  
  17. void __attribute__((interrupt, __auto_psv__)) _U1TXInterrupt(void)
  18. {
  19. /* Note: this ISR takes about 13.6uS to complete at 7.3728Mhz */
  20.  
  21.     unsigned char TempOutdex, TempIndex, data_byte;
  22.     signed short junk;
  23.  
  24.     IFS0bits.U1TXIF = 0;                    /* clear the ISR flag */
  25.     TempOutdex = uart1_xmit_outdex;
  26.     TempIndex  = uart1_xmit_index;
  27.  
  28. /* Calculate number of full bytes in the buffer. */
  29.     junk = (signed short) ((signed short) TempIndex - (unsigned short) TempOutdex);
  30.     if (junk < 0)
  31.     {
  32.         junk += UART1_XMIT_BUFFER_SIZE;
  33.     }
  34. /* 'junk' now contains the number of full bytes in the transmit buffer */
  35.     if (junk > 0)
  36.     {
  37. /* there is data available to send */
  38.         data_byte = uart1_transmit_buffer[TempOutdex++];
  39.         U1TXREG = data_byte;                            /* send byte */
  40.         if (TempOutdex == UART1_XMIT_BUFFER_SIZE)
  41.         {
  42.             TempOutdex = 0;                             /* roll over */
  43.         }
  44.         junk--;                                         /* decrement byte count */
  45. /* If 'junk' is 0, transmission is complete. */
  46.         if (junk == 0)
  47.         {
  48. /* No more bytes to transfer here, disable the interrupt. */
  49.             IEC0bits.U1TXIE = 0;                        /* disable transmit interrupt */
  50.         }
  51.     }
  52.     uart1_xmit_outdex = TempOutdex;
  53. }
  54.  
  55. void __attribute__((interrupt, __auto_psv__)) _U1RXInterrupt(void)
  56. {
  57.     unsigned char TempOutdex, TempIndex, data_byte;
  58.     signed short junk;
  59.  
  60.     data_byte = (unsigned char) U1RXREG;    /* get the byte */
  61.     IFS0bits.U1RXIF = 0;                    /* clear the ISR flag */
  62.  
  63.     TempOutdex = uart1_recv_outdex;         /* get the indices */
  64.     TempIndex  = uart1_recv_index;
  65.  
  66.     junk = (signed short) ((signed short) TempOutdex - \
  67.                         (signed short) TempIndex);
  68.     if (junk <= 0)
  69.     {
  70.         junk += UART1_RECV_BUFFER_SIZE;
  71.     }
  72.     if (junk > 1)
  73.     {
  74. /* There's room in the buffer */
  75.         uart1_receive_buffer[TempIndex] = data_byte;    /* save data */
  76.         TempIndex++;                                    /* update index */
  77.         if (TempIndex == UART1_RECV_BUFFER_SIZE)
  78.         {
  79.             TempIndex = 0;                              /* roll over */
  80.         }
  81.         uart1_recv_index = TempIndex;                   /* save new index */
  82.     }
  83. }
  84.  
  85. void uart1_receive_interrupt_enable(void)
  86. {
  87.     IFS0bits.U1RXIF = 0;    /* clear the ISR flag */
  88.     IEC0bits.U1RXIE = 1;    /* enable the interrupt */
  89. }
  90.  
  91. void uart1_receive_interrupt_disable(void)
  92. {
  93.     IEC0bits.U1RXIE = 0;    /* disable the interrupt */
  94. }
  95.  
  96. /*
  97.  **  void uart1_init(void)
  98.  *
  99.  *  FILENAME: uart1_drivers.c
  100.  *
  101.  *  PARAMETERS: None
  102.  *
  103.  *  DESCRIPTION: Initialize UART1
  104.  *
  105.  *  RETURNS: None
  106.  *
  107.  *  RD12 is CTS to module
  108.  *  RD13 is RTS from module
  109.  *
  110. */
  111. void uart1_init(void)
  112. {
  113.     uart1_xmit_index  = 0;      /* initialize buffer indices */
  114.     uart1_xmit_outdex = 0;
  115.     uart1_recv_index  = 0;
  116.     uart1_recv_outdex = 0;
  117. /*
  118.     The desired baud rate is 115.2K baud.
  119.     The system frequency is 7.3728Mhz x 4 = 29.4912Mhz with the PLL running.
  120.     Fcy = 29.4912Mhz / 2 = 14.7456Mhz
  121.     U1BRG with BRGH = 0 is (14,745,600 / (16 x 230,400) } - 1 = 3
  122. */
  123.     {
  124.         // changed to 9600, can change it back to higher baud once we finished testing.
  125.         uint32_t val = (uint32_t)((uint32_t)14745600 / ((uint32_t)16 * (uint32_t)9600))  - (uint32_t)1;
  126.         U1BRG = val;                    /* baud rate divider */
  127.         //U1BRG = 3;                    /* baud rate divider */
  128.     }
  129.     U1STA = 0x0000;             /* initialize uart */
  130.     U1MODE = 0x8000;            /* enable uart */
  131.     U1STA = 0x0400;             /* turn on transmitter */
  132.     IFS0bits.U1RXIF = 0;        /* clear the ISR flag */
  133.     IEC0bits.U1RXIE = 1;        /* enable the interrupt */
  134. }
  135.  
  136. /*
  137.  ** signed short uart1_xmit_buffer_space(void)
  138.  *
  139.  *  FILENAME: uart1_drivers.c
  140.  *
  141.  *  PARAMETERS: None
  142.  *
  143.  *  DESCRIPTION: Returns number of empty bytes in
  144.  *              transmit buffer.
  145.  *
  146.  *  RETURNS: number of empty bytes in transmit buffer
  147.  *
  148.  */
  149. signed short uart1_xmit_buffer_space(void)
  150. {
  151.     signed short ReturnValue, junk;
  152.     unsigned char TempOutdex, TempIndex;
  153.  
  154.     TempOutdex = uart1_xmit_outdex;
  155.     TempIndex  = uart1_xmit_index;
  156.  
  157.     junk = (signed short) ((signed short) TempOutdex - \
  158.                         (signed short) TempIndex);
  159.     if (junk <= 0)
  160.     {
  161.         ReturnValue = junk + UART1_XMIT_BUFFER_SIZE;
  162.         if (ReturnValue == 1)
  163.         {
  164. /* full buffer indication */
  165.             ReturnValue = 0;
  166.         }
  167.     }
  168.     else
  169.     {
  170.         if (junk == 1)
  171.         {
  172.             ReturnValue = 0;            /* full buffer */
  173.         }
  174.         else
  175.         {
  176.             ReturnValue = junk;
  177.         }
  178.     }
  179.     return ReturnValue;
  180. }
  181.  
  182. /*
  183.  ** signed short uart1_xmit_buffer_data(void)
  184.  *
  185.  *  FILENAME: uart1_drivers.c
  186.  *
  187.  *  PARAMETERS: None
  188.  *
  189.  *  DESCRIPTION: Returns number of full bytes in
  190.  *              transmit buffer.
  191.  *
  192.  *  RETURNS: number of full bytes in transmit buffer
  193.  *
  194.  */
  195. signed short uart1_xmit_buffer_data(void)
  196. {
  197.     signed short ReturnValue, junk;
  198.     unsigned char TempOutdex, TempIndex;
  199.  
  200.     TempOutdex = uart1_xmit_outdex;
  201.     TempIndex  = uart1_xmit_index;
  202.  
  203.     junk = (signed short) ((signed short) TempIndex - \
  204.                         (signed short) TempOutdex);
  205.     if (junk < 0)
  206.     {
  207.         ReturnValue = junk + UART1_XMIT_BUFFER_SIZE;
  208.         if (ReturnValue == 63)
  209.         {
  210.             ReturnValue++;
  211.         }
  212.     }
  213.     else
  214.     {
  215.         ReturnValue = junk;
  216.     }
  217.     return ReturnValue; /* checked */
  218. }
  219.  
  220. /*
  221.  ** signed short uart1_recv_data(void)
  222.  *
  223.  *  FILENAME: uart1_drivers.c
  224.  *
  225.  *  PARAMETERS: None
  226.  *
  227.  *  DESCRIPTION: Returns number of full bytes
  228.  *              in receive buffer.
  229.  *
  230.  *  RETURNS: Number of full bytes in receive buffer
  231.  *
  232.  */
  233. signed short uart1_recv_buffer_data(void)
  234. {
  235.     signed short ReturnValue, junk;
  236.     unsigned char TempOutdex, TempIndex;
  237.  
  238.     TempOutdex = uart1_recv_outdex;
  239.     TempIndex  = uart1_recv_index;
  240.  
  241.     junk = (signed short) ((signed short) TempIndex - \
  242.                         (signed short) TempOutdex);
  243.     if (junk < 0)
  244.     {
  245.         ReturnValue = junk + UART1_RECV_BUFFER_SIZE;
  246.     }
  247.     else
  248.     {
  249.         ReturnValue = junk;
  250.     }
  251. //  if (ReturnValue == 63)
  252. //  {
  253. /* buffer is full here */
  254. //      ReturnValue++;
  255. //  }
  256.     return ReturnValue; /* checked */
  257. }
  258.  
  259. /*
  260.  ** signed short uart1_recv_buffer_space(void)
  261.  *
  262.  *  FILENAME: uart1_drivers.c
  263.  *
  264.  *  PARAMETERS: None
  265.  *
  266.  *  DESCRIPTION: Returns number of empty bytes in
  267.  *              receive buffer.
  268.  *
  269.  *  RETURNS: number of empty bytes in receive buffer
  270.  *
  271.  */
  272. signed short uart1_recv_buffer_space(void)
  273. {
  274.     signed short ReturnValue, junk;
  275.     unsigned char TempOutdex, TempIndex;
  276.  
  277.     TempOutdex = uart1_recv_outdex;
  278.     TempIndex  = uart1_recv_index;
  279.  
  280.     junk = (signed short) ((signed short) TempOutdex - \
  281.                         (signed short) TempIndex);
  282.     if (junk <= 0)
  283.     {
  284.         ReturnValue = junk + UART1_XMIT_BUFFER_SIZE;
  285.         if (ReturnValue == 1)
  286.         {
  287. /* full buffer indication */
  288.             ReturnValue = 0;
  289.         }
  290.     }
  291.     else
  292.     {
  293.         if (junk == 1)
  294.         {
  295. /* full buffer indication */
  296.             ReturnValue = 0;
  297.         }
  298.         else
  299.         {
  300.             ReturnValue = junk;
  301.         }
  302.     }
  303.     return ReturnValue;
  304. }
  305.  
  306. /*
  307.  **
  308.  *
  309.  *  FILENAME: signed short uart1_put_byte(unsigned char data_byte)
  310.  *
  311.  *  PARAMETERS: data_byte to put into the xmit buffer.
  312.  *
  313.  *  DESCRIPTION: Put a byte of data into the xmit buffer.
  314.  *
  315.  *  RETURNS: Returns the number of empty bytes in the buffer.
  316.  *          If the buffer was full when this function was called,
  317.  *          return a negative value.
  318.  *
  319.  */
  320. signed short uart1_put_byte(unsigned char data_byte)
  321. {
  322.     return uart1_put_data(&data_byte, 1);
  323. #if(0)
  324.     signed short ReturnValue;
  325.     unsigned char TempOutdex, TempIndex;
  326.  
  327.     TempOutdex = uart1_xmit_outdex;
  328.     TempIndex  = uart1_xmit_index;
  329.  
  330. /* See if there is there space in the buffer */
  331.     ReturnValue = (signed short) ((signed short) TempOutdex - \
  332.                         (signed short) TempIndex);
  333. #endif
  334. #if 0
  335.     if (ReturnValue <= 0)
  336.     {
  337.         ReturnValue += UART1_XMIT_BUFFER_SIZE;
  338.         if (ReturnValue < 0)
  339.         {
  340. /* space has become available here */
  341.             ReturnValue += UART1_XMIT_BUFFER_SIZE;
  342.             TempIndex -= UART1_XMIT_BUFFER_SIZE;
  343.         }
  344.     }
  345. /* ReturnValue now contains the number of empty bytes in the transmit buffer */
  346.     if (ReturnValue > 0)
  347.     {
  348. /* There's room */
  349.         uart1_transmit_buffer[TempIndex++] = data_byte; /* save data */
  350.         ReturnValue--;
  351.         if (TempIndex == UART1_XMIT_BUFFER_SIZE)
  352.         {
  353. /* roll over here */
  354.             TempIndex = 0;
  355.         }
  356.         if (TempIndex == TempOutdex)
  357.         {
  358. /* the buffer is full here */
  359.             TempIndex += UART1_XMIT_BUFFER_SIZE;
  360.         }
  361.         uart1_xmit_index = TempIndex;
  362.         IEC0bits.U1TXIE = 1;                        /* enable transmit interrupt */
  363.     }
  364.     else
  365.     {
  366. /* buffer was full, ignore request */
  367.         ReturnValue = -1;
  368.     }
  369.     return ReturnValue; /*checked */
  370. #endif
  371. }
  372.  
  373.  
  374. /*
  375.  ** unsigned char uart1_get_byte(void)
  376.  *
  377.  *  FILENAME: uart1_drivers.c
  378.  *
  379.  *  PARAMETERS: None
  380.  *
  381.  *  DESCRIPTION: Return byte from receive buffer
  382.  *
  383.  *  RETURNS: Next byte in receive buffer. If there
  384.  *          were no bytes in the buffer, return the
  385.  *          last byte again.
  386.  *
  387.  */
  388. unsigned char uart1_get_byte(void)
  389. {
  390.     signed short junk;
  391.     unsigned char TempOutdex, TempIndex, ReturnValue;
  392.  
  393.     TempOutdex = uart1_recv_outdex;
  394.     TempIndex  = uart1_recv_index;
  395.  
  396. /* get return data */
  397.     ReturnValue = uart1_receive_buffer[TempOutdex];
  398.  
  399.     junk = (signed short) ((signed short) TempIndex - \
  400.                         (signed short) TempOutdex);
  401.     if (junk < 0)
  402.     {
  403.         junk += UART1_RECV_BUFFER_SIZE;
  404. /* roll over condition here */
  405.     }
  406. /* junk has the "full" byte count */
  407.     if (junk > 0)
  408.     {
  409. /* There's data in the buffer here */
  410.         TempOutdex++;           /* increment the index */
  411.         if (TempOutdex == UART1_RECV_BUFFER_SIZE)
  412.         {
  413. /* roll over here */
  414.             TempOutdex = 0;
  415.         }
  416.     }
  417.     uart1_recv_outdex = TempOutdex;
  418.     return ReturnValue;
  419. }
  420.  
  421. /*
  422.  ** signed short uart1_put_data(unsigned char *in_buffer, signed short byte_count)
  423.  *
  424.  *  FILENAME: uart1_drivers.c
  425.  *
  426.  *  PARAMETERS: 'buffer' points to the block of data to put into the transmit
  427.  *              buffer. 'byte_count' is the number of bytes to transfer.
  428.  *
  429.  *  DESCRIPTION: Move 'byte_count' bytes of data from a buffer pointed to by
  430.  *              'buffer' into the transmit buffer if there's room.
  431.  *
  432.  *  RETURNS: If transfer is successful, return the number of empty bytes left
  433.  *          in the buffer. If there is not enough room to make the transfer,
  434.  *          skip this request and return a negative value.
  435.  *
  436.  */
  437. signed short uart1_put_data(unsigned char *buffer, signed short byte_count)
  438. {
  439.     signed short ReturnValue;
  440.     unsigned char TempOutdex, TempIndex;
  441.  
  442.     TempOutdex = uart1_xmit_outdex;                     /* don't let this change during this routine */
  443.     TempIndex  = uart1_xmit_index;                      /* don't change this till the routine is done */
  444.  
  445.     ReturnValue = (signed short) ((signed short) TempOutdex - \
  446.                                 (signed short) TempIndex);
  447.     if (ReturnValue <= 0)
  448.     {
  449.         ReturnValue += UART1_XMIT_BUFFER_SIZE;
  450.         if (ReturnValue == 1)
  451.         {
  452. /* full buffer indication */
  453.             ReturnValue = 0;
  454.         }
  455.     }
  456.     else
  457.     {
  458.         if (ReturnValue == 1)
  459.         {
  460.             ReturnValue = 0;            /* full buffer */
  461.         }
  462.     }
  463. /* 'ReturnValue' now contains the number of empty bytes in the buffer */
  464.     if (ReturnValue < byte_count)
  465.     {
  466. /* there isn't enough room in the buffer here. */
  467.         ReturnValue = -1;
  468.     }
  469.     else
  470.     {
  471. /* Complete the transfer here. */
  472.         do
  473.         {
  474.             uart1_transmit_buffer[TempIndex++] = *buffer++;     /* save data */
  475.             if (TempIndex == UART1_XMIT_BUFFER_SIZE)
  476.             {
  477.                 TempIndex = 0;                                  /*  Roll over here */
  478.             }
  479.             ReturnValue--;                                      /* keep track of buffer status */
  480.             byte_count--;                                       /* count the byte */
  481.         } while (byte_count > 0);
  482.         uart1_xmit_index = TempIndex;                           /* update index */
  483.         IEC0bits.U1TXIE = 1;                                    /* enable transmit interrupt */
  484.     }
  485.     return ReturnValue; /* checked */
  486. }
  487.  
  488. /*
  489.  ** signed short uart1_get_data(unsigned char *buffer, signed short byte_count)
  490.  *
  491.  *  FILENAME: uart1_drivers.c
  492.  *
  493.  *  PARAMETERS: 'buffer' points to where the data will be placed. 'byte_count'
  494.  *              is the number of bytes to transfer.
  495.  *
  496.  *  DESCRIPTION: Move 'byte_count' bytes of data from the receive buffer to the
  497.  *              location pointed to by 'buffer' if there's that much data in the
  498.  *              receive buffer. If the receive buffer doesn't have enough bytes,
  499.  *              transfer all of the bytes in the receive buffer.
  500.  *
  501.  *  RETURNS: If transfer is successful, return the number of full bytes left
  502.  *          in the receive buffer. If there weren't enough bytes in the receive
  503.  *          buffer to complete the request, return a negative value of the count
  504.  *          of the number of bytes not transferred.
  505.  *
  506.  */
  507. signed short uart1_get_data(unsigned char *buffer, signed short byte_count)
  508. {
  509.     signed short ReturnValue;
  510.     unsigned char TempOutdex, TempIndex;
  511.  
  512.     TempOutdex = uart1_recv_outdex;                     /* don't let this change during this routine */
  513.     TempIndex  = uart1_recv_index;                      /* don't change this till the routine is done */
  514.  
  515.     ReturnValue = (signed short) ((signed short) TempIndex - \
  516.                                 (signed short) TempOutdex);
  517.     if (ReturnValue < 0)
  518.     {
  519.         ReturnValue += UART1_RECV_BUFFER_SIZE;
  520.     }
  521. /* ReturnValue now contains the number of full bytes in the receive buffer. */
  522.     if (ReturnValue < byte_count)
  523.     {
  524. /* There isn't enough bytes in the buffer here. */
  525. /* Transfer all of the ReceiveBuffer bytes here. */
  526.         do
  527.         {
  528.             *buffer++ = uart1_receive_buffer[TempOutdex++];     /* save data */
  529.             if (TempOutdex == UART1_RECV_BUFFER_SIZE)
  530.             {
  531.                 TempOutdex = 0;                                 /*  Roll over here */
  532.             }
  533.             ReturnValue--;                                      /* keep track of buffer status */
  534.             byte_count--;                                       /* count the byte */
  535.         } while (ReturnValue > 0);
  536.         ReturnValue = -byte_count;
  537.     }
  538.     else
  539.     {
  540. /* Complete the transfer here. */
  541.         do
  542.         {
  543.             *buffer++ = uart1_receive_buffer[TempOutdex++];     /* save data */
  544.             if (TempOutdex == UART1_RECV_BUFFER_SIZE)
  545.             {
  546.                 TempOutdex = 0;                                 /*  Roll over here */
  547.             }
  548.             ReturnValue--;                                      /* keep track of buffer status */
  549.             byte_count--;                                       /* count the byte */
  550.         } while (byte_count > 0);
  551.     }
  552.     uart1_recv_outdex = TempOutdex;
  553.     return ReturnValue; /* checked */
  554. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement