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

 
 
> смена бодрейта в AT91SAM7X256
Redaer
сообщение Sep 3 2008, 13:17
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 12-07-06
Пользователь №: 18 762



Доброго вам времени суток

Подскажите пожалуйста, есть ли какие-нибудь особенности в смене бодрейта уарта, скажем так, на горячую?

То есть во время выполнения программы мне необходимо менять baudrate уарта. Так вот столкнулся с тем, что в буфере приемника нет никаких данных в то время, как их я вижу на осцилографе.

Конкретизируюsmile.gif

АРМ общается на скорости 28800 с модемом, затем в один прекрасный момент нужно поменять скорость на 115200. Меняю. Посылаю "привет" модему, тот как вежливый объект отвечаетsmile.gif Но в АРМе почему-то нет никакой информации.

Процедура инициализации уарта:
Код
void USART_init(unsigned int baudrate) {
    AT91C_BASE_US0->US_CR = AT91C_US_RSTRX |    
                            AT91C_US_RSTTX |            
                            AT91C_US_RXDIS |            
                            AT91C_US_TXDIS;            

    AT91F_PIO_CfgPeriph(
     AT91C_BASE_PIOA,  AT91C_PA0_RXD0 | AT91C_PA1_TXD0,
     0 );

    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1<<AT91C_ID_US0);

    AT91C_BASE_US0->US_IER = AT91C_US_ENDRX | AT91C_US_RXRDY;

    AT91F_US_Configure (AT91C_BASE_US0,
                        MCK,
                        AT91C_US_ASYNC_MODE | AT91C_US_NBSTOP_2_BIT,
                        baudrate,
                        0);

    AT91C_BASE_US0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;

    AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
                          AT91C_ID_US0,
                          INTERRUPT_LEVEL_7,
                          AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
                          Usart0_c_irq_handler);

    AT91C_BASE_US0->US_RPR = (unsigned int)&buff_rx;
    AT91C_BASE_US0->US_RCR = 256;
    AT91C_BASE_US0->US_TCR = 0;

    AT91C_BASE_US0->US_RTOR = 10000;

    AT91F_PDC_Open(AT91C_BASE_PDC_US0);
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US0);
}


Собственно, я попробовал просто вызвать в коде выше указанную процедуру с другим параметром baudrate

Код
. . . // Код общения с модемом на скорости 28800
  AT91C_BASE_US0->US_THR = 0x21;    
  sleep(100);
  AT91F_US_Put(AT91C_BASE_US0, baseAddress, 4);
  sleep(100);

  USART_init(115200);  // Пытаюсь поменять бодрейт

  sleep(100);
  AT91C_BASE_US0->US_THR = 0x21;    
  sleep(100);
  AT91C_BASE_US0->US_THR = 0x00;    // вот после этой посылки должно прийти 160 байт от модема, и они приходят, но в буфере buff_rx нет ничего.


Причем дальнейшая работа на 115200 вполне так может осуществляться... То есть, если модем присылает по одному байту, то в буфере они оказываются.

Подскажите пожалуйста, в чем особенность работы с переменным бодрейтом и приемом информации по нему?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 08:41
Рейтинг@Mail.ru


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