Рабочий примерчик STM32F103 , может чем поможет.
//---------------------------------------------------------------------------
// SPI1 Init CounterMode (HSI=SysCLK=8Mhz) SCLK=8/16=500kHz
//---------------------------------------------------------------------------
void SPI_InitCounterMode(void)
{
SPI_InitTypeDef SPI_InitStruct; // Структура настроек SPI
SPI_I2S_DeInit( SPI1 ); // Отречемся от старого мира
// Забивка структуры значениями по-умолчанию
SPI_StructInit(&SPI_InitStruct);
// Настройки SPI
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // Коэфф. делителя. Тактовая частота SCLK = F_pclk / коэфф. делителя
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; // Активный фронт тактового сигнала (первый или второй)
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; // Устойчивое состояние тактового сигнала (низкое или высокое)
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // Формат данных (8 бит или 16 бит)
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // Выбрать две однонаправленные линии (MISO и MOSI)
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; // Первый бит в потоке (MSB или LSB)
SPI_InitStruct.SPI_Mode = SPI_Mode_Master; // Ведущий режим
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
// Затактируем SPI1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // SPI1 тактируется от APB2. Разрешить тактирование.
// Настроим SPI1
SPI_Init(SPI1, &SPI_InitStruct);
// Включим SPI
SPI_Cmd(SPI1, ENABLE);
}