Цитата(Kitsok @ Feb 12 2007, 21:01)

Цитата(Karl @ Feb 7 2007, 08:44)

Спасибо, вроде разобрался. Заработало.
Добрый день!
А можете код показать? Удалось ли принимать данные с использованием PDC?
Да, передачу и прием по PDC организовать удалось. Проблемы, как оказалось, были не с PDC, а с некорректной работой с SPI.
Инициализация SPI:
Код
void SPI_ini(void)
{
AT91F_SPI_Reset(AT91C_BASE_SPI);
//delay_ms(5);
// Инициализация SPI. Запустим на работу с частотой примерно 2,5 МГц
// Конфигурация канала АЦП (2 канал)
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_SPI); // Тактирование на SPI
AT91F_SPI_CfgMode(AT91C_BASE_SPI,
1<<0| //Интерфейс работает в режиме ведущего.
0<<1| //Фиксированный выбор корпуса внешнего периферийного устройства.
0<<2| //PCSDEC: Декодирование выбора корпуса 0 = Периферийные устройства непосредственно подключены к выводам выбора корпуса.
0<<4| //MODFDIS: Определение ошибки режима работы 0 =Определение ошибки режима работы запрещено.
0<<7| // Зацикливание 0 - отключено
0xb<<16); // PCS: Выбор корпуса периферии Корпус 3
AT91F_SPI_CfgCs(AT91C_BASE_SPI,2,
AT91C_SPI_BITS_8| // 8 бит в пакете
400<<8| // Частота SPI в 20 наза меньше MCK (необходимо не более 2,5 МГц)
2<<16| // Задержка перед выдачей тактовой частоты
0<<24| // Задержка между последовательными передачами данных
1<<1);
AT91F_SPI_Enable(AT91C_BASE_SPI);
AT91F_PDC_Open(AT91C_BASE_PDC_SPI);
}
Собственно работа:
Код
for(;;)
{
while(AT91F_SPI_SendFrame(AT91C_BASE_SPI,(char*) &SPI_buf_TX[0],sizeof(SPI_buf_TX),0,0) == 0);
u08 a = AT91F_SPI_ReceiveFrame(AT91C_BASE_SPI,(char*) &SPI_buf_RX[0],sizeof(SPI_buf_TX),0,0);
// Ожидаем, пока приемный буфер заполнится. В дальнейшем включу на прерывание.
while(!( a = AT91C_BASE_SPI->SPI_SR & AT91C_SPI_ENDRX));
...
...
...
}