Надо организовать передачу по UART .
Написал код на прием. Послал с компа к ат91сам7с256 пакет 1,2,3,4,5,6,7,8,176,207 – 10 байт. Но приходит в среднем 5 байт через 1,2.
Не знаю где глюк. Помогите, целый день пробился бестолку

код ниже . 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;
};
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;
};
Да байты приходят правельные, тоесть параметр юарта норм. (жаль не все
