А в чем проблема-то?
Вот, например, инициализация для работы в режиме slave:
Код
void Init_SPI(void)
{
#define SPI_SCLK_FREQ 1e6 // Частота SCLK при работе интерфейса в режиме master
*pSPI_BAUD = (unsigned short)(SCLK/(2*SPI_SCLK_FREQ));
*pSPI_FLG = UPD_REG;
*pSPI_CTL = 0
| RDBR_CORE // передачи начинаются при чтении SPI_RDBR, прерывание
// генерируется при заполнении SPI_RDBR
// | SZ // когда SPI_TDBR пуст, то передача нуля
// | GM // когда SPI_RDBR заполнен, предыдущие данные перетираются
| PSSE // режим выбора ведомого разрешен
| EMISO // выход MISO разрешен
// | SIZE // длина слова 16 бит
// | LSBF // LSB first
| CPHA // SCK меняет состояние в начале первого бита данных
// | CPOL // активный уровень SCK низкий
// | MSTR // режим ведущего
// | WOM // выход с открытым стоком
| SPE // SPI-порт разрешен
;
*pSPI_TDBR = SPI_WAITCMD_CODE; // запись в регистр передачи чего-то там
#undef SPI_SCLK_FREQ
}
Обрати внимание на конструкцию со многими "|" - это для наглядности (установка битов). Там где строка закомментирована, соответствующий бит сброшен. Определения в cdefBF53x.h
Вот инициализация прерываний (сдесь, кроме прерывания от SPI, инициализируются и другие):
Код
void Init_Interrupts(void)
{
// assign ISRs to interrupt vectors
// используем назначение прерываний по умолчанию
register_handler(ik_ivg9, SPORT0_ISR); // прерывание данных SPORT0_ISR -> IVG9
register_handler(ik_ivg10, Spi_ISR); // Spi_ISR -> IVG10
register_handler(ik_ivg11, Timer0_ISR); // Timer0 ISR -> IVG 11
register_handler(ik_ivg12, ADC_ISR); // прерывание от АЦП (PF5) ADC_ISR -> IVG12
// enable interrupts
*pSIC_IMASK = 0
| DMA1_IRQ // прерывание приема SPORT0
| DMA5_IRQ // прерывание данных от SPI
| TIMER0_IRQ // прерывания от таймера 0
| PFA_IRQ // прерывание программируемого флага A
;
}
А вот само прерывание от SPI:
Код
EX_INTERRUPT_HANDLER(Spi_ISR)
{
unsigned char buf = (unsigned char)*pSPI_RDBR; // чтение буфера приема и сброс запроса
// на прерывание
// .........
}