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

 
 
> USART в режиме SPI, Неправильный прием ведомого устройства
SidAlex
сообщение May 6 2010, 04:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 7-04-10
Пользователь №: 56 467



Добрый день, гуру программирования микроконтроллеров!

Помогите, пожалуйста, начинающему программисту микроконтроллеров. Проблема у меня следующая: есть два 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 между собой и получается пока один настроился, а второй еще и не запускался. Помогите пожалуйста, может быть я делаю не те настройки или, все таки, проблема из-за независимых источников питания?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение May 8 2010, 23:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(SidAlex @ May 6 2010, 10:48) *
Может ли это влиять на передачу/прием, ну например не синхронизируются MSP между собой и получается пока один настроился, а второй еще и не запускался.
Вообще-то SPI это синхронный интерфейс (Synchronous Periferial Interface), в котором каждый бит данных синхронизируется тактовым импульсом SPI-Master. Другое дело для того, чтобы сложить из битов байты нужна фреймовая синхронизация. А вы похоже про нее забыли, т.к используйте всего три провода для связи. В том же User's Guide приведена 5-и проводная схема (хотя в принципе достаточно и 4-х проводной) соединения двух МК. Если у вас устройство уже готово и не хочется его переделывать, то реализуйте хотя бы временную синхронизацию. Т.е. для синхронизации введите временную паузу между транзакциями. Обнаружив паузу в передаче, slave должен реинициализировать свой модуль USART так, чтобы сбросить его в исходное состояние. ну и конечно не стоит запускать передачу сразу после подачи питания. Сделайте паузу для того, чтобы Slave тоже успел проинициализироваться. Кстати, бит SWRST в UxCTL следует устанавливать отдельно до начала инициализации модуля USART и сбрасывать его только в самом конце. Замечание по этому поводу имеется в том же User's Guide.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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