Перейти к содержанию
    

!Roma!

Участник
  • Постов

    8
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Во первых, против этого мнения выступает то, что Aurora должна сама определять критичную разницу частот (более 200 ppm) и выставлять флаг аппаратной ошибки hard_error, чего не было мною замечено.....К тому же, протокол усердно отправляет Clock compensation каждые 5 Кб, что должно устранять подобные казусы)) Ну а, во-вторых, тактирование обоих плат от одного генератора противоречит концепции будущего устройства)). Но, в любом случае спасибо за внимание))
  2. Уважаемые разработчики, отлаживаю устройство высокоскоростной передачи данных на 2 платах Xilinx Virtex4 ML405, подключенных друг другу через SMA разъемы, длина кабеля 25см, данные передаются с помощью протокола Aurora. Сталкиваюсь с потерей данных, примерно одно слово на 10Кб информации. На одной плате, в loopback таких проблем нет. Напрашивается разность частот генераторов приемника и передатчика, но счетчики программных и аппаратных ошибок (hard_error, soft_error, frame_error), выдаваемых Aurora не меняются. Подскажите, с чем еще это может быть связано. Спасибо.
  3. DebugVSRelease

    Привет. Отлаживаю проект... В дебуге все работает как "Кремлевские куранты")), попытаюсь зашить релиз, использую mspFet (в IAR такой возможности не нашел) и вся моя безукоризненная работа останавливается)). Подскажите пож-та есть ли возможность прошивать release версия используя IAR, и чем в данном компиляторе вообще отличаются debug от release? Да и кто пользовался mspFet, нареканий не вызывает? Спасибо.
  4. Снова UART

    Что ж на это мне ответить нечего, достаточно доходчиво:). При дальнейшем углублении в перепитии UARTA, созрел еще вопрос: (надеюсь, что более интеллектуальный чем с флагом :) ) можно ли как-то работать напрямую со сдвигающим приемным буфером UARTa или хотя бы настроить его по аналогии с виндоусным регистром FIFO? Просто при отправке пакета данных, скажем из 6 байт, процедура обработки прерывания вызывается только для последнего байта, который в UXRXBUFe уже успел затереть 5 своих предшественников (выставлен флаг переполнения OE). Если не трудно, подскажите... Спасибо.
  5. Снова UART

    Ну на счет manual могу чесно сказать, что прочитал от корки до корки:)) и вот строка, из-за которой весь сыр-бор (английского с собой сейчас нет, но там также)) ) UTXIFGx автоматически сбрасывается, если запрос прерывания обслужен или если символ записан в UxTXBUF. А мой флаг при занесении данных в буфер передатчика игнорировал это правило, но как оказалось действительно это была не суть проблеммы, ошибка была в конструкции, связывающей мой мк с компьютером. Теперь наслаждаюсь трансляцией трафика с мк в терминал и обратно, несмотря на всегда равный 1 UTXIFGx :)). Спасибо за потраченное на меня время.
  6. Снова UART

    Подрихтовал исходники )), проблемма все таже: флаг UTXIFG0 никак не реагирует на помещении байта данных в буфер передатчика, т.е. всегда ==1, соответственно до окна терминала, вызванного на подключенном к мк ООД данные, посланные в UART не доходят. Источник тактирования: по-умолчанию (DCO, 800kHz). Внимание, вопрос: почему? :). Спасибо. int main() { // Остановить WatchDog timer WDTCTL = WDTPW + WDTHOLD; /*___________________________Инициализация_UART0__________________________*/ // P3.3,4 = USART0 TXD/RXD P3SEL = 0x30; // Разрешить маскированные прерывания (прерывания от периферийных модулей) // _EINT(); /** Сбросить модуль USART (SWRST=1), Настроить порт: 8 бит в пакете, без контроля четности, 1 стоп-бит */ U0CTL = SWRST; // Установить длину данных - 8 бит U0CTL |= CHAR; // Источник тактирования - SMCLK U0TCTL |= SSEL1; // Установить скорость работы порта 9600 бод U0BR0 = 0x53; U0BR1 = 0x00; U0MCTL = 0x03; // Включить модуль USART через SFR (только передача) ME1 |= UTXE0; // Очищаем SWRST бит U0CTL &= ~SWRST; /*___________________________Передача_данных________________________________*/ for (;;) { // Дождаться готовности передатчика к приему новых данных while ( !(IFG1 & UTXIFG0) ); // Буфер готов к приему, записать очередной байт данных U0TXBUF = 0x31; } }//main
  7. Снова UART

    Спасибо за дельные замечания, постараюсь учесть на будующее )), но все таки основной вопрос почему UTXIFG0 не реагирует на помещение данных в буфер передатчика, т.е. всегда ==1 (прерывания убрал, PIN настроил).
  8. Снова UART

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