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

 
 
 
Reply to this topicStart new topic
> Связь двух чипов по UART, Дружим AT91SAM с ATmega16 через UART.
ЕшТ
сообщение May 31 2008, 03:05
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 15-11-07
Из: Taipei, TW
Пользователь №: 32 356



Есть два устройства, главное с МК 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();
}        

}
Go to the top of the page
 
+Quote Post
KRS
сообщение May 31 2008, 05:42
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



а с какой частотой отправляется 'G' ?
вообще странно что при отладке не работает.
Но при реальной работе такой протокол очень не стабилен. Нужна синхронизация - в простейшем случае перед отправкой 'G' почистить входной буфер уарта
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 31 2008, 07:54
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Проверьте, нет ли Overrun'ов в приемнике.
Go to the top of the page
 
+Quote Post
ЕшТ
сообщение May 31 2008, 09:18
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 65
Регистрация: 15-11-07
Из: Taipei, TW
Пользователь №: 32 356



Цитата(aaarrr @ May 31 2008, 10:54) *
Проверьте, нет ли Overrun'ов в приемнике.

Есть, бит OVRE стоит. wacko.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 31 2008, 09:28
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Тогда ищите тормоза. Должно быть что-то изрядное, если уж на 9600 не принимает.
Go to the top of the page
 
+Quote Post

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

 


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


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