sci.c
上传用户:lilishw
上传日期:2021-05-28
资源大小:1542k
文件大小:3k
源码类别:

Modem编程

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------------------------------
  2. //  Project:-   DE8681
  3. //  Filename:-  SCI.C
  4. //  Description:-   Routines for initialisation and use of the SCI for the PIC processor.
  5. //  Programmer:-    D.T.F   
  6. //  Version:-   2.0
  7. //  Created:-   28th February 2002
  8. //  Last modified:- 
  9. //---------------------------------------------------------------------------------------------------
  10. //  (C) Consumer Microcircuits Ltd 2002
  11. //
  12. //  This firmware was designed by:-
  13. //          Consumer Microcircuits Ltd,
  14. //          Langford, Maldon,
  15. //          ESSEX
  16. //          CM9 6WG.
  17. //  in the UK for use with CML evaluation kits only and is based on UK originated technology.
  18. //  Please contact
  19. //          sales@cmlmicro.co.uk
  20. //          +44 (0)1621 875500
  21. //  for licensing details.
  22. //---------------------------------------------------------------------------------------------------
  23. #define SCI_C
  24. #include    "ef8681.h"
  25. unsigned char sci_init(unsigned long int baud, unsigned char ninebits)
  26. {
  27.     int X;
  28.     unsigned long tmp;
  29.     
  30.     /* calculate and set baud rate register */
  31.     /* for asynchronous mode */
  32.     tmp = 16UL * baud;
  33.     X = (int)(FOSC/tmp) - 1;
  34.     if((X>255) || (X<0))
  35.     {
  36.         tmp = 64UL * baud;
  37.         X = (int)(FOSC/tmp) - 1;
  38.         if((X>255) || (X<0))
  39.         {
  40.             return 1;   /* panic - baud rate unobtainable */
  41.         }
  42.         else
  43.             BRGH = 0;   /* low baud rate */
  44.     }
  45.     else
  46.     {
  47.         BRGH = 1;   /* high baud rate */
  48.     }
  49.     SPBRG = X;  /* set the baud rate */
  50.     SYNC = 0;   /* asynchronous */
  51.     SPEN = 1;   /* enable serial port pins */
  52.     CREN = 1;   /* enable reception */
  53.     SREN = 0;   /* no effect */
  54.     TXIE = 0;   /* disable tx interrupts */
  55.     RCIE = 0;   /* disable rx interrupts */
  56.     TX9  = ninebits?1:0;    /* 8- or 9-bit transmission */
  57.     RX9  = ninebits?1:0;    /* 8- or 9-bit reception */
  58.     TXEN = 1;   /* enable the transmitter */
  59.     return 0;
  60. }
  61. void sci_putByte(unsigned char byte)
  62. {
  63.     while(!TXIF)    /* set when register is empty */
  64.         continue;
  65.     TXREG = byte;
  66.     return;
  67. }
  68. unsigned char sci_getByte(void)
  69. {
  70.     while(!RCIF)    /* set when register is not empty */
  71.         continue;
  72.     
  73.     return RCREG;   /* RXD9 and FERR are gone now */
  74. }
  75. unsigned char sci_checkOERR(void)
  76. {
  77.     if(OERR)    /* re-enable after overrun error */
  78.     {
  79.         CREN = 0;
  80.         CREN = 1;
  81.         return 1;
  82.     }
  83.     
  84.     return 0;
  85. }
  86. #define sci_putNinth(bitnine)   (TX9D = bitnine?1:0;)
  87. unsigned char sci_getNinth(void)
  88. {
  89.     while(!RCIF)
  90.         continue;
  91.     
  92.     return RX9D;    /* RCIF is not cleared until RCREG is read */
  93. }
  94. unsigned char sci_getFERR(void)
  95. {
  96.     while(!RCIF)
  97.         continue;
  98.     
  99.     return FERR;    /* RCIF is not cleared until RCREG is read */
  100. }