Всем доброго времени суток!
Пытаюсь настроить модуль SPI на STM32F0 для работы в режиме передачи мастером (полудуплекс): BIDIMODE=1 и BIDIOE=1. Данный режим в теории должен задействовать только один пин данных - MOSI. Также пытаюсь включить аппартное управление пином NSS для выбора единственного ведомого. В итоге нормальная передача не происходит, а пин NSS вообще в 1. Помогите разобраться где накосячил. Вот код функций:
Код
void SPI_Init(void)
{
/* Включаем на выводах SPI - NSS, SCK и MOSI - режим альтернативной функции */
GPIOA->MODER &= ~(GPIO_MODER_MODER4 | GPIO_MODER_MODER5 | GPIO_MODER_MODER7);
GPIOA->MODER |= GPIO_MODER_MODER4_1 | GPIO_MODER_MODER5_1 | GPIO_MODER_MODER7_1;
GPIOA->AFR[0] &= ~(GPIO_AFRL_AFRL4 | GPIO_AFRL_AFRL5 | GPIO_AFRL_AFRL7);
/* Тактируем модуль SPI */
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
/* Конфигурируем SPI */
SPI1->CR1 |= SPI_CR1_BR; // задаем частоту обмена
SPI1->CR1 |= SPI_CR1_CPOL | SPI_CR1_CPHA; // задаем режим работы SPI (полярность и фазу)
SPI1->CR1 |= SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE; // задаем режим передачи
SPI1->CR2 |= SPI_CR2_DS_0 | SPI_CR2_DS_1 | SPI_CR2_DS_2; // задаем формат данных (разрядность)
SPI1->CR1 &= ~SPI_CR1_LSBFIRST; // задаем способ передачи (формат фрейма)
SPI1->CR1 &= ~SPI_CR1_SSM; // задаем режим управления NSS (аппаратное или программное)
SPI1->CR2 |= SPI_CR2_SSOE; // задаем режим внешнего вывода NSS
SPI1->CR1 |= SPI_CR1_MSTR; // задаем режим работы модуля SPI (ведущий или ведомый)
SPI1->CR1 |= SPI_CR1_SPE; // включаем модуль SPI
}
void SPI_Transfer(uint8_t data)
{
/* Помещаем данные на передачу */
SPI1->DR = data;
/* Ждем окончания передачи */
while (!(SPI1->SR & SPI_SR_TXE));
while (SPI1->SR & SPI_SR_BSY);
}
З.Ы. Само собой порт A предварительно тактирован.