void SPI_Init( void )
{
// инициализация SPI
// enable the clock of the SPI
AT91C_BASE_PMC->PMC_PCER = 1<<AT91C_ID_SPI;
// переключаем PIOA на SPI
AT91C_BASE_PIOA->PIO_PDR = AT91C_PA14_SPCK | AT91C_PA13_MOSI | AT91C_PA12_MISO | AT91C_PA11_NPCS0;
AT91C_BASE_PIOA->PIO_ASR = AT91C_PA14_SPCK | AT91C_PA13_MOSI | AT91C_PA12_MISO | AT91C_PA11_NPCS0;;
// SPI reset
AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SWRST;
// режим слейва
AT91C_BASE_SPI->SPI_MR &= ~AT91C_SPI_MSTR;
// захват по фронту
AT91C_BASE_SPI->SPI_CSR[ 0 ] |= AT91C_SPI_CPOL;
// клок равен MCK/8 ~6МГц
AT91C_BASE_SPI->SPI_CSR[ 0 ] |= (8<<8);
// 16 бит в посылке
AT91C_BASE_SPI->SPI_CSR[ 0 ] |= (AT91C_SPI_BITS_16);
// инициализация PDC для SPI
AT91C_BASE_PDC_SPI->PDC_TPR = (unsigned int)aucDataToHost;
AT91C_BASE_PDC_SPI->PDC_PTCR = AT91C_PDC_TXTEN;
AT91C_BASE_PDC_SPI->PDC_TCR = 2;
AT91C_BASE_PDC_SPI->PDC_RPR = (unsigned int)aucCmdFromHost;
AT91C_BASE_PDC_SPI->PDC_PTCR = AT91C_PDC_RXTEN;
AT91C_BASE_PDC_SPI->PDC_RCR = 2;
// инициализация вектора прерываний
AT91F_AIC_Init( AT91C_BASE_AIC, AT91C_ID_SPI, 4, AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED, Spi_c_irq_handler );
// разрешаем прерывание прерывания от SPI
AT91C_BASE_SPI->SPI_IER = AT91C_SPI_TXBUFE;
// AT91C_BASE_AIC->AIC_EOICR = 0xffffffff; // эта строка только для корректной работы с J-link !!!
AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_SPI;
// SPI enabled
AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SPIEN;
}