mempfis_ 0 14 мая, 2010 Опубликовано 14 мая, 2010 · Жалоба Всем добрый день. Есть плата с AT91SAM7S к UART которой подключена микросхема для которой необходимо после настройки работы поменять скорость работы UART. Стартует она с 9600 а после настройки пытаюсь поставить 115200. Привожу процедуру инициализации UART: #define OVER0 0 //без oversampling #define BAUD0_9600 (BOARD_MCK / (9600*8*(2-OVER0))) #define BAUD0_115200 (BOARD_MCK / (115200*8*(2-OVER0))) //настройка usart0 void ConfigureUART0(unsigned int baud) { //разрешение тактирования uart0 AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0); // Reset and disable receiver & transmitter AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS; // Configures USART in hardware handshaking mode, asynchronous, 8 bits, 1 stop // bit, no parity, 115200 bauds and enables its transmitter and receiver. #if(OVER0 != 0) //режим с oversampling AT91C_BASE_US0->US_MR = AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_CLOCK | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT | AT91C_US_CHMODE_NORMAL | AT91C_US_OVER; #else //режим без с oversampling AT91C_BASE_US0->US_MR = AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_CLOCK | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT | AT91C_US_CHMODE_NORMAL; #endif //настройка предделителя частоты AT91C_BASE_US0->US_BRGR = baud; //инсталяция прерываний в AIC IRQ_DisableIT(AT91C_ID_US0); IRQ_ConfigureIT(AT91C_ID_US0, 1, USART0_ISR); IRQ_EnableIT(AT91C_ID_US0); //очищаем прерывания AT91C_BASE_US0->US_CSR; //разрешение прерывания по готовности приёмника AT91C_BASE_US0->US_IER = AT91C_US_RXRDY; //включаем приём/передачу AT91C_BASE_US0->US_CR = AT91C_US_RXEN|AT91C_US_TXEN; } /******************************************************************/ UART настраивается и работает если поставить скорость 9600 или 115200. Но если попытаться перенастроить его с одной скорости на другую то UART глохнет. Написал процедуру реконфигурирования UART - с ней тоже не перестраивается. /******************************************************************/ //настройка usart0 void reConfigureUART0(unsigned int baud) { //запрещаем прерывания в AIC IRQ_DisableIT(AT91C_ID_US0); // Reset and disable receiver & transmitter AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS; //настройка предделителя частоты AT91C_BASE_US0->US_BRGR = baud; //разрешаем прерывание в AIC IRQ_EnableIT(AT91C_ID_US0); //очищаем прерывания AT91C_BASE_US0->US_CSR; //разрешение прерывания по готовности приёмника AT91C_BASE_US0->US_IER = AT91C_US_RXRDY; //включаем приём/передачу AT91C_BASE_US0->US_CR = AT91C_US_RXEN|AT91C_US_TXEN; } /******************************************************************/ Подскажите как пожалуйста как перенастроить UART. Заранее благодарен за любые подсказки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 мая, 2010 Опубликовано 15 мая, 2010 (изменено) · Жалоба Оставить только //настройка предделителя частоты AT91C_BASE_US0->US_BRGR = baud; Разнести настройку режимов работы от настройки скорости. Изменено 16 мая, 2010 пользователем rezident Ненужное цитирование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 17 мая, 2010 Опубликовано 17 мая, 2010 · Жалоба Оставить только //настройка предделителя частоты AT91C_BASE_US0->US_BRGR = baud; Спасибо за подсказку. Скорость действительно меняется если изменить AT91C_BASE_US0->US_BRGR не трогая остального кода настройки уарта. Покопался в коде и заметил что после занесения команды на смену скорости микросхемы в фифо уарта сразу переключал скорость у уарта. В итоге команда даже не успевала отправляться. Ввёл таймаут на отправку данных - всё работает как положено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 17 мая, 2010 Опубликовано 17 мая, 2010 · Жалоба Ввёл таймаут на отправку данных - всё работает как положено. Правильнее будет - дождаться окончания передачи всего что ждёт (должны быть флаги соответствующие у UART), а не таймаутом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться