Я использую STM32F4, пытаясь прочитать данные через SPI.Средами отладки является Visual Studio с плагином VisualGDB.Спи-конфиг выглядит следующим образом.8-битные кадры, в первую очередь MSB, с использованием GPIOA / B для сигналов SPI
void spiInit() {
RCC->AHB1ENR |= 3; //enable gpioA/B clock
RCC->APB2ENR |= 0x1000; //enable SPI1 clock (bit 12)
// configure A5 for SCLK
GPIOA->MODER &= ~0x00000C00; //clear pin mode for pin 5
GPIOA->MODER |= 0x00000800; //alternate function mode for pin 5
GPIOA->AFR[0] &= ~0x00F00000; //clear alternate mode
GPIOA->AFR[0] |= 0x00500000; //setup pins 5 for AF5
// configure B4 for MISO
GPIOB->MODER &= ~0x00000300; //clear pin mode for pin 4
GPIOB->MODER |= 0x00000200; //alternate function mode for pin 5
GPIOB->AFR[0] &= ~0x000F0000; //clear alternate mode
GPIOB->AFR[0] |= 0x00050000; //setup pins 4 for AF5
// configure B5 for MOSI
GPIOB->MODER &= ~0x00000C00; //clear pin mode for pin 5
GPIOB->MODER |= 0x00000800; //alternate function mode for pin 5
GPIOB->AFR[0] &= ~0x00F00000; //clear alternate mode
GPIOB->AFR[0] |= 0x00500000; //setup pins 5 for AF5
// configure A15 for output SS
GPIOA->MODER &= ~0xC0000000; //clear PA15 function bits
GPIOA->MODER |= 0x40000000; //set PA15 (SS) as output
SPI1->CR1 = 0x31E; //8-bit frames
SPI1->CR2 = 0; //mostly read/status/interrupt config
SPI1->CR1 |= 0x40; //enable SPI1
GPIOA->BSRR = 0x00008000; //deassert SS
}
Запись выполняется нормально, данные загружаются правильно в подчиненное устройство, и оно отвечает, как и ожидалось, считывания из подчиненного устройства, однако, не работают.Я вижу, что MISO хорошо смотрится в автобусе, когда я смотрю на сигналы, но Мастер их не улавливает.
После нескольких попыток просмотра флагов регистра состояния SPI (получая результаты, описанные выше) я использую функцию полезности, которую я видел в другом вопросе SO ( здесь ).Данные всегда читаются как 0, и я в замешательстве, код ожидает заполнения буфера приема, но там, кажется, ничего не происходит, когда он читается.
uint8_t SPI_ReadWrite8(SPI_TypeDef *spi, uint8_t data)
{
while(!(spi -> SR & SPI_SR_TXE)); //Wait for tx buffer to empty
*(volatile uint8_t *)&spi->DR = data; //Send data
while (!(spi -> SR & SPI_SR_RXNE)); //Wait for rx buffer to fill
return *(volatile uint8_t *)&spi->DR;
}
Есть идеи, что мне не хватает?