|
Снова 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, а? ;)
|
|
|
|
|
Jan 30 2007, 21:41
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 5-10-06
Пользователь №: 21 031

|
Цитата(rezident @ Jan 30 2007, 21:31)  Как наблюдали/трассировали? С помощью USB-FET или LPT-FET? В чём может проявиться различие (не имея ввиду время отклика po USB&LPT)? Два JTAGa но один core (msp430)
|
|
|
|
|
Jan 30 2007, 22:09
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Lucky:) @ Jan 30 2007, 23:41)  Цитата(rezident @ Jan 30 2007, 21:31)  Как наблюдали/трассировали? С помощью USB-FET или LPT-FET?
В чём может проявиться различие (не имея ввиду время отклика po USB&LPT)? Два JTAGa но один core (msp430) Не понял, что вы подразумеваете под "различием", но чтобы обнаружить сброс флага UTXIFGx после записи в UxTXBUF нужно кроме установки breakpoint на этой команде одновременно еще и тактирование UART останавливать. Что дебаггер не делает. Если уж так хочется подловить этот "подлый" флаг, то выберите источником тактирования внешний сигнал UCLKx и тактируйте UART одиночными импульсами от кнопки, подключенной, например, к RS-триггеру. Вот тогда после записи в UxTXBUF флаг будет сброшен, пока до UARTа (при условии, что сдвиговый регистр пуст) не пройдет первый импульс BITCLK. Цитата The data is then moved to the transmit shift register on the next BITCLK after the TX shift register is empty, and transmission begins.
|
|
|
|
Сообщений в этой теме
!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, 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
|
|
|