Цитата(Shuuura @ May 17 2006, 10:48)

//конфигурировать SPI
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_SPI ) ;
AT91F_SPI_Reset(AT91C_BASE_SPI);
Здесь было бы неплохо сконфигурировать ноги:
Код
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, // PIO controller base address
((UINT) AT91C_PA11_NPCS0 ) |
((UINT) AT91C_PA12_MISO ) |
((UINT) AT91C_PA13_MOSI ) |
((UINT) AT91C_PA14_SPCK ) |
((UINT) AT91C_PA31_NPCS1 ), // Peripheral A
((UINT) AT91C_PA3_NPCS3 ) |
((UINT) AT91C_PA30_NPCS2 ) ); // Peripheral B
А до этого включить частоту на PIO (впрочем, здесь не уверен).
Цитата
//определяет регистр SPI_MR
AT91F_SPI_CfgMode(AT91C_BASE_SPI,
AT91C_SPI_MSTR | //мастер
AT91C_SPI_PS_FIXED | //фиксирования периферия
AT91C_SPI_MODFDIS | //Mode fault detection is disabled.
((0x00 << 24) & AT91C_SPI_DLYBCS)
);
AT91C_BASE_SPI->SPI_CR = AT91C_SPI_LASTXFER | AT91C_SPI_SPIEN;
AT91C_BASE_SPI->SPI_TDR = AT91C_SPI_LASTXFER;
//использую аппартный CS, хотя можно использовать и любые ножки.
Можно-то оно конечно можно. Только выбирать CS придётся. Да так, чтобы одна из ног опускалась. Возразите, если сможете.
Цитата
//при использовании аппаратных СS заранее сконфигурировать соответствующие функции PIO контроллера
//устанавливает биты PCS в регистре SPI_MR
for(i=0;i<4;i++){
//определяет регистры SPI_CSR0... SPI_CSR3
AT91F_SPI_CfgCs(AT91C_BASE_SPI,
i,//номер регистра
// AT91C_SPI_CPOL | //SPI mode 3
AT91C_SPI_BITS_16 |//Передаем по 16 бит
// AT91C_SPI_CSAAT | //оставить СS активным после окончания передачи
((0x02 << 8) & AT91C_SPI_SCBR) | //Serial Clock Baud Rate (делитель мастер клока)
((0x01 << 24) & AT91C_SPI_DLYBCT)|
((0x10 << 16) & AT91C_SPI_DLYBS)
); //Delay Between Consecutive Transfers
}
AT91F_PDC_EnableRx(AT91C_BASE_PDC_SPI);
AT91F_PDC_EnableTx(AT91C_BASE_PDC_SPI);
AT91F_PDC_Open(AT91C_BASE_PDC_SPI);
//отправка слова данных (отпарвлять можно от 8 до 16 бит)
//0x0e - выбор ножки CS
while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY));
//здесь выбирается ножка CS
AT91F_SPI_CfgPCS(AT91C_BASE_SPI,0x0E);
AT91F_SPI_PutChar(AT91C_BASE_SPI,data, 0x0E));
// отправка через PDC
while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY));
AT91F_SPI_CfgPCS(AT91C_BASE_SPI,0x0E);
AT91F_SPI_SendFrame(AT91C_BASE_SPI, (char*)(data_pointer),data_size , 0, 0);
while(!AT91F_PDC_IsRxEmpty(AT91C_BASE_PDC_SPI));
пользуйтесь PDC - отличная вешь (особенно после работы с AVR)
аналогично делается прием, полько надо помнить, что для приема вначале надо что-нибудь отправить, а потом считывать данные из регистра приема.
Смотрите ww.AT91.com - там есть хороший форум