Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по UART в MSP430F2122
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Vladimir_T
Здравствуйте, уважаемые коллеги! Прошу помощи! Собрал в сеть (RS485) 12 ведомых устройств (позиционные датчики на процессоре MSP430F2122) и ведущий концентратор (на процессоре MSP430F149). На передачу (скорость 9600 бод) все работает нормально: т.е. каждый датчик отсылает пакеты концентратору, а тот их принимает безошибочно. А вот на прием!! Восемь датчиков принимают команды от концентратора правильно, а остальные - нет. Во всех датчиках идентичные прошивки. Отладчиком просматриваю буфер приема и вижу, что прерывания по приему идут нормально, а в приемном буферном массиве только 20% правильной информации, а остальные байты - нули.

Код
void Init_UART (void)
{
P3SEL = 0x30;                                     // P3.4,5 = USCI_A0 TXD/RXD
  UCA0CTL1 = UCSWRST;                       // **Initialize USCI state machine*
  UCA0BR0 = 82;                                // 16MHz/9600 = ~1666
  UCA0BR1 = 6;                                     //
  UCA0MCTL = UCBRS2 + UCBRS1;               // Modulation UCBRSx = 6
UCA0CTL1 |= UCSSEL_2;       // SMCLK
  UCA0CTL1 &= ~UCSWRST;                         // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                                  // Enable USCI_A0 RX interrupt
}

#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
Rcv_Buf [Ind++] = UCA0RXBUF;   // Save to Buffer
}


Концентратор передает посылки корректно, без задержек и пауз в пакетах. Большая часть плат ведь заработали сразу, а часть -нет. Процы из одной упаковки.. Снижал скорость передачи - не помогает. Может кто-нибудь сталкивался с ошибками в работе UART на 2122, подскажите? В эрратах ответа не нашел. Заранее благодарен.
rezident
Ну раз прошивка одинакова, то значит проблема не в ней, а в самой сети. RS485 требует некоторых условий для устойчивой работы. Терминаторы у вас используются? Растяжка линии на мастере предусмотрена? Если предусмотрена, то включена ли? Какая вообще длина линии? Вы не "звездой" случайно подключили слейвы? Почему между пакетами не предусмотрены паузы? Ведь требуется некоторое время для того, чтобы переключить трансивер RS485 с приема на передачу или обратно и потом подождать окончания переходного процесса в линии. Только после этого можно начинать передачу.
Vladimir_T
Сеть такая: ощая длина - 3м, между датчиками до 20 см, до мастера - 60 см, соединение - магистраль, на концах - резисторы. Сеть в норме, смотрел сигналы уже после ADM1485, уже на ногах MSP430F2122, сигналы отличные. Датчики местами менял. Паузы между пакетами, конечно есть. Я писал об паузах и задержках, имея в виду, что во время передачи пакета их нет.
rezident
Для тактирования UART вы используете SMCLK=DCO, а частоту DCO калибровочными константами задаете, так? Константы не потерлись случайно?
В прерывании у вас используется безусловный инкремент индекса элемента буфера, т.е. проверку на выход за границы диапазона буфера вы не ведете. Вы уверены, что переполнения буфера никогда не происходит? Может больший кусок кода опубликуете?
Vladimir_T
Для тактирования выбрал кварц XT1 , SMCLK=16 mHz.
Код
void Initial_System (void)
{unsigned int i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  BCSCTL1 = XTS;                            // ACLK = LFXT1 = HF XTAL
  BCSCTL3 = LFXT1S1;                        // 3 – 16MHz crystal or resonator
  do
  {
    IFG1 &= ~OFIFG;                         // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);             // Time for flag to set
  }
  while (IFG1 & OFIFG);                     // OSCFault flag still set?
  BCSCTL2 = SELM_3 + SELS;                  // MCLK = SMCLK = LFXT1 (safe)
  
} // void Init_System (void)


Временные диаграммы приема/передачи проверял осциллографом - все в норме. Функцию обработки прерывания RxD привел очень примерно, чтобы не заграмождать форум. Но переполнения массива исключены, так как данные при приеме перемещаются в кольцевой буфер:

