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

 
 
> USART0 & at91sam7s256, После настроек по документации не работает
mempfis_
сообщение Mar 31 2010, 08:53
Сообщение #1


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

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



Пытаюсь настроить USART0 для передачи данных в терминал без использования прерываний.
После чтения документации пришёл к таким настройкам:

Код
#define BOARD_MCK 48000000
#define US0_BAUD 115200
#define BAUDRATE0 (BOARD_MCK / US0_BAUD) / 16;

//настройка usart0
void ConfigureUART(void)
{
  //разрешение тактирования uart0
  AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0);
  
  // сброс и запрет приёмника/передатчика
  AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;

  //асинхронный режим, 8 бит, 1 стоповый, без чётности, системный клок 48МГц
  AT91C_BASE_US0->US_MR = AT91C_US_USMODE_HWHSH | AT91C_US_CLKS_CLOCK | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE
                        | AT91C_US_NBSTOP_1_BIT | AT91C_US_CHMODE_NORMAL;
  
  //настройка предделителя частоты
  AT91C_BASE_US0->US_BRGR = BAUDRATE0;
  
  //очищаем прерывания
  AT91C_BASE_US0->US_CSR;
  
  
  //включаем приём/передачу
  AT91C_BASE_US0->US_CR = AT91C_US_RXEN|AT91C_US_TXEN;
  
}
/******************************************************************/


В PIO настраиваю альтернативные функции - PA5/PA6 RXD/TXD соответственно

Код
/*******************************************/
//линии uart
#define RXD (1<<5) //in
#define TXD (1<<6) //out pu

//настройка альтернативных функций
void PIO_alternat_config(void)
{
  //разрешаем альтернативным функциям управлять выводами
  AT91C_BASE_PIOA->PIO_PDR = RXD|TXD;
  
  //разрешаем подтягивающий резистор на TXD
  AT91C_BASE_PIOA->PIO_PPUER = TXD;
  
  //разрешаем альтернативные функции
  AT91C_BASE_PIOA->PIO_ASR = RXD|TXD;
}
/*******************************************/


Для передачи символа определил функцию:

Код
void _putcharSerial0(unsigned char data)
{
  //ожидаем завершения передачи
  //while(!(AT91C_BASE_US0->US_CSR & AT91C_US_TXRDY));
  AT91C_BASE_US0->US_THR = data;
  for(int i=1000000; i; i--);
}


Сначала попробовал опрашивать флаг готовности к передаче и потом пихать символ в US_THR.
Программа зависла как только я попытался передать первый-же символ
(вероятно на строчке ожидания готовности к передаче).
Заменил ожидание на задержку перед отправкой следующего символа - в терминале 0, программа после попытки отправить символ пошла исполняться дальше.
Т.е. полагаю что USART0 всёже не включился.
Хотя я подал на него тактирование, настроил регистры управления, предделитель, включил приём/передачу, настроил альтернативные функции в PIO!

Вопрос - что я упустил в настройках?
Заранее спасибо за ответы smile.gif

Сообщение отредактировал mempfis_ - Mar 31 2010, 08:55
Go to the top of the page
 
+Quote Post



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

 


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


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