TI_CC_spi.c
上传用户:zhingjinbo
上传日期:2014-07-24
资源大小:32k
文件大小:50k
源码类别:

邮电通讯系统

开发平台:

Visual C++

  1. //----------------------------------------------------------------------------
  2. //  Description:  This file contains functions that allow the MSP430 device to 
  3. //  access the SPI interface of the CC1100/CC2500.  There are multiple 
  4. //  instances of each function; the one to be compiled is selected by the 
  5. //  system variable TI_CC_RF_SER_INTF, defined in "TI_CC_hardware_board.h".
  6. //
  7. //  MSP430/CC1100-2500 Interface Code Library v1.0
  8. //
  9. //  K. Quiring
  10. //  Texas Instruments, Inc.
  11. //  July 2006
  12. //  IAR Embedded Workbench v3.41
  13. //----------------------------------------------------------------------------
  14. #include "include.h"
  15. #include "TI_CC_spi.h"
  16. //----------------------------------------------------------------------------
  17. //  void TI_CC_SPISetup(void)
  18. //
  19. //  DESCRIPTION:
  20. //  Configures the assigned interface to function as a SPI port and
  21. //  initializes it.
  22. //----------------------------------------------------------------------------
  23. //  void TI_CC_SPIWriteReg(char addr, char value)
  24. //
  25. //  DESCRIPTION:
  26. //  Writes "value" to a single configuration register at address "addr".
  27. //----------------------------------------------------------------------------
  28. //  void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
  29. //
  30. //  DESCRIPTION:
  31. //  Writes values to multiple configuration registers, the first register being
  32. //  at address "addr".  First data byte is at "buffer", and both addr and
  33. //  buffer are incremented sequentially (within the CCxxxx and MSP430,
  34. //  respectively) until "count" writes have been performed.
  35. //----------------------------------------------------------------------------
  36. //  char TI_CC_SPIReadReg(char addr)
  37. //
  38. //  DESCRIPTION:
  39. //  Reads a single configuration register at address "addr" and returns the
  40. //  value read.
  41. //----------------------------------------------------------------------------
  42. //  void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
  43. //
  44. //  DESCRIPTION:
  45. //  Reads multiple configuration registers, the first register being at address
  46. //  "addr".  Values read are deposited sequentially starting at address
  47. //  "buffer", until "count" registers have been read.
  48. //----------------------------------------------------------------------------
  49. //  char TI_CC_SPIReadStatus(char addr)
  50. //
  51. //  DESCRIPTION:
  52. //  Special read function for reading status registers.  Reads status register
  53. //  at register "addr" and returns the value read.
  54. //----------------------------------------------------------------------------
  55. //  void TI_CC_SPIStrobe(char strobe)
  56. //
  57. //  DESCRIPTION:
  58. //  Special write function for writing to command strobe registers.  Writes
  59. //  to the strobe at address "addr".
  60. //----------------------------------------------------------------------------
  61. // Delay function. # of CPU cycles delayed is similar to "cycles". Specifically,
  62. // it's ((cycles-15) % 6) + 15.  Not exact, but gives a sense of the real-time
  63. // delay.  Also, if MCLK ~1MHz, "cycles" is similar to # of useconds delayed.
  64. void TI_CC_Wait(unsigned int cycles)
  65. {
  66.   while(cycles>15)                          // 15 cycles consumed by overhead
  67.     cycles = cycles - 6;                    // 6 cycles consumed each iteration
  68. }
  69. // SPI port functions
  70. #if TI_CC_RF_SER_INTF == TI_CC_SER_INTF_USART0
  71. void TI_CC_SPISetup(void)
  72. {
  73.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  74.   TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;         // /CS disable
  75.   ME1 |= USPIE0;                            // Enable USART0 SPI mode
  76.   UCTL0 |= CHAR + SYNC + MM;                // 8-bit SPI Master **SWRST**
  77.   UTCTL0 |= CKPH + SSEL1 + SSEL0 + STC;     // SMCLK, 3-pin mode
  78.   UBR00 = 0x02;                             // UCLK/2
  79.   UBR10 = 0x00;                             // 0
  80.   UMCTL0 = 0x00;                            // No modulation
  81.   TI_CC_SPI_USART0_PxSEL |= TI_CC_SPI_USART0_SIMO | TI_CC_SPI_USART0_SOMI | TI_CC_SPI_USART0_UCLK;
  82.                                             // SPI option select
  83.   TI_CC_SPI_USART0_PxDIR |= TI_CC_SPI_USART0_SIMO + TI_CC_SPI_USART0_UCLK;
  84.                                             // SPI TX out direction
  85.   UCTL0 &= ~SWRST;                          // Initialize USART state machine
  86. }
  87. void TI_CC_SPIWriteReg(char addr, char value)
  88. {
  89.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  90.     while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);// Wait for CCxxxx ready
  91.     IFG1 &= ~URXIFG0;                       // Clear flag from first dummy byte
  92.     U0TXBUF = addr;                         // Send address
  93.     while (!(IFG1&URXIFG0));                // Wait for TX to finish
  94.     IFG1 &= ~URXIFG0;                       // Clear flag from first dummy byte
  95.     U0TXBUF = value;                        // Send value
  96.     while (!(IFG1&URXIFG0));                // Wait for end of data TX
  97.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  98. }
  99. void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
  100. {
  101.     char i;
  102.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  103.     while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);// Wait for CCxxxx ready
  104.     U0TXBUF = addr | TI_CCxxx0_WRITE_BURST; // Send address
  105.     while (!(IFG1&UTXIFG0));                // Wait for TX to finish
  106.     for (i = 0; i < count; i++)
  107.     {
  108.       U0TXBUF = buffer[i];                  // Send data
  109.       while (!(IFG1&UTXIFG0));              // Wait for TX to finish
  110.     }
  111.     IFG1 &= ~URXIFG0;
  112.     while(!(IFG1&URXIFG0));
  113.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  114. }
  115. char TI_CC_SPIReadReg(char addr)
  116. {
  117.   char x;
  118.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  119.   while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);// Wait for CCxxxx ready
  120.   U0TXBUF = (addr | TI_CCxxx0_READ_SINGLE); // Send address
  121.   while (!(IFG1&URXIFG0));                  // Wait for TX to finish
  122.   IFG1 &= ~URXIFG0;                         // Clear flag set during last write
  123.   U0TXBUF = 0;                              // Dummy write so we can read data
  124.   while (!(IFG1&URXIFG0));                  // Wait for RX to finish
  125.   x = U0RXBUF;                              // Read data
  126.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  127.   return x;
  128. }
  129. void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
  130. {
  131.   unsigned int i;
  132.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  133.   while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);// Wait for CCxxxx ready
  134.   IFG1 &= ~URXIFG0;                         // Clear flag
  135.   U0TXBUF = (addr | TI_CCxxx0_READ_BURST);  // Send address
  136.   while (!(IFG1&UTXIFG0));                  // Wait for TXBUF ready
  137.   U0TXBUF = 0;                              // Dummy write to read 1st data byte
  138.   // Addr byte is now being TX'ed, with dummy byte to follow immediately after
  139.   while (!(IFG1&URXIFG0));                  // Wait for end of addr byte TX
  140.   IFG1 &= ~URXIFG0;                         // Clear flag
  141.   while (!(IFG1&URXIFG0));                  // Wait for end of 1st data byte TX
  142.   // First data byte now in RXBUF
  143.   for (i = 0; i < (count-1); i++)
  144.   {
  145.     U0TXBUF = 0;                            //Initiate next data RX, meanwhile..
  146.     buffer[i] = U0RXBUF;                    // Store data from last data RX
  147.     while (!(IFG1&URXIFG0));                // Wait for end of data RX
  148.   }
  149.   buffer[count-1] = U0RXBUF;                // Store last RX byte in buffer
  150.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  151. }
  152. // For status/strobe addresses, the BURST bit selects between status registers
  153. // and command strobes.
  154. char TI_CC_SPIReadStatus(char addr)
  155. {
  156.   char x;
  157.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  158.   while (TI_CC_SPI_USART0_PxIN & TI_CC_SPI_USART0_SOMI);// Wait for CCxxxx ready
  159.   IFG1 &= ~URXIFG0;                         // Clear flag set during last write
  160.   U0TXBUF = (addr | TI_CCxxx0_READ_BURST);  // Send address
  161.   while (!(IFG1&URXIFG0));                  // Wait for TX to finish
  162.   IFG1 &= ~URXIFG0;                         // Clear flag set during last write
  163.   U0TXBUF = 0;                              // Dummy write so we can read data
  164.   while (!(IFG1&URXIFG0));                  // Wait for RX to finish
  165.   x = U0RXBUF;                              // Read data
  166.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  167.   return x;
  168. }
  169. void TI_CC_SPIStrobe(char strobe)
  170. {
  171.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  172.   while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);// Wait for CCxxxx ready
  173.   U0TXBUF = strobe;                         // Send strobe
  174.   // Strobe addr is now being TX'ed
  175.   IFG1 &= ~URXIFG0;                         // Clear flag
  176.   while (!(IFG1&URXIFG0));                  // Wait for end of addr TX
  177.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  178. }
  179. void TI_CC_PowerupResetCCxxxx(void)
  180. {
  181.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  182.   TI_CC_Wait(30);
  183.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  184.   TI_CC_Wait(30);
  185.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  186.   TI_CC_Wait(45);
  187.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  188.   while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);// Wait for CCxxxx ready
  189.   U0TXBUF = TI_CCxxx0_SRES;                 // Send strobe
  190.   // Strobe addr is now being TX'ed
  191.   IFG1 &= ~URXIFG0;                         // Clear flag
  192.   while (!(IFG1&URXIFG0));                  // Wait for end of addr TX
  193.   while (TI_CC_SPI_USART0_PxIN&TI_CC_SPI_USART0_SOMI);
  194.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  195. }
  196. #elif TI_CC_RF_SER_INTF == TI_CC_SER_INTF_USART1
  197. void TI_CC_SPISetup(void)
  198. {
  199.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  200.   TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;         // /CS disable
  201.   ME2 |= USPIE1;                            // Enable USART1 SPI mode
  202.   UCTL1 |= CHAR + SYNC + MM;                // 8-bit SPI Master **SWRST**
  203.   UTCTL1 |= CKPL + SSEL1 + SSEL0 + STC;     // SMCLK, 3-pin mode
  204.   UBR01 = 0x02;                             // UCLK/2
  205.   UBR11 = 0x00;                             // 0
  206.   UMCTL1 = 0x00;                            // No modulation
  207.   TI_CC_SPI_USART1_PxSEL |= TI_CC_SPI_USART1_SIMO | TI_CC_SPI_USART1_SOMI | TI_CC_SPI_USART1_UCLK;
  208.                                             // SPI option select
  209.   TI_CC_SPI_USART1_PxDIR |= TI_CC_SPI_USART1_SIMO + TI_CC_SPI_USART1_UCLK;
  210.                                             // SPI TXD out direction
  211.   UCTL1 &= ~SWRST;                          // Initialize USART state machine
  212. }
  213. void TI_CC_SPIWriteReg(char addr, char value)
  214. {
  215.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  216.     while (TI_CC_SPI_USART1_PxIN&TI_CC_SPI_USART1_SOMI);// Wait for CCxxxx ready
  217.     IFG2 &= ~URXIFG1;                       // Clear flag
  218.     U1TXBUF = addr;                         // Send address
  219.     //while (!(IFG2&URXIFG1));                // Wait for TX to finish
  220.     //IFG2 &= ~URXIFG1;                       // Clear flag
  221.     while(!(U1TCTL&TXEPT));                 // Wait for TX to finish
  222.     U1TXBUF = value;                        // Load data for TX after addr
  223.     //while (!(IFG2&URXIFG1));                // Wait for end of addr TX
  224.     while(!(U1TCTL&TXEPT));                 // Wait for end of addr TX
  225.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  226. }
  227. void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
  228. {
  229.     char i;
  230.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  231.     while (TI_CC_SPI_USART1_PxIN&TI_CC_SPI_USART1_SOMI);// Wait for CCxxxx ready
  232.     U1TXBUF = addr | TI_CCxxx0_WRITE_BURST; // Send address
  233.     while (!(IFG2&UTXIFG1));                // Wait for TX to finish
  234.     for (i = 0; i < count; i++)
  235.     {
  236.       U1TXBUF = buffer[i];                  // Send data
  237.       while (!(IFG2&UTXIFG1));              // Wait for TX to finish
  238.     }
  239.     //IFG2 &= ~URXIFG1;
  240.     //while(!(IFG2&URXIFG1));
  241.     while(!(U1TCTL&TXEPT));
  242.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  243. }
  244. char TI_CC_SPIReadReg(char addr)
  245. {
  246.   char x;
  247.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  248.   while (TI_CC_SPI_USART1_PxIN&TI_CC_SPI_USART1_SOMI);// Wait for CCxxxx ready
  249.   //IFG2 &= ~URXIFG1;                         // Clear flag set during addr TX
  250.   U1TXBUF = (addr | TI_CCxxx0_READ_SINGLE); // Send address
  251.   //while (!(IFG2&URXIFG1));                  // Wait for TXBUF ready
  252.   //IFG2 &= ~URXIFG1;                         // Clear flag set during addr TX
  253.   while(!(U1TCTL&TXEPT));                   // Wait for addr to be sent
  254.   U1TXBUF = 0;                              // Load dummy byte for TX after addr
  255.   //while (!(IFG2&URXIFG1));                  // Wait for end of dummy byte TX
  256.   while(!(U1TCTL&TXEPT));                   // Wait for end of dummy byte TX
  257.   x = U1RXBUF;                              // Read data
  258.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  259.   return x;
  260. }
  261. void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
  262. {
  263.   unsigned int i;
  264.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  265.   while (TI_CC_SPI_USART1_PxIN&TI_CC_SPI_USART1_SOMI);// Wait for CCxxxx ready
  266.   //IFG2 &= ~URXIFG1;                         // Clear flag
  267.   U1TXBUF = (addr | TI_CCxxx0_READ_BURST);  // Send address
  268.   while (!(IFG2&UTXIFG1));                  // Wait for TXBUF ready
  269.   U1TXBUF = 0;                              // Dummy write to read 1st data byte
  270.   // Addr byte is now being TX'ed, with dummy byte to follow immediately after
  271.   //while (!(IFG2&URXIFG1));                  // Wait for end of addr byte TX
  272.   while(!(U1TCTL&TXEPT));
  273.   //IFG2 &= ~URXIFG1;                         // Clear flag
  274.   //while (!(IFG2&URXIFG1));                  // Wait for end of 1st data byte TX
  275.   // First data byte now in RXBUF
  276.   for (i = 0; i < (count-1); i++)
  277.   {
  278.     U1TXBUF = 0;                            //Initiate next data RX, meanwhile..
  279.     buffer[i] = U1RXBUF;                    // Store data from last data RX
  280.     while (!(IFG2&URXIFG1));                // Wait for end of data RX
  281.   }
  282.   buffer[count-1] = U1RXBUF;                // Store last RX byte in buffer
  283.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  284. }
  285. char TI_CC_SPIReadStatus(char addr)
  286. {
  287.   char x;
  288.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  289.   while (TI_CC_SPI_USART1_PxIN&TI_CC_SPI_USART1_SOMI);// Wait for CCxxxx ready
  290.   //IFG2 &= ~URXIFG1;                         // Clear flag set during last write
  291.   U1TXBUF = (addr | TI_CCxxx0_READ_BURST);  // Send address
  292.   //while (!(IFG2&URXIFG1));                  // Wait for TX to finish
  293.   while(!(U1TCTL&TXEPT));                   // Wait for addr to be sent
  294.   //IFG2 &= ~URXIFG1;                         // Clear flag set during last write
  295.   U1TXBUF = 0;                              // Dummy write so we can read data
  296.   //while (!(IFG2&URXIFG1));                  // Wait for RX to finish
  297.   while(!(U1TCTL&TXEPT));                   // Wait for end of dummy byte TX
  298.   x = U1RXBUF;                              // Read data
  299.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  300.   return x;
  301. }
  302. void TI_CC_SPIStrobe(char strobe)
  303. {
  304.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  305.   while (TI_CC_SPI_USART1_PxIN&TI_CC_SPI_USART1_SOMI);// Wait for CCxxxx ready
  306.   U1TXBUF = strobe;                         // Send strobe
  307.   // Strobe addr is now being TX'ed
  308.   //IFG2 &= ~URXIFG1;                         // Clear flag
  309.   //while (!(IFG2&URXIFG1));                  // Wait for end of addr TX
  310.   while(!(U1TCTL&TXEPT));                   // Wait for end of addr TX
  311.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  312. }
  313. void TI_CC_PowerupResetCCxxxx(void)
  314. {
  315.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  316.   TI_CC_Wait(30);
  317.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  318.   TI_CC_Wait(30);
  319.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  320.   TI_CC_Wait(45);
  321.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  322.   while (TI_CC_SPI_USART1_PxIN&TI_CC_SPI_USART1_SOMI);// Wait for CCxxxx ready
  323.   U1TXBUF = TI_CCxxx0_SRES;                 // Send strobe
  324.   // Strobe addr is now being TX'ed
  325.   IFG2 &= ~URXIFG1;                         // Clear flag
  326.   while (!(IFG2&URXIFG1));                  // Wait for end of addr TX
  327.   while (TI_CC_SPI_USART1_PxIN&TI_CC_SPI_USART1_SOMI);
  328.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  329. }
  330. #elif TI_CC_RF_SER_INTF == TI_CC_SER_INTF_USCIA0
  331. void TI_CC_SPISetup(void)
  332. {
  333.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  334.   TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;         // /CS disable
  335.   UCA0CTL0 |= UCMST+UCCKPL+UCMSB+UCSYNC;    // 3-pin, 8-bit SPI master
  336.   UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  337.   UCA0BR0 |= 0x02;                          // UCLK/2
  338.   UCA0BR1 = 0;
  339.   UCA0MCTL = 0;
  340.   TI_CC_SPI_USCIA0_PxSEL |= TI_CC_SPI_USCIA0_SIMO | TI_CC_SPI_USCIA0_SOMI | TI_CC_SPI_USCIA0_UCLK;
  341.                                             // SPI option select
  342.   TI_CC_SPI_USCIA0_PxDIR |= TI_CC_SPI_USCIA0_SIMO | TI_CC_SPI_USCIA0_UCLK;
  343.                                             // SPI TXD out direction
  344.   UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  345. }
  346. void TI_CC_SPIWriteReg(char addr, char value)
  347. {
  348.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  349.     while (TI_CC_SPI_USCIA0_PxIN&TI_CC_SPI_USCIA0_SOMI);// Wait for CCxxxx ready
  350.     IFG2 &= ~UCA0RXIFG;                     // Clear flag
  351.     UCA0TXBUF = addr;                       // Send address
  352.     while (!(IFG2&UCA0RXIFG));              // Wait for TX to finish
  353.     IFG2 &= ~UCA0RXIFG;                     // Clear flag
  354.     UCA0TXBUF = value;                      // Send data
  355.     while (!(IFG2&UCA0RXIFG));              // Wait for TX to finish
  356.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  357. }
  358. void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
  359. {
  360.     unsigned int i;
  361.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  362.     while (TI_CC_SPI_USCIA0_PxIN&TI_CC_SPI_USCIA0_SOMI);// Wait for CCxxxx ready
  363.     IFG2 &= ~UCA0RXIFG;
  364.     UCA0TXBUF = addr | TI_CCxxx0_WRITE_BURST;// Send address
  365.     while (!(IFG2&UCA0RXIFG));              // Wait for TX to finish
  366.     for (i = 0; i < count; i++)
  367.     {
  368.       IFG2 &= ~UCA0RXIFG;
  369.       UCA0TXBUF = buffer[i];                // Send data
  370.       while (!(IFG2&UCA0RXIFG));            // Wait for TX to finish
  371.     }
  372.     //while (!(IFG2&UCA0RXIFG));
  373.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  374. }
  375. char TI_CC_SPIReadReg(char addr)
  376. {
  377.   char x;
  378.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  379.   while (!(IFG2&UCA0TXIFG));                // Wait for TX to finish
  380.   UCA0TXBUF = (addr | TI_CCxxx0_READ_SINGLE);// Send address
  381.   while (!(IFG2&UCA0TXIFG));                // Wait for TX to finish
  382.   UCA0TXBUF = 0;                            // Dummy write so we can read data
  383.   // Address is now being TX'ed, with dummy byte waiting in TXBUF...
  384.   while (!(IFG2&UCA0RXIFG));                // Wait for RX to finish
  385.   // Dummy byte RX'ed during addr TX now in RXBUF
  386.   IFG2 &= ~UCA0RXIFG;                       // Clear flag set during addr write
  387.   while (!(IFG2&UCA0RXIFG));                // Wait for end of dummy byte TX
  388.   // Data byte RX'ed during dummy byte write is now in RXBUF
  389.   x = UCA0RXBUF;                            // Read data
  390.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  391.   return x;
  392. }
  393. void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
  394. {
  395.   char i;
  396.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  397.   while (TI_CC_SPI_USCIA0_PxIN&TI_CC_SPI_USCIA0_SOMI);// Wait for CCxxxx ready
  398.   IFG2 &= ~UCA0RXIFG;                       // Clear flag
  399.   UCA0TXBUF = (addr | TI_CCxxx0_READ_BURST);// Send address
  400.   while (!(IFG2&UCA0TXIFG));                // Wait for TXBUF ready
  401.   UCA0TXBUF = 0;                            // Dummy write to read 1st data byte
  402.   // Addr byte is now being TX'ed, with dummy byte to follow immediately after
  403.   while (!(IFG2&UCA0RXIFG));                // Wait for end of addr byte TX
  404.   IFG2 &= ~UCA0RXIFG;                       // Clear flag
  405.   while (!(IFG2&UCA0RXIFG));                // Wait for end of 1st data byte TX
  406.   // First data byte now in RXBUF
  407.   for (i = 0; i < (count-1); i++)
  408.   {
  409.     UCA0TXBUF = 0;                          //Initiate next data RX, meanwhile..
  410.     buffer[i] = UCA0RXBUF;                  // Store data from last data RX
  411.     while (!(IFG2&UCA0RXIFG));              // Wait for RX to finish
  412.   }
  413.   buffer[count-1] = UCA0RXBUF;              // Store last RX byte in buffer
  414.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  415. }
  416. char TI_CC_SPIReadStatus(char addr)
  417. {
  418.   char x;
  419.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  420.   while (TI_CC_SPI_USCIA0_PxIN & TI_CC_SPI_USCIA0_SOMI);// Wait for CCxxxx ready
  421.   IFG2 &= ~UCA0RXIFG;                       // Clear flag set during last write
  422.   UCA0TXBUF = (addr | TI_CCxxx0_READ_BURST);// Send address
  423.   while (!(IFG2&UCA0RXIFG));                // Wait for TX to finish
  424.   IFG2 &= ~UCA0RXIFG;                       // Clear flag set during last write
  425.   UCA0TXBUF = 0;                            // Dummy write so we can read data
  426.   while (!(IFG2&UCA0RXIFG));                // Wait for RX to finish
  427.   x = UCA0RXBUF;                            // Read data
  428.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  429.   return x;
  430. }
  431. void TI_CC_SPIStrobe(char strobe)
  432. {
  433.   IFG2 &= ~UCA0RXIFG;                       // Clear flag
  434.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  435.   while (TI_CC_SPI_USCIA0_PxIN&TI_CC_SPI_USCIA0_SOMI);// Wait for CCxxxx ready
  436.   UCA0TXBUF = strobe;                       // Send strobe
  437.   // Strobe addr is now being TX'ed
  438.   while (!(IFG2&UCA0RXIFG));                // Wait for end of addr TX
  439.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  440. }
  441. void TI_CC_PowerupResetCCxxxx(void)
  442. {
  443.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  444.   TI_CC_Wait(30);
  445.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  446.   TI_CC_Wait(30);
  447.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  448.   TI_CC_Wait(45);
  449.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  450.   while (TI_CC_SPI_USCIA0_PxIN&TI_CC_SPI_USCIA0_SOMI);// Wait for CCxxxx ready
  451.   UCA0TXBUF = TI_CCxxx0_SRES;               // Send strobe
  452.   // Strobe addr is now being TX'ed
  453.   IFG2 &= ~UCA0RXIFG;                       // Clear flag
  454.   while (!(IFG2&UCA0RXIFG));                // Wait for end of addr TX
  455.   while (TI_CC_SPI_USCIA0_PxIN&TI_CC_SPI_USCIA0_SOMI);
  456.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  457. }
  458. #elif TI_CC_RF_SER_INTF == TI_CC_SER_INTF_USCIA1
  459. void TI_CC_SPISetup(void)
  460. {
  461.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  462.   TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;         // /CS disable
  463.   UCA1CTL0 |= UCMST+UCCKPL+UCMSB+UCSYNC;    // 3-pin, 8-bit SPI master
  464.   UCA1CTL1 |= UCSSEL_2;                     // SMCLK
  465.   UCA1BR0 |= 0x02;                          // UCLK/2
  466.   UCA1BR1 = 0;
  467.   UCA1MCTL = 0;
  468.   TI_CC_SPI_USCIA1_PxSEL |= TI_CC_SPI_USCIA1_SIMO | TI_CC_SPI_USCIA1_SOMI | TI_CC_SPI_USCIA1_UCLK;
  469.                                             // SPI option select
  470.   TI_CC_SPI_USCIA1_PxDIR |= TI_CC_SPI_USCIA1_SIMO | TI_CC_SPI_USCIA1_UCLK;
  471.                                             // SPI TXD out direction
  472.   UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  473. }
  474. void TI_CC_SPIWriteReg(char addr, char value)
  475. {
  476.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  477.     while (TI_CC_SPI_USCIA1_PxIN&TI_CC_SPI_USCIA1_SOMI);// Wait for CCxxxx ready
  478.     IFG2 &= ~UCA1RXIFG;                     // Clear flag
  479.     UCA1TXBUF = addr;                       // Send address
  480.     while (!(IFG2&UCA1RXIFG));              // Wait for TX to finish
  481.     IFG2 &= ~UCA1RXIFG;                     // Clear flag
  482.     UCA1TXBUF = value;                      // Send data
  483.     while (!(IFG2&UCA1RXIFG));              // Wait for TX to finish
  484.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  485. }
  486. void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
  487. {
  488.     unsigned int i;
  489.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  490.     while (TI_CC_SPI_USCIA1_PxIN&TI_CC_SPI_USCIA1_SOMI);// Wait for CCxxxx ready
  491.     IFG2 &= ~UCA1RXIFG;
  492.     UCA1TXBUF = addr | TI_CCxxx0_WRITE_BURST;// Send address
  493.     while (!(IFG2&UCA1RXIFG));              // Wait for TX to finish
  494.     for (i = 0; i < count; i++)
  495.     {
  496.       IFG2 &= ~UCA1RXIFG;
  497.       UCA1TXBUF = buffer[i];                // Send data
  498.       while (!(IFG2&UCA1RXIFG));            // Wait for TX to finish
  499.     }
  500.     //while (!(IFG2&UCA1RXIFG));
  501.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  502. }
  503. char TI_CC_SPIReadReg(char addr)
  504. {
  505.   char x;
  506.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  507.   while (!(IFG2&UCA1TXIFG));                // Wait for TX to finish
  508.   UCA1TXBUF = (addr | TI_CCxxx0_READ_SINGLE);// Send address
  509.   while (!(IFG2&UCA1TXIFG));                // Wait for TX to finish
  510.   UCA1TXBUF = 0;                            // Dummy write so we can read data
  511.   // Address is now being TX'ed, with dummy byte waiting in TXBUF...
  512.   while (!(IFG2&UCA1RXIFG));                // Wait for RX to finish
  513.   // Dummy byte RX'ed during addr TX now in RXBUF
  514.   IFG2 &= ~UCA1RXIFG;                       // Clear flag set during addr write
  515.   while (!(IFG2&UCA1RXIFG));                // Wait for end of dummy byte TX
  516.   // Data byte RX'ed during dummy byte write is now in RXBUF
  517.   x = UCA1RXBUF;                            // Read data
  518.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  519.   return x;
  520. }
  521. void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
  522. {
  523.   char i;
  524.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  525.   while (TI_CC_SPI_USCIA1_PxIN&TI_CC_SPI_USCIA1_SOMI);// Wait for CCxxxx ready
  526.   IFG2 &= ~UCA1RXIFG;                       // Clear flag
  527.   UCA1TXBUF = (addr | TI_CCxxx0_READ_BURST);// Send address
  528.   while (!(IFG2&UCA1TXIFG));                // Wait for TXBUF ready
  529.   UCA1TXBUF = 0;                            // Dummy write to read 1st data byte
  530.   // Addr byte is now being TX'ed, with dummy byte to follow immediately after
  531.   while (!(IFG2&UCA1RXIFG));                // Wait for end of addr byte TX
  532.   IFG2 &= ~UCA1RXIFG;                       // Clear flag
  533.   while (!(IFG2&UCA1RXIFG));                // Wait for end of 1st data byte TX
  534.   // First data byte now in RXBUF
  535.   for (i = 0; i < (count-1); i++)
  536.   {
  537.     UCA1TXBUF = 0;                          //Initiate next data RX, meanwhile..
  538.     buffer[i] = UCA1RXBUF;                  // Store data from last data RX
  539.     while (!(IFG2&UCA1RXIFG));              // Wait for RX to finish
  540.   }
  541.   buffer[count-1] = UCA1RXBUF;              // Store last RX byte in buffer
  542.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  543. }
  544. char TI_CC_SPIReadStatus(char addr)
  545. {
  546.   char x;
  547.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  548.   while (TI_CC_SPI_USCIA1_PxIN & TI_CC_SPI_USCIA1_SOMI);// Wait for CCxxxx ready
  549.   IFG2 &= ~UCA1RXIFG;                       // Clear flag set during last write
  550.   UCA1TXBUF = (addr | TI_CCxxx0_READ_BURST);// Send address
  551.   while (!(IFG2&UCA1RXIFG));                // Wait for TX to finish
  552.   IFG2 &= ~UCA1RXIFG;                       // Clear flag set during last write
  553.   UCA1TXBUF = 0;                            // Dummy write so we can read data
  554.   while (!(IFG2&UCA1RXIFG));                // Wait for RX to finish
  555.   x = UCA1RXBUF;                            // Read data
  556.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  557.   return x;
  558. }
  559. void TI_CC_SPIStrobe(char strobe)
  560. {
  561.   IFG2 &= ~UCA1RXIFG;                       // Clear flag
  562.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  563.   while (TI_CC_SPI_USCIA1_PxIN&TI_CC_SPI_USCIA1_SOMI);// Wait for CCxxxx ready
  564.   UCA1TXBUF = strobe;                       // Send strobe
  565.   // Strobe addr is now being TX'ed
  566.   while (!(IFG2&UCA1RXIFG));                // Wait for end of addr TX
  567.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  568. }
  569. void TI_CC_PowerupResetCCxxxx(void)
  570. {
  571.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  572.   TI_CC_Wait(30);
  573.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  574.   TI_CC_Wait(30);
  575.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  576.   TI_CC_Wait(45);
  577.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  578.   while (TI_CC_SPI_USCIA1_PxIN&TI_CC_SPI_USCIA1_SOMI);// Wait for CCxxxx ready
  579.   UCA1TXBUF = TI_CCxxx0_SRES;               // Send strobe
  580.   // Strobe addr is now being TX'ed
  581.   IFG2 &= ~UCA1RXIFG;                       // Clear flag
  582.   while (!(IFG2&UCA1RXIFG));                // Wait for end of addr TX
  583.   while (TI_CC_SPI_USCIA1_PxIN&TI_CC_SPI_USCIA1_SOMI);
  584.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  585. }
  586. #elif TI_CC_RF_SER_INTF == TI_CC_SER_INTF_USCIB0
  587. void TI_CC_SPISetup(void)
  588. {
  589.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  590.   TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;         // /CS disable
  591.   UCB0CTL0 |= UCMST+UCCKPL+UCMSB+UCSYNC;    // 3-pin, 8-bit SPI master
  592.   UCB0CTL1 |= UCSSEL_2;                     // SMCLK
  593.   UCB0BR0 |= 0x02;                          // UCLK/2
  594.   UCB0BR1 = 0;
  595.   //UCB0MCTL = 0;
  596.   TI_CC_SPI_USCIB0_PxSEL |= TI_CC_SPI_USCIB0_SIMO | TI_CC_SPI_USCIB0_SOMI | TI_CC_SPI_USCIB0_UCLK;
  597.                                             // SPI option select
  598.   TI_CC_SPI_USCIB0_PxDIR |= TI_CC_SPI_USCIB0_SIMO | TI_CC_SPI_USCIB0_UCLK;
  599.                                             // SPI TXD out direction
  600.   UCB0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  601. }
  602. void TI_CC_SPIWriteReg(char addr, char value)
  603. {
  604.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  605.     while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);// Wait for CCxxxx ready
  606.     IFG2 &= ~UCB0RXIFG;                     // Clear flag
  607.     UCB0TXBUF = addr;                       // Send address
  608.     while (!(IFG2&UCB0RXIFG));              // Wait for TX to finish
  609.     IFG2 &= ~UCB0RXIFG;                     // Clear flag
  610.     UCB0TXBUF = value;                      // Send data
  611.     while (!(IFG2&UCB0RXIFG));              // Wait for TX to finish
  612.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  613. }
  614. void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
  615. {
  616.     unsigned int i;
  617.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  618.     while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);// Wait for CCxxxx ready
  619.     IFG2 &= ~UCB0RXIFG;
  620.     UCB0TXBUF = addr | TI_CCxxx0_WRITE_BURST;// Send address
  621.     while (!(IFG2&UCB0RXIFG));              // Wait for TX to finish
  622.     for (i = 0; i < count; i++)
  623.     {
  624.       IFG2 &= ~UCB0RXIFG;
  625.       UCB0TXBUF = buffer[i];                // Send data
  626.       while (!(IFG2&UCB0RXIFG));            // Wait for TX to finish
  627.     }
  628.     //while (!(IFG2&UCB0RXIFG));
  629.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  630. }
  631. char TI_CC_SPIReadReg(char addr)
  632. {
  633.   char x;
  634.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  635.   while (!(IFG2&UCB0TXIFG));                // Wait for TX to finish
  636.   UCB0TXBUF = (addr | TI_CCxxx0_READ_SINGLE);// Send address
  637.   while (!(IFG2&UCB0TXIFG));                // Wait for TX to finish
  638.   UCB0TXBUF = 0;                            // Dummy write so we can read data
  639.   // Address is now being TX'ed, with dummy byte waiting in TXBUF...
  640.   while (!(IFG2&UCB0RXIFG));                // Wait for RX to finish
  641.   // Dummy byte RX'ed during addr TX now in RXBUF
  642.   IFG2 &= ~UCB0RXIFG;                       // Clear flag set during addr write
  643.   while (!(IFG2&UCB0RXIFG));                // Wait for end of dummy byte TX
  644.   // Data byte RX'ed during dummy byte write is now in RXBUF
  645.   x = UCB0RXBUF;                            // Read data
  646.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  647.   return x;
  648. }
  649. void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
  650. {
  651.   char i;
  652.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  653.   while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);// Wait for CCxxxx ready
  654.   IFG2 &= ~UCB0RXIFG;                       // Clear flag
  655.   UCB0TXBUF = (addr | TI_CCxxx0_READ_BURST);// Send address
  656.   while (!(IFG2&UCB0TXIFG));                // Wait for TXBUF ready
  657.   UCB0TXBUF = 0;                            // Dummy write to read 1st data byte
  658.   // Addr byte is now being TX'ed, with dummy byte to follow immediately after
  659.   while (!(IFG2&UCB0RXIFG));                // Wait for end of addr byte TX
  660.   IFG2 &= ~UCB0RXIFG;                       // Clear flag
  661.   while (!(IFG2&UCB0RXIFG));                // Wait for end of 1st data byte TX
  662.   // First data byte now in RXBUF
  663.   for (i = 0; i < (count-1); i++)
  664.   {
  665.     UCB0TXBUF = 0;                          //Initiate next data RX, meanwhile..
  666.     buffer[i] = UCB0RXBUF;                  // Store data from last data RX
  667.     while (!(IFG2&UCB0RXIFG));              // Wait for RX to finish
  668.   }
  669.   buffer[count-1] = UCB0RXBUF;              // Store last RX byte in buffer
  670.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  671. }
  672. char TI_CC_SPIReadStatus(char addr)
  673. {
  674.   char x;
  675.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  676.   while (TI_CC_SPI_USCIB0_PxIN & TI_CC_SPI_USCIB0_SOMI);// Wait for CCxxxx ready
  677.   IFG2 &= ~UCB0RXIFG;                       // Clear flag set during last write
  678.   UCB0TXBUF = (addr | TI_CCxxx0_READ_BURST);// Send address
  679.   while (!(IFG2&UCB0RXIFG));                // Wait for TX to finish
  680.   IFG2 &= ~UCB0RXIFG;                       // Clear flag set during last write
  681.   UCB0TXBUF = 0;                            // Dummy write so we can read data
  682.   while (!(IFG2&UCB0RXIFG));                // Wait for RX to finish
  683.   x = UCB0RXBUF;                            // Read data
  684.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  685.   return x;
  686. }
  687. void TI_CC_SPIStrobe(char strobe)
  688. {
  689.   IFG2 &= ~UCB0RXIFG;                       // Clear flag
  690.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  691.   while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);// Wait for CCxxxx ready
  692.   UCB0TXBUF = strobe;                       // Send strobe
  693.   // Strobe addr is now being TX'ed
  694.   while (!(IFG2&UCB0RXIFG));                // Wait for end of addr TX
  695.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  696. }
  697. void TI_CC_PowerupResetCCxxxx(void)
  698. {
  699.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  700.   TI_CC_Wait(30);
  701.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  702.   TI_CC_Wait(30);
  703.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  704.   TI_CC_Wait(45);
  705.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  706.   while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);// Wait for CCxxxx ready
  707.   UCB0TXBUF = TI_CCxxx0_SRES;               // Send strobe
  708.   // Strobe addr is now being TX'ed
  709.   IFG2 &= ~UCB0RXIFG;                       // Clear flag
  710.   while (!(IFG2&UCB0RXIFG));                // Wait for end of addr TX
  711.   while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);
  712.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  713. }
  714. #elif TI_CC_RF_SER_INTF == TI_CC_SER_INTF_USCIB1
  715. void TI_CC_SPISetup(void)
  716. {
  717.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  718.   TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;         // /CS disable
  719.   UCB1CTL0 |= UCMST+UCCKPL+UCMSB+UCSYNC;    // 3-pin, 8-bit SPI master
  720.   UCB1CTL1 |= UCSSEL_2;                     // SMCLK
  721.   UCB1BR0 |= 0x02;                          // UCLK/2
  722.   UCB1BR1 = 0;
  723.   UCB1MCTL = 0;
  724.   TI_CC_SPI_USCIB1_PxSEL |= TI_CC_SPI_USCIB1_SIMO | TI_CC_SPI_USCIB1_SOMI | TI_CC_SPI_USCIB1_UCLK;
  725.                                             // SPI option select
  726.   TI_CC_SPI_USCIB1_PxDIR |= TI_CC_SPI_USCIB1_SIMO | TI_CC_SPI_USCIB1_UCLK;
  727.                                             // SPI TXD out direction
  728.   UCB1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  729. }
  730. void TI_CC_SPIWriteReg(char addr, char value)
  731. {
  732.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  733.     while (TI_CC_SPI_USCIB1_PxIN&TI_CC_SPI_USCIB1_SOMI);// Wait for CCxxxx ready
  734.     IFG2 &= ~UCB1RXIFG;                     // Clear flag
  735.     UCB1TXBUF = addr;                       // Send address
  736.     while (!(IFG2&UCB1RXIFG));              // Wait for TX to finish
  737.     IFG2 &= ~UCB1RXIFG;                     // Clear flag
  738.     UCB1TXBUF = value;                      // Send data
  739.     while (!(IFG2&UCB1RXIFG));              // Wait for TX to finish
  740.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  741. }
  742. void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
  743. {
  744.     unsigned int i;
  745.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  746.     while (TI_CC_SPI_USCIB1_PxIN&TI_CC_SPI_USCIB1_SOMI);// Wait for CCxxxx ready
  747.     IFG2 &= ~UCB1RXIFG;
  748.     UCB1TXBUF = addr | TI_CCxxx0_WRITE_BURST;// Send address
  749.     while (!(IFG2&UCB1RXIFG));              // Wait for TX to finish
  750.     for (i = 0; i < count; i++)
  751.     {
  752.       IFG2 &= ~UCB1RXIFG;
  753.       UCB1TXBUF = buffer[i];                // Send data
  754.       while (!(IFG2&UCB1RXIFG));            // Wait for TX to finish
  755.     }
  756.     //while (!(IFG2&UCB1RXIFG));
  757.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  758. }
  759. char TI_CC_SPIReadReg(char addr)
  760. {
  761.   char x;
  762.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  763.   while (!(IFG2&UCB1TXIFG));                // Wait for TX to finish
  764.   UCB1TXBUF = (addr | TI_CCxxx0_READ_SINGLE);// Send address
  765.   while (!(IFG2&UCB1TXIFG));                // Wait for TX to finish
  766.   UCB1TXBUF = 0;                            // Dummy write so we can read data
  767.   // Address is now being TX'ed, with dummy byte waiting in TXBUF...
  768.   while (!(IFG2&UCB1RXIFG));                // Wait for RX to finish
  769.   // Dummy byte RX'ed during addr TX now in RXBUF
  770.   IFG2 &= ~UCB1RXIFG;                       // Clear flag set during addr write
  771.   while (!(IFG2&UCB1RXIFG));                // Wait for end of dummy byte TX
  772.   // Data byte RX'ed during dummy byte write is now in RXBUF
  773.   x = UCB1RXBUF;                            // Read data
  774.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  775.   return x;
  776. }
  777. void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
  778. {
  779.   char i;
  780.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  781.   while (TI_CC_SPI_USCIB1_PxIN&TI_CC_SPI_USCIB1_SOMI);// Wait for CCxxxx ready
  782.   IFG2 &= ~UCB1RXIFG;                       // Clear flag
  783.   UCB1TXBUF = (addr | TI_CCxxx0_READ_BURST);// Send address
  784.   while (!(IFG2&UCB1TXIFG));                // Wait for TXBUF ready
  785.   UCB1TXBUF = 0;                            // Dummy write to read 1st data byte
  786.   // Addr byte is now being TX'ed, with dummy byte to follow immediately after
  787.   while (!(IFG2&UCB1RXIFG));                // Wait for end of addr byte TX
  788.   IFG2 &= ~UCB1RXIFG;                       // Clear flag
  789.   while (!(IFG2&UCB1RXIFG));                // Wait for end of 1st data byte TX
  790.   // First data byte now in RXBUF
  791.   for (i = 0; i < (count-1); i++)
  792.   {
  793.     UCB1TXBUF = 0;                          //Initiate next data RX, meanwhile..
  794.     buffer[i] = UCB1RXBUF;                  // Store data from last data RX
  795.     while (!(IFG2&UCB1RXIFG));              // Wait for RX to finish
  796.   }
  797.   buffer[count-1] = UCB1RXBUF;              // Store last RX byte in buffer
  798.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  799. }
  800. char TI_CC_SPIReadStatus(char addr)
  801. {
  802.   char x;
  803.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  804.   while (TI_CC_SPI_USCIB1_PxIN & TI_CC_SPI_USCIB1_SOMI);// Wait for CCxxxx ready
  805.   IFG2 &= ~UCB1RXIFG;                       // Clear flag set during last write
  806.   UCB1TXBUF = (addr | TI_CCxxx0_READ_BURST);// Send address
  807.   while (!(IFG2&UCB1RXIFG));                // Wait for TX to finish
  808.   IFG2 &= ~UCB1RXIFG;                       // Clear flag set during last write
  809.   UCB1TXBUF = 0;                            // Dummy write so we can read data
  810.   while (!(IFG2&UCB1RXIFG));                // Wait for RX to finish
  811.   x = UCB1RXBUF;                            // Read data
  812.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  813.   return x;
  814. }
  815. void TI_CC_SPIStrobe(char strobe)
  816. {
  817.   IFG2 &= ~UCB1RXIFG;                       // Clear flag
  818.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  819.   while (TI_CC_SPI_USCIB1_PxIN&TI_CC_SPI_USCIB1_SOMI);// Wait for CCxxxx ready
  820.   UCB1TXBUF = strobe;                       // Send strobe
  821.   // Strobe addr is now being TX'ed
  822.   while (!(IFG2&UCB1RXIFG));                // Wait for end of addr TX
  823.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  824. }
  825. void TI_CC_PowerupResetCCxxxx(void)
  826. {
  827.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  828.   TI_CC_Wait(30);
  829.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  830.   TI_CC_Wait(30);
  831.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  832.   TI_CC_Wait(45);
  833.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  834.   while (TI_CC_SPI_USCIB1_PxIN&TI_CC_SPI_USCIB1_SOMI);// Wait for CCxxxx ready
  835.   UCB1TXBUF = TI_CCxxx0_SRES;               // Send strobe
  836.   // Strobe addr is now being TX'ed
  837.   IFG2 &= ~UCB1RXIFG;                       // Clear flag
  838.   while (!(IFG2&UCB1RXIFG));                // Wait for end of addr TX
  839.   while (TI_CC_SPI_USCIB1_PxIN&TI_CC_SPI_USCIB1_SOMI);
  840.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  841. }
  842. #elif TI_CC_RF_SER_INTF == TI_CC_SER_INTF_USI
  843. void TI_CC_SPISetup(void)
  844. {
  845.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  846.   TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;         // /CS disable
  847.   USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE;// Port, SPI master
  848.   USICKCTL = USISSEL_2 + USICKPL;           // SCLK = SMCLK
  849.   USICTL0 &= ~USISWRST;                     // USI released for operation
  850.   USISRL = 0x00;                            // Ensure SDO low instead of high,
  851.   USICNT = 1;                               // to avoid conflict with CCxxxx
  852. }
  853. void TI_CC_SPIWriteReg(char addr, char value)
  854. {
  855.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  856.   while (TI_CC_SPI_USI_PxIN&TI_CC_SPI_USI_SOMI);// Wait for CCxxxx ready
  857.   USISRL = addr;                            // Load address
  858.   USICNT = 8;                               // Send it
  859.   while (!(USICTL1&USIIFG));                // Wait for TX to finish
  860.   USISRL = value;                           // Load value
  861.   USICNT = 8;                               // Send it
  862.   while (!(USICTL1&USIIFG));                // Wait for TX to finish
  863.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  864. }
  865. void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
  866. {
  867.   unsigned int i;
  868.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  869.   while (TI_CC_SPI_USI_PxIN&TI_CC_SPI_USI_SOMI);// Wait for CCxxxx ready
  870.   USISRL = addr | TI_CCxxx0_WRITE_BURST;    // Load address
  871.   USICNT = 8;                               // Send it
  872.   while (!(USICTL1&USIIFG));                // Wait for TX to finish
  873.   for (i = 0; i < count; i++)
  874.   {
  875.     USISRL = buffer[i];                     // Load data
  876.     USICNT = 8;                             // Send it
  877.     while (!(USICTL1&USIIFG));              // Wait for TX to finish
  878.   }
  879.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  880. }
  881. char TI_CC_SPIReadReg(char addr)
  882. {
  883.   char x;
  884.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  885.   while (TI_CC_SPI_USI_PxIN&TI_CC_SPI_USI_SOMI);// Wait for CCxxxx ready
  886.   USISRL = addr | TI_CCxxx0_READ_SINGLE;    // Load address
  887.   USICNT = 8;                               // Send it
  888.   while (!(USICTL1&USIIFG));                // Wait for TX to finish
  889.   USICNT = 8;                               // Dummy write so we can read data
  890.   while (!(USICTL1&USIIFG));                // Wait for RX to finish
  891.   x = USISRL;                               // Store data
  892.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  893.   return x;
  894. }
  895. void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
  896. {
  897.   unsigned int i;
  898.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  899.   while (TI_CC_SPI_USI_PxIN&TI_CC_SPI_USI_SOMI);// Wait for CCxxxx ready
  900.   USISRL = addr | TI_CCxxx0_READ_BURST;     // Load address
  901.   USICNT = 8;                               // Send it
  902.   while (!(USICTL1&USIIFG));                // Wait for TX to finish
  903.   for (i = 0; i < count; i++)
  904.   {
  905.     USICNT = 8;                             // Dummy write so we can read data
  906.     while (!(USICTL1&USIIFG));              // Wait for RX to finish
  907.     buffer[i] = USISRL;                     // Store data
  908.   }
  909.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  910. }
  911. char TI_CC_SPIReadStatus(char addr)
  912. {
  913.   char x;
  914.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  915.   while (TI_CC_SPI_USI_PxIN&TI_CC_SPI_USI_SOMI);// Wait for CCxxxx ready
  916.   USISRL = addr | TI_CCxxx0_READ_BURST;     // Load address
  917.   USICNT = 8;                               // Send it
  918.   while (!(USICTL1&USIIFG));                // Wait for TX to finish
  919.   USICNT = 8;                               // Dummy write so we can read data
  920.   while (!(USICTL1&USIIFG));                // Wait for RX to finish
  921.   x = USISRL;                               // Store data
  922.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  923.   return x;
  924. }
  925. void TI_CC_SPIStrobe(char strobe)
  926. {
  927.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  928.   while (TI_CC_SPI_USI_PxIN&TI_CC_SPI_USI_SOMI);// Wait for CCxxxx ready
  929.   USISRL = strobe;                          // Load strobe
  930.   USICNT = 8;                               // Send it
  931.   while (!(USICTL1&USIIFG));                // Wait for TX to finish
  932.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  933. }
  934. void TI_CC_PowerupResetCCxxxx(void)
  935. {
  936.   // Sec. 27.1 of CC1100 datasheet
  937.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  938.   TI_CC_Wait(30);
  939.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  940.   TI_CC_Wait(30);
  941.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  942.   TI_CC_Wait(45);
  943.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  944.   while (TI_CC_SPI_USI_PxIN&TI_CC_SPI_USI_SOMI);
  945.   USISRL = TI_CCxxx0_SRES;
  946.   USICNT = 8;
  947.   while (!(USICTL1&USIIFG));
  948.   while (TI_CC_SPI_USI_PxIN&TI_CC_SPI_USI_SOMI);
  949.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  950. }
  951. #elif TI_CC_RF_SER_INTF == TI_CC_SER_INTF_BITBANG
  952. void TI_CC_SPI_bitbang_out(char);
  953. char TI_CC_SPI_bitbang_in();
  954. void TI_CC_SPISetup(void)
  955. {
  956.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  957.   TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;         // /CS disable
  958.   // Config bitbang pins
  959.   TI_CC_SPI_BITBANG_PxOUT |= TI_CC_SPI_BITBANG_SIMO|TI_CC_SPI_BITBANG_UCLK;
  960.   TI_CC_SPI_BITBANG_PxDIR |= TI_CC_SPI_BITBANG_SIMO | TI_CC_SPI_BITBANG_UCLK;
  961. }
  962. // Output eight-bit value using selected bit-bang pins
  963. void TI_CC_SPI_bitbang_out(char value)
  964. {
  965.   char x;
  966.   for(x=8;x>0;x--)
  967.   {
  968.     if(value & 0x80)                                     // If bit is high...
  969.       TI_CC_SPI_BITBANG_PxOUT |= TI_CC_SPI_BITBANG_SIMO; // Set SIMO high...
  970.     else
  971.       TI_CC_SPI_BITBANG_PxOUT &= ~TI_CC_SPI_BITBANG_SIMO;// Set SIMO low...
  972.     value = value << 1;                                  // Rotate bits
  973.     TI_CC_SPI_BITBANG_PxOUT &= ~TI_CC_SPI_BITBANG_UCLK;  // Set clock low
  974.     TI_CC_SPI_BITBANG_PxOUT |= TI_CC_SPI_BITBANG_UCLK;   // Set clock high
  975.   }
  976. }
  977. // Input eight-bit value using selected bit-bang pins
  978. char TI_CC_SPI_bitbang_in()
  979. {
  980.   char x=0,shift=0;
  981.   int y;
  982.   // Determine how many bit positions SOMI is from least-significant bit
  983.   x = TI_CC_SPI_BITBANG_SOMI;
  984.   while(x>1)
  985.   {
  986.     shift++;
  987.     x = x >> 1;
  988.   };
  989.   x = 0;
  990.   for(y=8;y>0;y--)
  991.   {
  992.     TI_CC_SPI_BITBANG_PxOUT &= ~TI_CC_SPI_BITBANG_UCLK;// Set clock low
  993.     TI_CC_SPI_BITBANG_PxOUT |= TI_CC_SPI_BITBANG_UCLK;// Set clock high
  994.     x = x << 1;                             // Make room for next bit
  995.     x = x | ((TI_CC_SPI_BITBANG_PxIN & TI_CC_SPI_BITBANG_SOMI) >> shift);
  996.   }                                         // Store next bit
  997.   return(x);
  998. }
  999. void TI_CC_SPIWriteReg(char addr, char value)
  1000. {
  1001.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  1002.     while (TI_CC_SPI_BITBANG_PxIN&TI_CC_SPI_BITBANG_SOMI); // Wait CCxxxx ready
  1003.     TI_CC_SPI_bitbang_out(addr);            // Send address
  1004.     TI_CC_SPI_bitbang_out(value);           // Send data
  1005.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  1006. }
  1007. void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
  1008. {
  1009.     char i;
  1010.     TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;      // /CS enable
  1011.     while (TI_CC_SPI_BITBANG_PxIN&TI_CC_SPI_BITBANG_SOMI); // Wait CCxxxx ready
  1012.     TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_WRITE_BURST);   // Send address
  1013.     for (i = 0; i < count; i++)
  1014.       TI_CC_SPI_bitbang_out(buffer[i]);     // Send data
  1015.     TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;       // /CS disable
  1016. }
  1017. char TI_CC_SPIReadReg(char addr)
  1018. {
  1019.   char x;
  1020.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  1021.   TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_READ_SINGLE);//Send address
  1022.   x = TI_CC_SPI_bitbang_in();               // Read data
  1023.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  1024.   return x;
  1025. }
  1026. void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
  1027. {
  1028.   char i;
  1029.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  1030.   while (TI_CC_SPI_BITBANG_PxIN&TI_CC_SPI_BITBANG_SOMI); // Wait CCxxxx ready
  1031.   TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_READ_BURST);    // Send address
  1032.   for (i = 0; i < count; i++)
  1033.     buffer[i] = TI_CC_SPI_bitbang_in();     // Read data
  1034.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  1035. }
  1036. char TI_CC_SPIReadStatus(char addr)
  1037. {
  1038.   char x;
  1039.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  1040.   while (TI_CC_SPI_BITBANG_PxIN & TI_CC_SPI_BITBANG_SOMI); // Wait CCxxxx ready
  1041.   TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_READ_BURST);      // Send address
  1042.   x = TI_CC_SPI_bitbang_in();               // Read data
  1043.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  1044.   return x;
  1045. }
  1046. void TI_CC_SPIStrobe(char strobe)
  1047. {
  1048.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;        // /CS enable
  1049.   while (TI_CC_SPI_BITBANG_PxIN&TI_CC_SPI_BITBANG_SOMI);// Wait for CCxxxx ready
  1050.   TI_CC_SPI_bitbang_out(strobe);            // Send strobe
  1051.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;         // /CS disable
  1052. }
  1053. void TI_CC_PowerupResetCCxxxx(void)
  1054. {
  1055.   // Sec. 27.1 of CC1100 datasheet
  1056.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  1057.   TI_CC_Wait(30);
  1058.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  1059.   TI_CC_Wait(30);
  1060.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  1061.   TI_CC_Wait(45);
  1062.   TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;
  1063.   while (TI_CC_SPI_BITBANG_PxIN&TI_CC_SPI_BITBANG_SOMI);
  1064.   TI_CC_SPI_bitbang_out(TI_CCxxx0_SRES);
  1065.   while (TI_CC_SPI_BITBANG_PxIN&TI_CC_SPI_BITBANG_SOMI);
  1066.   TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  1067. }
  1068. #endif