Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Связь двух чипов по UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ЕшТ
Есть два устройства, главное с МК AT91SAM7A3 (USART аналогичны SAM7S, насколько я смотрел) и второстепенное с MК ATmega16. Задача связать их между собой по UART порту (USART2 у ARM).
По событию ARM периодически должен посылать в мегу символ 'G' (команда Get так сказать), на что мега отвечает текстовой строчкой 16 байт. Эту строчку ARM должен получить и записать в символьную переменную. Связь 9600, 8 бит, 1 стоповый бит, без проверки четности.

Столкнулся с проблемой, никак не получается засинхронизировать это дело, ARM посылает исправно "G" и получает строчку с разных кусков. Уже день колядую, подскажите.

Компилятор IAR ARM 4.41A. AVRрка исправно получает команду и отдает строчку если подключить ее к терминалу. Дело именно в арме.

Функции работы с UART:

Код
#define BR2    9600                        /* Baud Rate */
#define BRD2  (MCK/16/BR2)                    /* Baud Rate Divisor */

AT91S_USART * pUSART2 = AT91C_BASE_US2;      /* Global Pointer to USART0 */


void uart2_init (void) {                   /* Initialize Serial Interface */

  /* mt: n.b: uart0 clock must be enabled to use it */

  *AT91C_PIOA_PDR = AT91C_PA9_RXD2 |        /* Enable RxD0 Pin */
                    AT91C_PA10_TXD2;         /* Enalbe TxD0 Pin */

  pUSART2->US_CR = AT91C_US_RSTRX |          /* Reset Receiver      */
                  AT91C_US_RSTTX |          /* Reset Transmitter   */
                  AT91C_US_RXDIS |          /* Receiver Disable    */
                  AT91C_US_TXDIS;           /* Transmitter Disable */

  pUSART2->US_MR = AT91C_US_USMODE_NORMAL |  /* Normal Mode */
                  AT91C_US_CLKS_CLOCK   |  /* Clock = MCK */
                  AT91C_US_CHRL_8_BITS   |
                  //AT91C_US_SYNC | /* 8-bit Data  */
                  AT91C_US_PAR_NONE |
                  AT91C_US_NBSTOP_1_BIT;    /* 1 Stop Bit  */

  pUSART2->US_BRGR = BRD2;                    /* Baud Rate Divisor */

  pUSART2->US_CR = AT91C_US_RXEN  |          /* Receiver Enable     */
                  AT91C_US_TXEN;            /* Transmitter Enable  */
}

int uart2_putc(int ch)
{
    while (!(pUSART2->US_CSR & AT91C_US_TXRDY));   /* Wait for Empty Tx Buffer */
    return (pUSART2->US_THR = ch);                 /* Transmit Character */
}    

int uart2_putchar (int ch) {                      /* Write Character to Serial Port */

  if (ch == '\n')  {                            /* Check for LF */
    uart2_putc( '\r' );                         /* Output CR */
  }
  return uart2_putc( ch );                     /* Transmit Character */
}

int uart2_puts ( char* s )
{
    while ( *s ) uart2_putchar( *s++ );
    return 0;
}

int uart2_kbhit( void ) /* returns true if character in receive buffer */
{
    if ( pUSART2->US_CSR & AT91C_US_RXRDY) {
        return 1;
    }
    else {
        return 0;
    }
}

int uart2_getc ( void )  /* Read Character from Serial Port */
{    

  while (!(pUSART2->US_CSR & AT91C_US_RXRDY));   /* Wait for Full Rx Buffer */
  return (pUSART2->US_RHR);                      /* Read Character */
}


А вот функция которая должна получать строчку

Код
void GetString(void)
{
char buffer[16];
unsigned int i;
uart2_putchar('G');

for (i=0;i<15;i++)
{
buffer[i]=uart2_getc();
}        

}
KRS
а с какой частотой отправляется 'G' ?
вообще странно что при отладке не работает.
Но при реальной работе такой протокол очень не стабилен. Нужна синхронизация - в простейшем случае перед отправкой 'G' почистить входной буфер уарта
aaarrr
Проверьте, нет ли Overrun'ов в приемнике.
ЕшТ
Цитата(aaarrr @ May 31 2008, 10:54) *
Проверьте, нет ли Overrun'ов в приемнике.

Есть, бит OVRE стоит. wacko.gif
aaarrr
Тогда ищите тормоза. Должно быть что-то изрядное, если уж на 9600 не принимает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.