Добрый день, помогите пожалуйста, я новичок в этом деле и только начал осваивать AT91SAM7S64-EK
Мне дали программу, сделанную на делфи, она отсылает на ком порт данные, в виде 01 07 41 Е2 (4 байта). Мне нужно хотя бы считать их и передать назад. Но чего то не выходит. Принимается только последний байт. Подскажите пожалуйста, где моя ошибка. Пробывал передавать просто левые данные, то есть завел отдельную переменную где ручками уже указал что нужно отпоравлять, и оказалось что больше 4 байт он не отправляет, может я не сбрасываю какой то регистр? или что?
И еще, подскажите пожалуйста значение этих строк:
AT91C_BASE_US0->US_RCR = 100;
AT91C_BASE_US0->US_RTOR = 5;
Обязательно их снова вставлять в прерывании, ведь при конфигурации уже указывалось (слизано с примера из инета)?
Вот листинг программы полностью:
#include "Board.h"
#include <stdio.h>
#define USART_BAUD_RATE 9600
#define USART_INTERRUPT_LEVEL 6
#define AT91C_US_ASYNC_MODEmy ( AT91C_US_USMODE_NORMAL + \
AT91C_US_NBSTOP_1_BIT + \
AT91C_US_PAR_EVEN + \
AT91C_US_CHRL_8_BITS + \
AT91C_US_CLKS_CLOCK )
char BUFFREAD[100];
int len = 0 ;
int flag = 0;
////////////////////////////////////////////////
////функция разбора данных пришедших на порт////
////////////////////////////////////////////////
void funkc (char data[10])
{
AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_US0);
flag=0;
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED1);
int j=0;
while (j<4){
while (!AT91F_US_TxReady(AT91C_BASE_US0));
AT91F_US_PutChar(AT91C_BASE_US0,datal[j]);
j++;
}
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED1);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED2);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED3);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED4);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
}
///////////////////////////////////////////
////////Прерывание USARta//////////////////
///////////////////////////////////////////
void Usart_c_irq_handler(void)
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED2);
if (len>3) len=0;
BUFFREAD[len]=AT91F_US_GetChar(AT91C_BASE_US0);
len++;
AT91F_US_ResetRx(AT91C_BASE_US0);
AT91C_BASE_US0->US_RCR = 100;
AT91C_BASE_US0->US_RTOR = 5;
AT91C_BASE_US0->US_CSR=0x00;
AT91C_BASE_AIC->AIC_EOICR=0x00;
AT91C_BASE_AIC->AIC_ICCR=0x00;
flag=1;
}
///////////////////////////////////////////
////////Конфигурирование USARta////////////
///////////////////////////////////////////
void CnfUS ( void)
{
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<<AT91C_ID_US0 ) ;
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA,
((unsigned int) AT91C_PA5_RXD0 ) |
((unsigned int) AT91C_PA6_TXD0 ) ,
0 );
AT91F_US_Configure(AT91C_BASE_US0,
MCK ,
AT91C_US_ASYNC_MODEmy ,
USART_BAUD_RATE , 0);
AT91C_BASE_US0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN ;
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC,
AT91C_ID_US0,
USART_INTERRUPT_LEVEL,
AT91C_AIC_PRIOR_LOWEST,
Usart_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
AT91C_BASE_US0->US_RCR = 100;
AT91C_BASE_US0->US_RTOR = 5;
AT91F_US_EnableIt(AT91C_BASE_US0, AT91C_US_RXBUFF | AT91C_US_TIMEOUT );
}
////////////////////////////////////////
// Основная функция////////////////////
///////////////////////////////////////
main (void)
{
//конфигурируем кнопки и светодиоды, порты
AT91F_PIOA_CfgPMC();
AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, LED_MASK);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED_MASK);
//232
CnfUS ();
//бесконечный цикл
while(1)
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, LED4);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA, LED2);
if (flag==1 && len==3/ ) {
funkc (BUFFREAD, len);
}
}
}