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

 
 
> AT91sam7x256->UART1->теряет данные
D1ma
сообщение Aug 28 2009, 20:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-11-07
Пользователь №: 32 165



Здравствуйте уважаемые.

Надо организовать передачу по UART .
Написал код на прием. Послал с компа к ат91сам7с256 пакет 1,2,3,4,5,6,7,8,176,207 – 10 байт. Но приходит в среднем 5 байт через 1,2.
Не знаю где глюк. Помогите, целый день пробился бестолку smile3046.gif
код ниже . IAR
CODE
void AIC_ConfigureIT(
unsigned int source,
unsigned int mode,
void (*handler)(void))
{
// Disable the interrupt first
AT91C_BASE_AIC->AIC_IDCR = 1 << source;

// Configure mode and handler
AT91C_BASE_AIC->AIC_SMR[source] = mode;
AT91C_BASE_AIC->AIC_SVR[source] = (unsigned int) handler;

// Clear interrupt
AT91C_BASE_AIC->AIC_ICCR = 1 << source;
}
//------------------------------------------------------------------------------
/// Enables interrupts coming from the given (unique) source (AT91C_ID_xxx).
/// \param source Interrupt source to enable.
//------------------------------------------------------------------------------
void AIC_EnableIT(unsigned int source)
{
AT91C_BASE_AIC->AIC_IECR = 1 << source;
}
//------------------------------------------------------------------------------
/// Interrupt handler for USART1.
//------------------------------------------------------------------------------
int count=0;
#define SIZEBUF 10
unsigned char pBuffer[SIZEBUF];
void ISR_Usart1(void)
{

unsigned int status;
// Read USART status
status = AT91C_BASE_US1->US_CSR;
// Receive buffer is full
if ((status & AT91C_US_ENDRX) == AT91C_US_ENDRX)
{
if ((AT91C_BASE_US1->US_RCR == 0) && (AT91C_BASE_US1->US_RNCR == 0))
{
AT91C_BASE_US1->US_RPR = (unsigned int) pBuffer;
AT91C_BASE_US1->US_RCR = SIZEBUF;
AT91C_BASE_US1->US_PTCR = AT91C_PDC_RXTEN;
}
}
}

void InitModBus()
{

AT91C_BASE_US1->US_CR = AT91C_US_RSTRX | // Reset Receiver
AT91C_US_RSTTX | // Reset Transmitterp
AT91C_US_RXDIS | // Receiver Disable
AT91C_US_TXDIS; // Transmitter Disable

AT91C_BASE_PDC_US1->PDC_PTCR = AT91C_PDC_RXTDIS |AT91C_PDC_TXTDIS; //PDC off
//clear buf
AT91C_BASE_US1->US_TCR = 0;
AT91C_BASE_US1->US_RCR = 0;
AT91C_BASE_US1->US_TNCR = 0;
AT91C_BASE_US1->US_RNCR = 0;

//timeout off
AT91C_BASE_US1->US_TTGR = 0;
AT91C_BASE_US1->US_RTOR = 0;
//PIOA - init
AT91C_BASE_PIOA->PIO_PER=(1<<24);//всегда прием
AT91C_BASE_PIOA->PIO_OER=(1<<24);
AT91C_BASE_PIOA->PIO_CODR=(1<<24);

AT91C_BASE_PIOA->PIO_PDR=(1<<21)|(1<<22);//|(1<<24);
AT91C_BASE_PIOA->PIO_ASR=(1<<21)|(1<<22);//|(1<<24);
AT91C_BASE_PIOA->PIO_BSR=0;
//uart MCK on
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_US1);
//set uart1
AT91C_BASE_US1->US_MR= AT91C_US_USMODE_NORMAL |//AT91C_US_USMODE_RS485 |
AT91C_US_CLKS_CLOCK |
AT91C_US_CHRL_8_BITS |
AT91C_US_NBSTOP_1_BIT |
AT91C_US_CHMODE_NORMAL ;
AT91C_BASE_US1->US_BRGR=BOARD_MCK/(16*9600);


//set buf rx
AT91C_BASE_US1->US_RPR = (unsigned int) pBuffer;
AT91C_BASE_US1->US_RCR = SIZEBUF;
//buf on rx tx
AT91C_BASE_US1->US_PTCR = AT91C_PDC_RXTEN|AT91C_PDC_TXTEN;

// intr for null count buf rx
AT91C_BASE_US1->US_IER=AT91C_US_ENDRX;

// intr uart1 on
AIC_ConfigureIT(AT91C_ID_US1, 0, ISR_Usart1);
AIC_EnableIT(AT91C_ID_US1);
//eneble tx & rx
AT91C_BASE_US1->US_CR=AT91C_US_RXEN|AT91C_US_TXEN;


};


Да байты приходят правельные, тоесть параметр юарта норм. (жаль не все cranky.gif )
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 19:06
Рейтинг@Mail.ru


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