реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как поменять baudrate UART SAM7S, Не получается поменять скорость после первой инициализации
mempfis_
сообщение May 14 2010, 14:03
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Всем добрый день.

Есть плата с AT91SAM7S к UART которой подключена микросхема для которой необходимо после настройки работы поменять скорость работы UART.
Стартует она с 9600 а после настройки пытаюсь поставить 115200.

Привожу процедуру инициализации UART:
CODE

#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 - с ней тоже не перестраивается.

CODE

/******************************************************************/
//настройка 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.
Заранее благодарен за любые подсказки.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 15 2010, 20:33
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Оставить только
Код
  //настройка предделителя частоты
  AT91C_BASE_US0->US_BRGR = baud;


Разнести настройку режимов работы от настройки скорости.

Сообщение отредактировал rezident - May 16 2010, 00:28
Причина редактирования: Ненужное цитирование.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение May 17 2010, 14:31
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Genadi Zawidowski @ May 15 2010, 23:33) *
Оставить только
Код
  //настройка предделителя частоты
  AT91C_BASE_US0->US_BRGR = baud;


Спасибо за подсказку. Скорость действительно меняется если изменить AT91C_BASE_US0->US_BRGR не трогая остального кода настройки уарта.

Покопался в коде и заметил что после занесения команды на смену скорости микросхемы в фифо уарта сразу переключал скорость у уарта.
В итоге команда даже не успевала отправляться.
Ввёл таймаут на отправку данных - всё работает как положено.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 17 2010, 20:48
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(mempfis_ @ May 17 2010, 18:31) *
Ввёл таймаут на отправку данных - всё работает как положено.


Правильнее будет - дождаться окончания передачи всего что ждёт (должны быть флаги соответствующие у UART), а не таймаутом.
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016