С большим трудом завел SPI1 на STM32F042. Все от того, что использовал готовую periphLib. А в ней не учтен ньюанс доступа к регистру данных SPI в 8 битном режиме.
#define SPI1_DR_8bit (*(__IO uint8_t *)((uint32_t)&(SPI1->DR)))
///
//CUT
///
void Spi1_init(void)
{
RCC->APB2ENR |=RCC_APB2ENR_SPI1EN;
SPI1->CR1 |=
SPI_CR1_BR_0 |
SPI_CR1_BR_1 |
SPI_CR1_MSTR |
SPI_CR1_SSI |
SPI_CR1_SSM
;
SPI1->CR2 = 0x700; // 8 bit
SPI1->CR2 |= SPI_CR2_FRXTH;
SPI1->CR1 |= SPI_CR1_SPE;
}
uint8_t Spi1_send (uint8_t data)
{
while (!(SPI1->SR & SPI_SR_TXE));
SPI1_DR_8bit = data;
while (!(SPI1->SR & SPI_SR_RXNE));
return (SPI1_DR_8bit);
}
uint8_t Spi1_read (void)
{
return Spi1_send(0xFF);
}
#define SPI1_DR_8bit (*(__IO uint8_t *)((uint32_t)&(SPI1->DR)))
///
//CUT
///
void Spi1_init(void)
{
RCC->APB2ENR |=RCC_APB2ENR_SPI1EN;
SPI1->CR1 |=
SPI_CR1_BR_0 |
SPI_CR1_BR_1 |
SPI_CR1_MSTR |
SPI_CR1_SSI |
SPI_CR1_SSM
;
SPI1->CR2 = 0x700; // 8 bit
SPI1->CR2 |= SPI_CR2_FRXTH;
SPI1->CR1 |= SPI_CR1_SPE;
}
uint8_t Spi1_send (uint8_t data)
{
while (!(SPI1->SR & SPI_SR_TXE));
SPI1_DR_8bit = data;
while (!(SPI1->SR & SPI_SR_RXNE));
return (SPI1_DR_8bit);
}
uint8_t Spi1_read (void)
{
return Spi1_send(0xFF);
}