Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UART не принимает больше одного байта. Контроллер MSP430F4152
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
OlegALL


Проблема в теме. Обсуждение здесь: http://caxapa.ru/609239.html
Помогите
mcheb
Сначала надо установить сброс УАРТа потом его включить
OlegALL
Что за сброс?
mcheb
Цитата(OlegALL @ Jul 14 2015, 15:53) *
Что за сброс?

Код
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
OlegALL
Цитата(mcheb @ Jul 14 2015, 17:20) *
Код
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**




не помогло
yuri_t
Заработал ли UART ?
Abell
Обсуждение читать там, а ответы давать здесь? biggrin.gif
Вот ключевая фраза:
Цитата
Причём работало раньше всё нормально, принимались 14 байт, а в один момент работать перестало.

Значит, что-то пошло не так laughing.gif Уход частоты, уровней и прочее, в том числе со стороны передатчика тоже. В общем, все, не касающееся кода - его ведь не меняли, пока все работало нормально, верно?
OlegALL
Цитата(Abell @ Jul 16 2015, 10:02) *
Обсуждение читать там, а ответы давать здесь? biggrin.gif
Вот ключевая фраза:

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


Да, загрузил версию, которая работала. Сейчас не работает. 2 байта принимаются через раз
yuri_t
Цитата(OlegALL @ Jul 16 2015, 09:52) *
Да, загрузил версию, которая работала. Сейчас не работает. 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. Переходим к реальному проекту

OlegALL
Цитата(yuri_t @ Jul 16 2015, 12:32) *
Ну тогда подключаем "тяжёлую артиллерию"

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 кГц. Что, мало?
Abell
Цитата(OlegALL @ Jul 16 2015, 12:53) *
По поводу кварца - у меня 32 кГц. Что, мало?

32768 Гц ?
Цитата
UCA0BR0 = 0x03; // 32k/9600 - 3.41

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

Но - раньше все работало? Что изменилось? Кто предает эти байты, которые не принимаются?
OlegALL
Цитата(Abell @ Jul 16 2015, 14:21) *
32768 Гц ?


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



Да 32768. Общается с МК программа верхнего уровня. Раньше работало, но немного подглючивало, в целом работало в общем.
2 байта не принимаются от терминала PCOMM.
Abell
Цитата(OlegALL @ Jul 16 2015, 13:48) *
Да 32768.... Раньше работало, но немного подглючивало, в целом работало в общем.

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

OlegALL
Цитата(agregat @ Jul 16 2015, 15:40) *
Скорее всего процессор был частично испорчен в процессе экспериментов и скорее всего надо просто заменить проц и приемопередатчик...


Такое может быть, что просто уарт испортился?
Abell
Цитата(OlegALL @ Jul 16 2015, 15:06) *
Такое может быть, что просто уарт испортился?

OlegALL, Вы пропускаете очевидные советы и склоняетесь к невероятным? UART синхронизируется системными клоками. Коэффициент деления у Вас должен быть 3.41, а поставить можно только 3 - это какой уход частоты будет, сами посчитаете? И в какую фазу клока попадет второй, третий по очереди байт?

P.S. Как вариант - установите скорость обмена 1200 и коэффициент соответствующий, есть такая возможность? Результат потом огласите sm.gif
Obam
Если настройки USCI соответствуют приведённым в http://caxapa.ru/609239.html, то для 9600 б/с на 32768Гц
коэффициент в модуляторе неправильный: N=32768/9600=3.41 (слишком большая ошибка для целочисленного коэффициента)
=> UCBRx=INT(N)=3, а UCBRSx=round((N-INT(N))*8)=3, т.е. UCA0MCTL не может иметь младший ниббл AH.
OlegALL
Цитата(Obam @ Jul 16 2015, 17:29) *
Если настройки USCI соответствуют приведённым в http://caxapa.ru/609239.html, то для 9600 б/с на 32768Гц
коэффициент в модуляторе неправильный: N=32768/9600=3.41 (слишком большая ошибка для целочисленного коэффициента)
=> UCBRx=INT(N)=3, а UCBRSx=round((N-INT(N))*8)=3, т.е. UCA0MCTL не может иметь младший ниббл AH.



Скорость 1200 не помогла. При создании тестового проекта, как советовали выше, вообще ничего не получается - не принимает и не передаёт.

Вот код с сайта ti. У них же преддедлитель 3:


CODE

