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