|
Снова 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); }
|
|
|
|
|
 |
Ответов
|
Feb 3 2007, 16:10
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 7-02-05
Из: Уфа
Пользователь №: 2 474

|
[quote name='!Roma!' date='Feb 3 2007, 13:55' post='205860'] При дальнейшем углублении в перепитии UARTA, созрел еще вопрос: (надеюсь, что более интеллектуальный чем с флагом  ) [/quote] [quote можно ли как-то работать напрямую со сдвигающим приемным буфером UARTa или хотя бы настроить его по аналогии с виндоусным регистром FIFO? Просто при отправке пакета данных, скажем из 6 байт, процедура обработки прерывания вызывается только для последнего байта, который в UXRXBUFe уже успел затереть 5 своих предшественников (выставлен флаг переполнения OE). Если не трудно, подскажите... Спасибо. [/quote] было бы идеальным решением для контроллеров кинул 20 байт и забыл  даже без прерываний, а зачем отвлекаться то  . Хотя думаю, что если использовать DMA, то это вполне осуществимо. А так использовать буфер на передачу и прием, что вообщем-то освобождает от рутины
|
|
|
|
Сообщений в этой теме
!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 !Roma! Ну на счет manual могу чесно сказать, что прочитал... Jan 30 2007, 20:47 rezident Цитата(!Roma! @ Jan 30 2007, 22:4... Jan 30 2007, 21:31  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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|