Добрый день, гуру программирования микроконтроллеров!
Помогите, пожалуйста, начинающему программисту микроконтроллеров. Проблема у меня следующая: есть два MSP430x1611, которые взаимодействуют друг с другом через SPI. Один SPI я настраиваю как ведущий. Вот программный код:
Код
#include "msp430.h"
void InitSpiMode(unsigned char);
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
_DINT();
DCOCTL &= ~(DCO0 + DCO1);
P5DIR |= BIT1 + BIT3;
P5DIR &= ~BIT2;
P5SEL |= BIT1 + BIT2 + BIT3;
TACCR0 = 30000;
TACTL |= TASSEL_2 + MC_1 + TAIE;
_EINT();
InitSpiMode(0);
InitSpiMode(1);
while(1);
}
void InitSpiMode(unsigned char UsartNumber)
{
switch(UsartNumber)
{
case 0:
U0CTL = MM + SYNC + CHAR + SWRST; //Master, SPI, 8-bit Data;
U0TCTL = STC + SSEL0 + SSEL1 + CKPH; //3-пин.режим, SMCLK для baud-rate
U0BR0 = 0x02; //выбор скорости обмена SMCLK/ubr0
U0BR1 = 0;
U0MCTL = 0; //останов модуляции
ME1 |= USPIE0; //разрешить прием - передачу
U0CTL &= ~SWRST; //сброс флага состояния USARTа
break;
case 1:
U1CTL = MM + SYNC + CHAR + SWRST; //Master, SPI, 8-bit Data;
U1TCTL = STC + SSEL0 + SSEL1 + CKPH; //3-пин.режим, SMCLK для baud-rate
U1BR0 = 0x02; //выбор скорости обмена SMCLK/ubr0
U1BR1 = 0;
U1MCTL = 0; //останов модуляции
ME2 |= USPIE1; //разрешить прием - передачу
U1CTL &= ~SWRST; //сброс флага состояния USARTа
break;
default:
break;
}
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
switch( TAIV )
{
case 2:
break;
case 4:
break;
case 10:
while(!(U1TCTL & TXEPT));
U1TXBUF = 'A';
break;
}
}
Второй SPI настраивается как ведомый, вот его настройки:
Код
/*Определение функции InitSpiMode(настройка USART0 и USART1 в режим SPI) */
void InitSpiMode(unsigned char UsartNumber, unsigned char ubr0)
{
switch(UsartNumber)
{
case 0:
U0CTL = MM + SYNC + CHAR + SWRST; //Master, SPI, 8-bit Data;
U0TCTL = STC + SSEL0 + SSEL1 + CKPH; //3-пин.режим, SMCLK для baud-rate
U0BR0 = ubr0; //выбор скорости обмена SMCLK/ubr0
U0BR1 = 0x00;
U0MCTL = 0x00; //останов модуляции
ME1 |= USPIE0; //разрешить прием - передачу
U0CTL &= ~SWRST; //сброс флага состояния USARTа
break;
case 1:
U1CTL = SYNC + CHAR + SWRST; //Slave, SPI, 8-bit Data;
U1TCTL = STC + CKPH; //3-пин.режим
U1BR0 = ubr0; //выбор скорости обмена SMCLK/ubr0
U1BR1 = 0x00;
U1MCTL = 0x00; //останов модуляции
U1CTL &= ~SWRST; //сброс флага состояния USARTа
ME2 |= USPIE1; //разрешить прием - передачу
break;
default:
break;
}
}
После загрузки проектов в свой MSP, ведущий передает символ "А", а ведомый его принимает по прерыванию, вот оно:
Код
#pragma vector=USART1RX_VECTOR
__interrupt void Usart1_RX(void)
{
aaa[iii] = U1RXBUF;
iii++;
if (iii == 80) iii = 0;
}
Но вот беда, ведомый принимает все что угодно, но только не символ "А". Питание у каждого микроконтроллера свое, т.е. независимое. Может ли это влиять на передачу/прием, ну например не синхронизируются MSP между собой и получается пока один настроился, а второй еще и не запускался. Помогите пожалуйста, может быть я делаю не те настройки или, все таки, проблема из-за независимых источников питания?