Сделал PDC для всех используемых USARTов. Немного переделал функции от AT91RM9200.
Вот примерный алгоритм
1) Сначала открываем для каждого USARTa.
CODE
// --Конфигурация PDC ------------------------
void ConfigurePDC()
{
AT91F_PDC_Open (AT91C_BASE_PDC_US0); // Настройка PDC для USART_DIRECT
AT91F_PDC_Open (AT91C_BASE_PDC_US5);
AT91F_PDC_Open (AT91C_BASE_PDC_US2);
AT91F_PDC_Open (AT91C_BASE_PDC_US3);
}
// -------------------------------------------
2) Для приема, передачи написал такие функции
2.1) Ретрансляция из порта в порт
CODE
unsigned int PDC_ReceiveWrite (
AT91PS_PDC pPDCRecive,
AT91PS_PDC pPDCWrite,
char *pBuffer,
unsigned int szBuffer)
{
if (AT91F_PDC_IsRxEmpty(pPDCRecive)) {
//* Buffer and next buffer can be initialized
AT91F_PDC_SetRx(pPDCRecive, pBuffer, szBuffer);
AT91F_PDC_SetTx(pPDCWrite, pBuffer, szBuffer);
return 1;
}
else {
return 0;
}
}
При срабатывании прерывания у меня данные сразу ретранслируются. Можно и буфер отслеживать.
2.2) Передача в порт
CODE
unsigned int PDC_Send(
AT91PS_PDC pPDC,
char *pBuffer,
unsigned int szBuffer)
{
if (AT91F_PDC_IsTxEmpty(pPDC)) {
//* Buffer and next buffer can be initialized
AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer);
return 2;
}
else {
//* All buffer are in use...
return 0;
}
}
Использую один буфер, так как мне его хватает.
Возникла только проблема с самими прерываниями. Не всегда срабатывают.
В чем отличие AT91C_US_RXRDY от AT91C_US_ENDRX ?