|
Снова UART |
|
|
|
Jan 25 2007, 18:09
|
Группа: Новичок
Сообщений: 14
Регистрация: 17-01-07
Пользователь №: 24 520

|
Здравствуйте, недавно начал осваивать программирование микроконтроллеров, в частности msp430F169, столкнулся с проблемой передачи данных с него на компьютер. При передаче странно работает флаг UTXIFG0, т.е. он абсолютно не реагирует на помещение данных в U0TXBUF(хотя судя по руководству, должен сбрасываться), сбрасываеися лишь после вызова обработчика прерываний, и потом так и остается в нуле до PUC или SWRST=1.
Научите уму-разуму)), подскажите где ошибка. Спасибо.
Источник тактирования DCO (800kHz)
#include "msp430x16x.h"
int TransmitPacket(char *pData, int nDataSize);
int main() { // Остановить WatchDog timer WDTCTL = WDTPW + WDTHOLD;
/** Сбросить модуль USART (SWRST=1), Настроить порт: 8 бит в пакете, без контроля четности, 1 стоп-бит */ U0CTL = SWRST;
// Установить длину данных - 8 бит U0CTL |= CHAR;
// Источник тактирования - SMCLK U0TCTL |= SSEL1;
// Установить скорость работы порта 9600 бод U0BR0 = 0x53;
U0BR1 = 0x00;
U0MCTL = 0x03;
// Включить модуль USART через SFR (прием и передача) ME1 |= UTXE0 | URXE0;
// Разрешить прерывания по приему IE1 |= URXIE0;
// Очищаем SWRST бит U0CTL &= ~SWRST;
/*____________________Проверка_отправки_данных_на_компьютер______________________ _____*/
char aCheckData[] = {0x31,0x32,0x33};
int nCheckDataLen = 3;
for (;;) { TransmitPacket(aCheckData,nCheckDataLen); }
}//main
/** \fn int TransmitPacket(char *pData, int nDataSize) \param pData - указатель на передаваемый буфер nDataSize - размер передаваемых данных \brief Отправить данные в порт */
int TransmitPacket(char *pData, int nDataSize) { // Разрешить прерывания по приему IE1 |= UTXIE0;
// Переменная для хранения очередного байта данных (для ускорения операции доступа к данным массива) char *pTmpData = pData;
// Цикл передачи данных for (int nCount=nDataSize; nCount>0; nCount--) { // Разрешить маскированные прерывания (прерывания от периферийных модулей) _EINT();
// Дождаться готовности передатчика к приему новых данных while ( !(IFG1 & UTXIFG0) );
// Буфер готов к приему, записать очередной байт данных U0TXBUF = *pTmpData++;
// Дождаться завершения предыдущей операции записи while ( !(U0TCTL & TXEPT) ); }
// Передача завершена, прекратить вызов обработчика прерываний IE1 ^= UTXIE0;
return 0;
}// end of TransmitPacket()
#pragma vector = UART0TX_VECTOR
/** \fn void Uart0_TX (void) \brief Функция-обработчик прерываний от UART0 (при передаче) */ __interrupt void Uart0_TX (void) { // Прерывание обработано, сбросить GIE-бит _BIC_SR_IRQ(GIE); }
|
|
|
|
|
 |
Ответов
|
Jan 30 2007, 20:47
|
Группа: Новичок
Сообщений: 14
Регистрация: 17-01-07
Пользователь №: 24 520

|
Ну на счет manual могу чесно сказать, что прочитал от корки до корки  ) и вот строка, из-за которой весь сыр-бор (английского с собой сейчас нет, но там также)) ) UTXIFGx автоматически сбрасывается, если запрос прерывания обслужен или если символ записан в UxTXBUF.А мой флаг при занесении данных в буфер передатчика игнорировал это правило, но как оказалось действительно это была не суть проблеммы, ошибка была в конструкции, связывающей мой мк с компьютером. Теперь наслаждаюсь трансляцией трафика с мк в терминал и обратно, несмотря на всегда равный 1 UTXIFGx  ). Спасибо за потраченное на меня время.
|
|
|
|
|
Jan 30 2007, 21:31
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(!Roma! @ Jan 30 2007, 22:47)  А мой флаг при занесении данных в буфер передатчика игнорировал это правило, Да не игнорировал он его  Думаю вы просто не успевали отследить его изменение. Как наблюдали/трассировали? С помощью USB-FET или LPT-FET? Можете сами убедиться, посылая строку из неповторяющихся символов с последовательно возрастающим кодом, например, 0x30, 0x31, 0x32, 0x33 и т.д. Если бы ваш вывод был верен, то на терминале вы бы не увидели всю последовательность символов по порядку. Первый был бы правильно, а последующие с большими пропусками. Типа такой последовательности 0x30, 0x39, 0x53, 0x67.... Цитата(!Roma! @ Jan 30 2007, 22:47)  но как оказалось действительно это была не суть проблеммы, ошибка была в конструкции, связывающей мой мк с компьютером. Наверное соединили одноименные сигналы, TxD MSP430 с TxD RS-232, а? ;)
|
|
|
|
Сообщений в этой теме
!Roma! Снова UART Jan 25 2007, 18:09 rezident Во-первых, в опциях создания сообщения есть тэги ц... Jan 25 2007, 22:13 Lucky:) // Разрешить прерывания по приему
IE1 |= UTXIE0;
э... Jan 25 2007, 22:26 !Roma! Спасибо за дельные замечания, постараюсь учесть на... Jan 26 2007, 12:09 rezident Цитата(!Roma! @ Jan 26 2007, 14:0... Jan 26 2007, 15:28 !Roma! Подрихтовал исходники )), проблемма все таже: флаг... Jan 29 2007, 21:11 rezident Так и будете в час, точнее в день по чайной ложке ... Jan 30 2007, 04:09 jorikdima я от МСП430 и в виндовозном терминале все прекрано... Jan 30 2007, 09:35  Lucky:) Цитата(rezident @ Jan 30 2007, 21:31) Как... Jan 30 2007, 21:41   rezident Цитата(Lucky:) @ Jan 30 2007, 23... Jan 30 2007, 22:09    Lucky:) Цитата(rezident @ Jan 30 2007, 22:09) Не ... Jan 30 2007, 22:40 !Roma! ЦитатаДа не игнорировал он его
Что ж на это мне от... Feb 3 2007, 11:55 Lucky:) Цитата(!Roma! @ Feb 3 2007, 11:55... Feb 3 2007, 19:41 Dog Pawlowa Цитата(!Roma! @ Feb 3 2007, 12:55... Feb 3 2007, 20:58  Сергей Борщ Цитата(!Roma! @ Feb 3 2007, 12:55... Feb 3 2007, 23:29   Dog Pawlowa >>>>>>Хм. Но с прерываниями по п... Feb 4 2007, 16:43    rezident Цитата(!Roma! @ Feb 3 2007, 13:55... Feb 4 2007, 20:05     Dog Pawlowa Цитата(rezident @ Feb 4 2007, 21:05) Цита... Feb 5 2007, 17:10      IgorKossak Цитата(Dog Pawlowa @ Feb 5 2007, 16:10) 1... Feb 5 2007, 20:39      rezident Цитата(Dog Pawlowa @ Feb 5 2007, 19:10) Н... Feb 6 2007, 01:10       Dog Pawlowa Цитата(rezident @ Feb 6 2007, 02:10) ... ... Feb 7 2007, 17:39 AlHakim [quote name='!Roma!' date='Feb... Feb 3 2007, 16:10
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|