Я знаю, вопрос довольно старый. Тем не менее, поскольку я столкнулся с той же проблемой в последние дни, я постараюсь дать ответ для будущих читателей.
Следующий код работает на STM32F407, который используется на плате обнаружения STM32. Из таблицы видно, что периферийное устройство SPI такое же, как на STM32F103, поэтому
Я ожидаю, что код будет работать на другом микроконтроллере без изменений.
#include "stm32f4xx.h"
[... configure the pins SCK, MISO, MOSI and NSS ...]
// Configure the SPI as: Slave, 8 bit data, clock high when idle, capture on
// 1st edge, baud rate prescaler 2, MSB first.
SPI1->CR1 = SPI_CR1_CPOL;
// No interrupts, no DMA and Motorola frame format.
SPI1->CR2 = 0;
// Enable the peripheral.
SPI1->CR1 |= SPI_CR1_SPE;
// Wait until some data has been sent to the slave and print it.
while ((SPI1->SR & SPI_SR_RXNE) == 0);
printf("Received: %d\n", SPI1->DR);
В этой процедуре инициализации две вещи отличаются от кода, размещенного в вопросе:
Не выбирайте двунаправленный режим для обычного SPI с 3 строками SCK, MISO и MOSI.
И MISO, и MOSI являются однонаправленными линиями.
Я использую аппаратное управление ведомым, то есть бит SSM
не установлен. Таким образом,
Периферийное устройство SPI может автоматически определять, когда было установлено устройство (штифт
NSS понижается) и будет
сохранить биты MOSI в регистре сдвига. Когда прочитано достаточно битов (8 или
16 в зависимости от выбранного формата данных),
флаг RXNE
устанавливается в регистре состояния, и переданное значение может быть прочитано
из реестра DR
.
Надеюсь, это поможет.