Код
Circular_Buf_Put (UCA0RXBUF, &RxD_Buf);   // Save to Circular Buffer
rezident
Цитата(Vladimir_T @ Feb 5 2010, 09:25) *
Функцию обработки прерывания RxD привел очень примерно
Извините, но когда исходники примерные, то и советы "примерные" получаются. laughing.gif
При замене датчиков местами неисправность перемещается вместе с ними или локализована в определенном сегменте сети?
Конденсаторы в обвязке кварца стоят? Какого номинала?
Функция с адресом вектора NMI для обработки сбоя генерации кварцевого генератора имеется?
Почему не используете возможность аппаратной фильтрации неверно принятых символов (бит UCRXEIE)?
Цитата(Vladimir_T @ Feb 5 2010, 09:25) *
Но переполнения массива исключены, так как данные при приеме перемещаются в кольцевой буфер:
Ну а в этой функции кольцевого буфера проверка на выход за границы массива-то имеется? Или там тоже что-то типа использования "магических" размерностей переменных?
Vladimir_T
Спасибо за содействие и хорошие мысли. Если датчики поддерживаются (отвечают концентратору), то отвечают они всегда, в какой бы сегмент я их не включал. В обвязке кварца конденсаторы 18 пФ.
Функцию с адресом вектора NMI, честно говоря еще не вставил. Но ведь система работает устойчиво.
У меня реализован аппаратный рестарт на базе TPS3823.
Бит UCRXEIE буду анализировать. Кольцевой буфер работает прекрасно.
На кабель стал грешить, сделал другой, но это не помогло.
Уже голову сломал... Хочу попробовать поменять конверторы RS485.
rezident
Цитата(Vladimir_T @ Feb 7 2010, 23:08) *
Функцию с адресом вектора NMI, честно говоря еще не вставил. Но ведь система работает устойчиво.
Гм. А вы в курсе, что при сбое в генераторе MCLK переходит на DCO, а SMCLK останавливается (может остановиться) совсем и перезапустить их возможно только, предварительно переключив тактирование на DCO и потом снова на (LF)XT? Не тут ли у вас "собака порылась"?
Цитата(Vladimir_T @ Feb 7 2010, 23:08) *
У меня реализован аппаратный рестарт на базе TPS3823.
Это супервизор питания с WD и сбросом? И как он сможет помочь в случае сбоя генератора, если вы факт этого сбоя не фиксируете, а выполнение программы при этом не прекращается?
Цитата(Vladimir_T @ Feb 7 2010, 23:08) *
Уже голову сломал... Хочу попробовать поменять конверторы RS485.
Сделайте вначале контроль генератора, а если не поможет, то растяжку линии RS485 на мастере. Когда таймауты приема/передачи пакетов "от балды" выбраны, то, говорят, такие "костыли" иногда помогают laughing.gif
Vladimir_T
Подвижки есть уже стали отвечать почти все датчики: для ADM485 поставил по питанию дополнительный конденсатор 0.01 мкФ к имеющемуся 0.1 мкФ.
Я все понял, сделаю, отпишу. Но как растяжку сделать?
Тайиауты выбраны не жесткие: мастер может ожидать ответа долго.
Это просто апндикс кабеля с терминаторм на конце?
rezident
Цитата(Vladimir_T @ Feb 8 2010, 22:13) *
Подвижки есть уже стали отвечать почти все датчики: для ADM485 поставил по питанию дополнительный конденсатор 0.01 мкФ к имеющемуся 0.1 мкФ.
А какое вообще питание у м/с трансивера RS485? Т.е. чем, как, с помощью чего сделано? И как далеко от источника питания расположены она? Вполне возможно, что 0,1мкФ это маловато и нужно 1...10мкФ по питанию поставить.
Цитата(Vladimir_T @ Feb 8 2010, 22:13) *
Я все понял, сделаю, отпишу. Но как растяжку сделать?
У м/с трансивера RS485 линия A подтягивается резистором к его плюсу питания (+Vcc), а линия B резистором к его минусу питания (GND). Номиналы резисторов порядка 1кОм. http://caxapa.ru/sch/rs485.html Растяжка линии только у мастера делается. Терминаторов на концах линии она не отменяет.
Vladimir_T
Входное питание 5В, TPS76333 (33 мкФ + 0.1), процессор 149, DS1302, LCD (подсветка от 5В), EEPROM и ADM1485, который находится на растоянии 7 см от источника питания.
Видимо, растяжка поможет: заметил, что доп. внесенная минимальная емкость в линии улучшает связь.
Спасибо за помощь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.