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

Modem编程

开发平台:

C/C++

  1. //---------------------------------------------------------------------------------------------------
  2. // Project:- DE8681
  3. //   Filename:- CBUS.C
  4. // Description:- SPI interface to CMX868.
  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 CBUS_C
  24. #include "ef8681.h"
  25. void wr_cbus(unsigned char cbus_addr, unsigned char cbus_byte)
  26. {
  27. PICCSN = 0; // Clear CSN
  28. load_spi(cbus_addr); // Load CBUS address byte
  29. load_spi(cbus_byte); // Load CBUS byte
  30. PICCSN = 1; // Set CSN
  31. }
  32. void wr16_cbus(unsigned char cbus_addr, unsigned int cbus_word)
  33. {
  34. PICCSN = 0; // Clear CSN
  35. load_spi(cbus_addr); // Load CBUS address byte
  36. load_spi((cbus_word >> 8) & 0xFF); // Load CBUS MS byte
  37. load_spi(cbus_word & 0xFF); // Load CBUS LS byte
  38. PICCSN = 1; // Set CSN
  39. }
  40. unsigned char rd_cbus(unsigned char cbus_addr)
  41. {
  42. unsigned char cbus_byte;
  43. PICCSN = 0; // Clear CSN
  44. load_spi(cbus_addr); // Load CBUS address byte
  45. cbus_byte = load_spi(0x00); // Read CBUS byte
  46. PICCSN = 1; // Set CSN
  47. return (cbus_byte); // Return CBUS Byte
  48. }
  49. unsigned int rd16_cbus(unsigned char cbus_addr)
  50. {
  51. unsigned int cbus_word;
  52. unsigned char cbus_lsbyte,cbus_msbyte;
  53. PICCSN = 0; // Clear CSN
  54. load_spi(cbus_addr); // Load CBUS address byte
  55. cbus_msbyte = load_spi(0x00); // Read CBUS MS byte
  56. cbus_lsbyte = load_spi(0x00); // Read CBUS MS byte
  57. PICCSN = 1; // Set CSN
  58. cbus_word = ((cbus_msbyte & 0xFF) << 8) | (cbus_lsbyte & 0xFF); 
  59. return (cbus_word); // Return CBUS Word
  60. }
  61. void reset_cbus()
  62. {
  63. PICCSN = 0; // Clear CSN
  64. load_spi(CMXGENRESET); // Load general reset byte
  65. PICCSN = 1; // Set CSN
  66. // Clear CMX868 write shadow registers
  67. CMXGENCTRL = 0;
  68. CMXTXMODE = 0;
  69. CMXRXMODE = 0;
  70. CMXTXDATA = 0;
  71. CMXTXDATAV14 = 0;
  72. CMXPROG = 0;
  73. CMXTESTADDR = 0;
  74. CMXTESTWR = 0;
  75. }
  76. void pwrup()
  77. {
  78. XTAL = USER_XTAL; // Ensure correct CMX868 Xtal is selected (S24 Bit 0)
  79. PWRUP = 1; // Power Up CMX868
  80. RESET = 1; // Initially hold internal circuitry in reset condition 
  81. wr16_cbus(CMXGENCTRL_ADDR,CMXGENCTRL); // Update CBUS register
  82. DelayMs(20); // 20ms Power Up Delay
  83. RESET = 0; // Normal Operation
  84. wr16_cbus(CMXGENCTRL_ADDR,CMXGENCTRL); // Update CBUS register
  85. }
  86. unsigned char load_spi(unsigned char loadvalue)
  87. {
  88. SSPBUF = loadvalue;
  89. while(!SSPIF) // Wait until SSP interrupt flag is clear
  90. continue;
  91. SSPIF = 0; // Clear SSP interrupt flag
  92. return(SSPBUF);
  93. }
  94. void init_spi()
  95. {
  96. SSPCON = 0; // SSPM3:SSPM0=0, SPI Master Mode, Clock=Fosc/4.
  97. CKP = 0; // Idle state for clock is LO
  98. STAT_CKE = 1; // With CKP = 0 and CKE = 1 data transmitted on rising edge
  99. SSPEN = 1; // Enables serial port and configures SCK, SDO and SDI as serial port pins.
  100. SSPIF = 0; // Clear SSP interrupt flag
  101. }