реклама на сайте
подробности

 
 
> MSP430x44x + CC1101 (SPI)
leningrib
сообщение Apr 27 2015, 15:23
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 26-04-15
Пользователь №: 86 397



Доброго времени суток!
Есть модуль ввода/вывода с MSP430x44x и радиомодуль CC1101. Обмен данными осуществляется с помощью интерфейса SPI.
Программа написана на основе примера от Texas Instruments. Режим SPI 3-проводной, MSP430 ведущий.
Проверку на корректность результата осуществляется с помощью светодиода. Но что ни делается, все равно, в результате "0" (светодиод мигает)
Буду благодарен, если у кого-то будут идеи в чем проблема! Спасибо за внимание
Код
int main( void )
{
  
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  FLL_CTL0=XCAP10PF;         // Configure load caps
  
  __delay_cycles(5000);
  
  
  unsigned char answer=0x08;
  TI_CC_SPISetup();                         // Initialize SPI port
  P1DIR |= LED_OFF;                        // Port 1.7 output

  TI_CC_PowerupResetCCxxxx();               // Reset CCxxxx
  __delay_cycles(5000);
  TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);         // Send strobe SIDLE
  __delay_cycles(5000);
  TI_CC_SPIWriteReg(TI_CCxxx0_ADDR, 0x0F);  //ADDR =0x0F
  __delay_cycles(5000);
  answer=TI_CC_SPIReadReg(TI_CCxxx0_ADDR);  //answer = 0x0F

  volatile unsigned int i;

  for (;;) {
    if(answer==0x00) {
      P1OUT ^= LED_OFF; // on/off P1.7
      i = 50000; // delay
      do (i--);
      while (i != 0);
    
      }
      else {
      P1OUT &= ~LED_OFF;
      
    }
  }
}


SPI
Код
// Delay function. # of CPU cycles delayed is similar to "cycles". Specifically,
// it's ((cycles-15) % 6) + 15.  Not exact, but gives a sense of the real-time
// delay.  Also, if MCLK ~1MHz, "cycles" is similar to # of useconds delayed.
void TI_CC_Wait(unsigned int cycles)
{
  while(cycles>15)                          // 15 cycles consumed by overhead
    cycles = cycles - 6;                    // 6 cycles consumed each iteration
}

void TI_CC_SPISetup(void)
{
// unsigned short m;
  P4OUT |= ECS_b;
  P4DIR |= ECS_b;                           // /ExternalCS disable
  ME1 |= USPIE0;                            // Enable USART0 SPI mode
  UCTL0 = SWRST;                            // Disable USART state machine
  UCTL0 |= CHAR + SYNC + MM;                // 8-bit SPI Master **SWRST**
  UTCTL0 |= CKPH + SSEL1 + SSEL0 + STC + TXEPT;     // SMCLK, 3-pin mode
  UBR00 = 0x08;                             // UCLK/8
  UBR10 = 0x00;                             // 0
  UMCTL0 = 0x00;                            // No modulation
  P3SEL |= SPI_O | SPI_I | SPI_C;           // SPI option select
  P3DIR |= SPI_O + SPI_C;
                                            // SPI TX out direction
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
}

void TI_CC_SPIWriteReg(char addr, char value)
{
  P4OUT &= ~ECS_b;                          // /ExternalCS enable
  while (!(IFG1&UTXIFG0));                  // Wait for TX to finish
  U0TXBUF = addr;                           // Send address
  while (!(IFG1&UTXIFG0));                  // Wait for TX to finish
  __no_operation();
  __no_operation();
  U0TXBUF = value;                          // Send value
  while(!(UTCTL0&TXEPT));                   // Wait for TX complete
  P4OUT |= ECS_b;                           // /ExternalCS disable
}

char TI_CC_SPIReadReg(char addr)
{
  char x;

  P4OUT &= ~ECS_b;                           // /CS enable
  while (!(IFG1 & UTXIFG0));                // Wait for TX to finish
  U0TXBUF = (addr | TI_CCxxx0_READ_SINGLE); // Send address
  while (!(IFG1 & UTXIFG0));                // Wait for TX to finish
  __no_operation();
  __no_operation();
  U0TXBUF = 0;                              // Dummy write so we can read data
  while(!(UTCTL0 & TXEPT));                 // Wait for TX complete
  x = U0RXBUF;                              // Read data
  P4OUT |= ECS_b;                           // /CS disable

  return x;
}

// For status/strobe addresses, the BURST bit selects between status registers
// and command strobes.
void TI_CC_SPIStrobe(char strobe)
{
  P4OUT &= ~ECS_b;                          // /CS enable
  while (!(IFG1 & UTXIFG0));                // Wait for TX to finish
  U0TXBUF = strobe;                         // Send strobe
  // Strobe addr is now being TX'ed
  IFG1 &= ~URXIFG0;                         // Clear flag
  while(!(UTCTL0 & TXEPT));                 // Wait for TX complete
  P4OUT |= ECS_b;                           // /CS disable
}

void TI_CC_PowerupResetCCxxxx(void)
{
  P4OUT |= ECS_b;
  TI_CC_Wait(30);
  P4OUT &= ~ECS_b;
  TI_CC_Wait(30);
  P4OUT |= ECS_b;
  TI_CC_Wait(45);

  P4OUT &= ~ECS_b;                          // /CS enable
  while (!(IFG1 & UTXIFG0));                // Wait for TX to finish
  U0TXBUF = TI_CCxxx0_SRES;                 // Send strobe
  // Strobe addr is now being TX'ed
  while(!(UTCTL0 & TXEPT));                 // Wait for TX complete
  P4OUT |= ECS_b;                           // /CS disable
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 08:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016