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

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

Процедура инициализации уарта:
Код
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);
}
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 нет ничего.
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 вполне так может осуществляться... То есть, если модем присылает по одному байту, то в буфере они оказываются.
Подскажите пожалуйста, в чем особенность работы с переменным бодрейтом и приемом информации по нему?