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

Рашпиль

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

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

  • Посещение

Репутация

0 Обычный

Информация о Рашпиль

  • День рождения 07.09.1983

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Я код всегда пишу в NetBeans. Если сравнивать Keil и IAR для ARM, то Keil однозначно лучше - у него просто потрясающий симулятор. Сам жду не дождусь когда же Keil сделает достойный редактор кода.
  2. У меня была похожая проблема. Проверьте количество стоп битов и контроль четности. Одинаковые ли настройки с обеих сторон?
  3. Всем спасибо за ответы. Проблема была в не правильных настройках программы COM Port Toolkit. Было установлено 2 стоп бита и контроль четности. А контроллер 1 стоп бит и без контроля четности. Тема закрыта.
  4. Из данного цикла программа не выходит. Мне нужно организовать побайтовую передачу массива. Алгоритм действий мой таков: 1. Записываю первый байт в буфер. 2. Жду прерывания что буфер освободился (данные скопированы в передающий регистр). 3. Записываю следующий байт. Повторяю необходимое количество раз.
  5. Нет. Его использование обязательно? Вот функция настройки UART: /** * Настройка модуля UART контроллера * @param baudRate - желаемая скорость обмена; * @param wordLength - количество битов данных: 5 - 8; * @param nStopBits - количество стоп битов: 1, 2; * @param parity - тип паритета: * 0 - отключен; * 1 - нечетность; * 2 - четность; * @param frequency - системная частота контроллера; */ void UART_Init(unsigned long baudRate, unsigned char wordLength, unsigned char nStopBits, unsigned char parity, unsigned long frequency){ unsigned long Fdiv; unsigned long regVal; NVIC_DisableIRQ(UART_IRQn); // Настройка выводов используемых аппаратным модулем USART LPC_IOCON->PIO1_6 &= ~0x07; // Очищаем биты отвечающие за выбор функции вывода LPC_IOCON->PIO1_6 |= 0x01; // Устанавливаем для вывода функцию RXD - вход приемника UART LPC_IOCON->PIO1_7 &= ~0x07; // Очищаем биты отвечающие за выбор функции вывода LPC_IOCON->PIO1_7 |= 0x01; // Устанавливаем для вывода функцию RXD - вход приемника UART LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12); // Включаем тактирование модуля UART LPC_SYSCON->UARTCLKDIV = 0x01; // Устанавливаем делитель частоты в 1 LPC_UART->LCR = 0x80; // Разрешаем доступ к Divisor Latches - настройка скорости работы UART // Вычисляем значения регистров настройки скорости regVal = LPC_SYSCON->UARTCLKDIV; Fdiv = ((frequency/regVal)/16)/baudRate; // Устанавливаем значения регистров настройки скорсти LPC_UART->DLM = Fdiv / 256; LPC_UART->DLL = Fdiv % 256; UART_setWordLength(wordLength); // Устанавливаем длину слова UART_setNStopBits(nStopBits); // Устанавливаем количество стоп битов UART_setParity(parity); // Установка паритета RESETBIT(LPC_UART->LCR, 7); // Запрещаем доступ к Divisor Latches regVal = LPC_UART->LSR; // Настройка FIFO LPC_UART->FCR = 0; SETBIT(LPC_UART->FCR,0); // Разрешаем работу приемного буффера SETBIT(LPC_UART->FCR,1); // Очищаем RX буффер SETBIT(LPC_UART->FCR,2); // Очищаем TX буффер SETBIT(LPC_UART->FCR,6); SETBIT(LPC_UART->FCR,7); while ( LPC_UART->LSR & (LSR_THRE|LSR_TEMT) != (LSR_THRE|LSR_TEMT) ); while ( LPC_UART->LSR & LSR_RDR ){ regVal = LPC_UART->RBR; } UART_Init_IRQ(); // Настройка прерываний } Прерывания пока вообще запрещаю. Заполняю буфер и получается наложение байтов. Вот код заполнения буфера: void UART_send(unsigned char *buffer, unsigned char number){ unsigned char count = 0; Uart.ptrTXBuffer = buffer; Uart.numberTX = number; while ((Uart.numberTX > 0) && (count < 14)){ LPC_UART->THR = *Uart.ptrTXBuffer; Uart.ptrTXBuffer ++; Uart.numberTX --; count ++; } }
  6. NXP LPC1114 Проблемы с UART

    Столкнулся со следующей проблемой в контроллере LPC1114 фирмы NXP. Работаю с UART. Разрешил прерывание THRE. Данное прерывание должно наступать когда передающий буфер FIFO пуст. Но мною было обнаружено что данное прерывание наступает немного раньше и из-за этого мне пришлось вставить задержку. Без задержки байты накладывались друг на друга. Вот код обработчика прерываний UART: void UART_IRQHandler(void){ unsigned long valueIIR; unsigned char buffer; valueIIR = LPC_UART->IIR >> 1; valueIIR &= 0x07; switch (valueIIR){ case 1: // THRE Interrupt UART_HandlerTXInterrupt(); break; case 2: // Receive Data Available (RDA) buffer = LPC_UART->RBR; //UART_sendByte(0x11); break; case 6: // CTI buffer = LPC_UART->RBR; //UART_sendByte(0x22); break; default: buffer = LPC_UART->RBR; break; } } void UART_HandlerTXInterrupt(void){ unsigned char valueLSR; unsigned char delay = 5; valueLSR = (unsigned char)LPC_UART->LSR; if ((Uart.numberTX > 0) && (CHECKBIT(valueLSR, 5))){ while(delay--); LPC_UART->THR = *Uart.ptrTXBuffer; Uart.numberTX --; if (Uart.numberTX > 0){ Uart.ptrTXBuffer ++; } } } Это черновик кода. Критиковать не нужно. Кто-нибудь сталкивался с такой проблемой?
×
×
  • Создать...