/* --COPYRIGHT--,BSD_EX
* Copyright © 2012, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************
*
* MSP430 CODE EXAMPLE DISCLAIMER
*
* MSP430 code examples are self-contained low-level programs that typically
* demonstrate a single peripheral function or device feature in a highly
* concise manner. For this the code may rely on the device's power-on default
* register values and settings such as the clock configuration and care must
* be taken when combining code from several examples to avoid potential side
* effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
* for an API functional library-approach to peripheral configuration.
*
* --/COPYRIGHT--*/
//******************************************************************************
// MSP430F41x2 Demo - USCI_A0, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK
//
// Description: Echo a received character, RX ISR used. Normal mode is LPM3,
// USCI_A0 RX interrupt triggers TX Echo.
// ACLK = BRCLK = LFXT1 = 32768, MCLK = SMCLK = DCO~1048k
// Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 3.41 (0003h 03h)
// //* An external watch crystal is required on XIN XOUT for ACLK *//
//
//
// MSP430F41x2
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P6.5/UCA0RXD|------------>
// | | 9600 - 8N1
// | P6.6/UCA0TXD|<------------
//
// P. Thanigai
// Texas Instruments Inc.
// January 2009
// Built with CCE Version: 3.1 and IAR Embedded Workbench Version: 4.11
//******************************************************************************

#include <msp430.h>

int main(void)
{
volatile unsigned int i;

WDTCTL = WDTPW+WDTHOLD; // Stop WDT
FLL_CTL0 |= XCAP11PF; // Configure load caps

do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0x47FF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?

P6SEL |= BIT5+BIT6; // P6.5,6 = USCI_A0 RXD/TXD
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 0x03; // 32k/9600 - 3.41
UCA0BR1 = 0x00; //
UCA0MCTL = 0x06; // Modulation
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt

_BIS_SR(LPM3_bits + GIE); // Enter LPM0, interrupts enabled
}

// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCIA0RX_ISR (void)
{
while(!(IFG2&UCA0TXIFG));
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
}



Abell
Цитата(OlegALL @ Jul 17 2015, 10:43) *
Скорость 1200 не помогла.

На стороне передатчика, надеюсь, тоже выставили скорость 1200 ? И столько же стоп-битов, сколько и в Вашем коде (кстати, неплохо бы его в тег убрать, пока от модератора нагоняй не получили)?
Что касается примера TI - если пойдет непрерывный поток из нескольких байт (кадр), при таком делении неизбежно сорвется синхронизация, что и получилось laughing.gif
Цитата
// | P6.5/UCA0RXD|------------>
// | | 9600 - 8N1
// | P6.6/UCA0TXD|<------------

Это всего лишь пример, работает на заглушку, что передает - то и принимает. С другим устройством будет "подглючивать" sm.gif
OlegALL
Цитата(Abell @ Jul 17 2015, 12:05) *
На стороне передатчика, надеюсь, тоже выставили скорость 1200 ? И столько же стоп-битов, сколько и в Вашем коде



да
Obam
При настройке УАПП, мне в своё время, очень понравилось останавливать (под JTAGом) "проц" и тупо руками задавать данные в UCAxTXBUF (результат отображался в терминале на ПК). Так же данные, посылаемые в "проц", отображались в UCAxRXBUF. И Tx, RX полезно осциллографом (иногда sm.gif) смотреть. Это я к тому, что "…вообще ничего не получается - не принимает и не передаёт…"
Abell
И что не получилось, какие симптомы, можно подробнее?
agregat
Цитата(OlegALL @ Jul 16 2015, 15:06) *
Такое может быть, что просто уарт испортился?

Может и скорее всего так и произошло. Причин может быть несколько, самая простая это статическое электричество.
Вы работает без коврика, без заземления и браслета. Стол обычный, плата на бумаге в лучшем случае.
Сели за стол, все сдохло просто так. Обычная ситуация.

Пытаться программировать непроверенное оборудование это гарантированная потеря времени и сил.
Вот сначала надо убедиться что они все работоспособные.
У Вас может не работать порт на компе, USB шнурок, трансивер RS232 или порт на процессоре.
Чтоб их проверить закольцуйте прием на передачу на этот же порт процессора, или на другой порт
обычно у процессоров несколько UART. Тоже с шнурком, его можно проверить с другим компом,
или как минимум самого на себя.
Пока у Вас нерабочее предположительно железо которое сдохло от миллиона причин.
Как проверите что микросхемы и порты все работает по отдельности или в любой комбинации
можно приступать к программированию коэффициентов деления генератора.
OlegALL
Всё работает, неправильно сделал инициализацию. Спасибо ответившим
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.