|
|
  |
Вопрос по UART в MSP430F2122 |
|
|
|
Feb 4 2010, 15:39
|
Знающий
   
Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073

|
Здравствуйте, уважаемые коллеги! Прошу помощи! Собрал в сеть (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, подскажите? В эрратах ответа не нашел. Заранее благодарен.
|
|
|
|
|
Feb 4 2010, 17:48
|
Знающий
   
Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073

|
Сеть такая: ощая длина - 3м, между датчиками до 20 см, до мастера - 60 см, соединение - магистраль, на концах - резисторы. Сеть в норме, смотрел сигналы уже после ADM1485, уже на ногах MSP430F2122, сигналы отличные. Датчики местами менял. Паузы между пакетами, конечно есть. Я писал об паузах и задержках, имея в виду, что во время передачи пакета их нет.
|
|
|
|
|
Feb 5 2010, 04:25
|
Знающий
   
Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073

|
Для тактирования выбрал кварц 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
|
|
|
|
|
Feb 5 2010, 13:58
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Vladimir_T @ Feb 5 2010, 09:25)  Функцию обработки прерывания RxD привел очень примерно Извините, но когда исходники примерные, то и советы "примерные" получаются. При замене датчиков местами неисправность перемещается вместе с ними или локализована в определенном сегменте сети? Конденсаторы в обвязке кварца стоят? Какого номинала? Функция с адресом вектора NMI для обработки сбоя генерации кварцевого генератора имеется? Почему не используете возможность аппаратной фильтрации неверно принятых символов (бит UCRXEIE)? Цитата(Vladimir_T @ Feb 5 2010, 09:25)  Но переполнения массива исключены, так как данные при приеме перемещаются в кольцевой буфер: Ну а в этой функции кольцевого буфера проверка на выход за границы массива-то имеется? Или там тоже что-то типа использования "магических" размерностей переменных?
|
|
|
|
|
Feb 7 2010, 19:44
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(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 на мастере. Когда таймауты приема/передачи пакетов "от балды" выбраны, то, говорят, такие "костыли" иногда помогают
|
|
|
|
|
Feb 8 2010, 18:09
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(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 Растяжка линии только у мастера делается. Терминаторов на концах линии она не отменяет.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|