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

Modem编程

开发平台:

Visual 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. }