Здравствуйте, недавно начал осваивать программирование микроконтроллеров, в частности 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); }
|