По событию 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 */
}
#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();
}
}
{
char buffer[16];
unsigned int i;
uart2_putchar('G');
for (i=0;i<15;i++)
{
buffer[i]=uart2_getc();
}
}