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

 
 
 
Reply to this topicStart new topic
> Возможности USART в MSP430F449, TXD/RXD как выходы общего назначения
Petrooo
сообщение Jul 28 2006, 10:01
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-10-05
Пользователь №: 9 922



Добрый день, уважаемые коллеги!
Имеется следующая задача.
Блок на основе MSP430F449.
Для проверки работоспособности интерфейсного разъема RS232 сигнал TXD с помощью заглушки заведен на RXD (в том же интерфейсном разъеме). Это сигналы порта USART0 - TXD(P2.4)/RXD(P2.5).
Возможно ли в MSP430 настройть USART так, чтобы можно было бы сигналами TXD/RXD играться "вручную" как в процах 8051, 8052 - ставить TXD в 0/1 и ловить эти значения RXD?
Или в MSP430 такое вообще не возможно?

Вот так не работает blink.gif
Код
#define  TX0  (P2OUT & 0x10)
#define  RX0  (P2IN  & 0x20)
#define  ClrTX0  P2OUT &= ~0x10
#define  SetTX0  P2OUT |=  0x10

void TestRS_PC() {
   P2SEL |= 0x30;         // P2.4,5 = USART0 TXD(P2.4)/RXD(P2.5)
   P2DIR |= 0x10;        // P2.4 output direction

   IE1 &= ~(UTXIE0 + URXIE0);
   ME1 |= UTXE0 + URXE0;         // Enable USART0 TXD/RXD

   UCTL0 = SYNC;   // пробовал так   1
//   UCTL0 = СHAR;    и вот так         2
//   UCTL0 = 0;          и так тоже       3

   do {
     ClrTX0;
     Delay(500);  // задержка 500 мс
     if (RX0) ShowMsg(msgRX_HIGH);  // на индикатор RXD = 1
     else ShowMsg(msgRX_LOW);        // на индикатор RXD = 0

     SetTX0;                             // после этой команды RX0 все равно = 0 !!!
     Delay(500);
     if (RX0) ShowMsg(msgRX_HIGH);  // на индикатор RXD = 1
     else ShowMsg(msgRX_LOW);        // на индикатор RXD = 0
   } while(!GetKey());
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 28 2006, 10:31
Сообщение #2


Гуру
******

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



Цитата(Petrooo @ Jul 28 2006, 16:01) *
Возможно ли в MSP430 настройть USART так, чтобы можно было бы сигналами TXD/RXD играться "вручную" как в процах 8051, 8052 - ставить TXD в 0/1 и ловить эти значения RXD?
Или в MSP430 такое вообще не возможно?

Во-первых, если вы хотите использовать пины для дискретного ввода/вывода, то и используйте их на здоровье.
P3SEL&=~0x30;
Настроить пины на ввод/вывод в P3DIR, писать в P3OUT, читать состояние из P3IN. На настройки USART эти манипуляции никак не повлияют. Т.е. потом можно будет "легким движением руки" вернуть все обратно к функциям UART.
P3SEL|=0x30;
Во-вторых, для тестирования функционирования программной части работы с UART (но не внешнего железа/обвески) можно воспользоваться встроенной в USART функцией loopback. Для этого достаточно лишь установить соответствующий бит в регистре UxCTL
U0CTL|=LISTEN;
или
U0CTL|=0x08;
Или разъясните доступнее, что вам хочется? cranky.gif
Go to the top of the page
 
+Quote Post
diper
сообщение Jul 28 2006, 10:35
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750



2 rezident
Уважаемый rezident, ну зачем так быстро отвечать на вопросы, дайте же простым смертым набрать эти полезные сообщения sad.gif
Go to the top of the page
 
+Quote Post
Petrooo
сообщение Jul 28 2006, 13:16
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-10-05
Пользователь №: 9 922



Благодарю Вас, уважаемый rezident, за скорый и исчерпывающий ответ.
Как оказывется все просто - P3SEL&=~0x30; smile.gif
Цитата(rezident @ Jul 28 2006, 13:31) *
Или разъясните доступнее, что вам хочется? cranky.gif

Разумеется требуется протестить все внешнее железо/обвеску, как на выход, так и на вход - в этом собственнно и смысл теста.
Честно говоря мне уже удалось забороть проблему через одно место:
Код
void TestRS_PC() {
   P2SEL |= 0x30;         // P2.4,5 = USART0 TXD(P2.4)/RXD(P2.5)
   P2DIR |= 0x10;        // P2.4 output direction

   IE1 &= ~(UTXIE0 + URXIE0);

   do {
     UCTL0 = SYNC;            // логический 0 (U=+6В на выходе TXD интерфейсного разъема)

     Delay(500);
     if (RX0) ShowMsg(msgRX_HIGH);
     else ShowMsg(msgRX_LOW);

    UCTL0 = CHAR;              // логическая 1 (U=-6В на выходе TXD интерфейсного разъема)

     Delay(500);
     if (RX0) ShowMsg(msgRX_HIGH);
     else ShowMsg(msgRX_LOW);
   } while(!GetKey());
}

Но Ваш ответ расставил все по своим местам twak.gif
Еще раз Вам спасибо
Go to the top of the page
 
+Quote Post

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

 


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


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