sci.c
上传用户:sdttscl
上传日期:2010-01-04
资源大小:683k
文件大小:3k
源码类别:

Modem编程

开发平台:

C/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. /* calculate and set baud rate register */
  30. /* for asynchronous mode */
  31. tmp = 16UL * baud;
  32. X = (int)(FOSC/tmp) - 1;
  33. if((X>255) || (X<0))
  34. {
  35. tmp = 64UL * baud;
  36. X = (int)(FOSC/tmp) - 1;
  37. if((X>255) || (X<0))
  38. {
  39. return 1; /* panic - baud rate unobtainable */
  40. }
  41. else
  42. BRGH = 0; /* low baud rate */
  43. }
  44. else
  45. {
  46. BRGH = 1; /* high baud rate */
  47. }
  48. SPBRG = X; /* set the baud rate */
  49. SYNC = 0; /* asynchronous */
  50. SPEN = 1; /* enable serial port pins */
  51. CREN = 1; /* enable reception */
  52. SREN = 0; /* no effect */
  53. TXIE = 0; /* disable tx interrupts */
  54. RCIE = 0; /* disable rx interrupts */
  55. TX9  = ninebits?1:0; /* 8- or 9-bit transmission */
  56. RX9  = ninebits?1:0; /* 8- or 9-bit reception */
  57. TXEN = 1; /* enable the transmitter */
  58. return 0;
  59. }
  60. void sci_putByte(unsigned char byte)
  61. {
  62. while(!TXIF) /* set when register is empty */
  63. continue;
  64. TXREG = byte;
  65. return;
  66. }
  67. unsigned char sci_getByte(void)
  68. {
  69. while(!RCIF) /* set when register is not empty */
  70. continue;
  71. return RCREG; /* RXD9 and FERR are gone now */
  72. }
  73. unsigned char sci_checkOERR(void)
  74. {
  75. if(OERR) /* re-enable after overrun error */
  76. {
  77. CREN = 0;
  78. CREN = 1;
  79. return 1;
  80. }
  81. return 0;
  82. }
  83. #define sci_putNinth(bitnine) (TX9D = bitnine?1:0;)
  84. unsigned char sci_getNinth(void)
  85. {
  86. while(!RCIF)
  87. continue;
  88. return RX9D; /* RCIF is not cleared until RCREG is read */
  89. }
  90. unsigned char sci_getFERR(void)
  91. {
  92. while(!RCIF)
  93. continue;
  94. return FERR; /* RCIF is not cleared until RCREG is read */
  95. }