Перейти к содержанию
    

UART не принимает больше одного байта. Контроллер MSP430F4152

Сначала надо установить сброс УАРТа потом его включить

Изменено пользователем mcheb

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обсуждение читать там, а ответы давать здесь? :biggrin:

Вот ключевая фраза:

Причём работало раньше всё нормально, принимались 14 байт, а в один момент работать перестало.

Значит, что-то пошло не так :laughing: Уход частоты, уровней и прочее, в том числе со стороны передатчика тоже. В общем, все, не касающееся кода - его ведь не меняли, пока все работало нормально, верно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обсуждение читать там, а ответы давать здесь? :biggrin:

Вот ключевая фраза:

 

Значит, что-то пошло не так :laughing: Уход частоты, уровней и прочее, в том числе со стороны передатчика тоже. В общем, все, не касающееся кода - его ведь не меняли, пока все работало нормально, верно?

 

Да, загрузил версию, которая работала. Сейчас не работает. 2 байта принимаются через раз

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, загрузил версию, которая работала. Сейчас не работает. 2 байта принимаются через раз

 

Ну тогда подключаем "тяжёлую артиллерию"

 

0. Создаем отдельный тестовый проект

 

1. Програмируем UART на 9600 бит/сек (формат 8 бит 1 старт 1 стоп, без Automatic baud rate detection)

RX/ ТХ прерывания- запрещены) согласно MSP430F41x2_Code_Examples (TI file slac288e.zip)

При это рабоч частота проц и периферии должна быть >= 1 MHZ

 

2. Сначала проверяем передачу (не прием !)

 

Пример кода

  const char str_to_send[] = "Str to send\r\n";
  
  int len = strlen((char*)str_to_send);
  int i;

  for(;;)
  {
      for(i=0; i < len; i++)
     {
         while(!(IFG2&UCA0TXIFG));
         UCA0TXBUF = str_to_send[i];
     }
     delay_1_sec();
}

Подключаем стандартный Windows/Linux serial port терминал и убеждаемся в правильности передачи.

Если передача не проходит или искажена, с помощью осц проверяем форму и длительность импульсов,

а так же формат(8 бит 1 стоп 1 старт)

 

3. Если передача работает, то проверяем прием

 

3.1 Разрешаем RX interrupts

 

3.2 Пример кода обработчика

   // Globals 
    volatile int rx_val = 0;
    volatile int rx_cnt_ok = 0;
    volatile int rx_cnt_bad = 0;
  

#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCIA0RX_ISR (void)
{
      rx_val = UCA0RXBUF;
      if((UCA0STAT & (UCFE |  UCOE )) != 0)
      {
          rx_cnt_bad++;
      }
      else
      {
           rx_cnt_ok++;
           if(rx_cnt_ok >= 14)
               rx_val++;    // Just to make the compiler happy
      }   
}

 

3.3 Ставим breakpoints на rx_cnt_bad++ и на rx_val++;

 

3.4 С терминала посылаем строки типа "1234567890123456"

и убеждаемся что символы принимаются и ошибок нет

 

4. Переходим к реальному проекту

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну тогда подключаем "тяжёлую артиллерию"

 

0. Создаем отдельный тестовый проект

 

1. Програмируем UART на 9600 бит/сек (формат 8 бит 1 старт 1 стоп, без Automatic baud rate detection)

RX/ ТХ прерывания- запрещены) согласно MSP430F41x2_Code_Examples (TI file slac288e.zip)

При это рабоч частота проц и периферии должна быть >= 1 MHZ

 

2. Сначала проверяем передачу (не прием !)

 

Пример кода

  const char str_to_send[] = "Str to send\r\n";
  
  int len = strlen((char*)str_to_send);
  int i;

  for(;;)
  {
      for(i=0; i < len; i++)
     {
         while(!(IFG2&UCA0TXIFG));
         UCA0TXBUF = str_to_send[i];
     }
     delay_1_sec();
}

Подключаем стандартный Windows/Linux serial port терминал и убеждаемся в правильности передачи.

Если передача не проходит или искажена, с помощью осц проверяем форму и длительность импульсов,

а так же формат(8 бит 1 стоп 1 старт)

 

3. Если передача работает, то проверяем прием

 

3.1 Разрешаем RX interrupts

 

3.2 Пример кода обработчика

   // Globals 
    volatile int rx_val = 0;
    volatile int rx_cnt_ok = 0;
    volatile int rx_cnt_bad = 0;
  

#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCIA0RX_ISR (void)
{
      rx_val = UCA0RXBUF;
      if((UCA0STAT & (UCFE |  UCOE )) != 0)
      {
          rx_cnt_bad++;
      }
      else
      {
           rx_cnt_ok++;
           if(rx_cnt_ok >= 14)
               rx_val++;    // Just to make the compiler happy
      }   
}

 

3.3 Ставим breakpoints на rx_cnt_bad++ и на rx_val++;

 

3.4 С терминала посылаем строки типа "1234567890123456"

и убеждаемся что символы принимаются и ошибок нет

 

4. Переходим к реальному проекту

 

 

Спасибо. Передача-то работает нормально. По поводу кварца - у меня 32 кГц. Что, мало?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу кварца - у меня 32 кГц. Что, мало?

32768 Гц ?

UCA0BR0 = 0x03; // 32k/9600 - 3.41

а MCLK не от часового кварца пилит? может банально не успевает? - Nikolay801_

Но - раньше все работало? Что изменилось? Кто предает эти байты, которые не принимаются?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32768 Гц ?

 

 

Но - раньше все работало? Что изменилось? Кто предает эти байты, которые не принимаются?

 

 

Да 32768. Общается с МК программа верхнего уровня. Раньше работало, но немного подглючивало, в целом работало в общем.

2 байта не принимаются от терминала PCOMM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да 32768.... Раньше работало, но немного подглючивало, в целом работало в общем.

Немного подглючивало - значит, не работало. Частота кварца крайне низкая :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего процессор был частично испорчен в процессе экспериментов и скорее всего надо просто заменить проц и приемопередатчик...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего процессор был частично испорчен в процессе экспериментов и скорее всего надо просто заменить проц и приемопередатчик...

 

Такое может быть, что просто уарт испортился?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...