A nother STM32G071 bare metal question on SPI
Hello,
here is another bare metal question on STM32G071. I am trying to get the SPI to work. But it is not generating any clock signal or MOSI signal.
Here is my init code trying to get it to work on GPIOB 6 to 8:
void init_spi(SPI_TypeDef* SPI)
{
if(SPI == SPI2)
{
RCC->APBENR1 |= RCC_APBENR1_SPI2EN; // enable SPI2
RCC->IOPENR |= RCC_IOPENR_GPIOBEN; // enable GPIOB
GPIOB->MODER &= ~(GPIO_MODER_MODE6_Msk|GPIO_MODER_MODE7_Msk|GPIO_MODER_MODE8_Msk); // clear alternate functions PB6, PB7, PB8
GPIOB->MODER |= (GPIO_MODER_MODE6_1|GPIO_MODER_MODE7_1|GPIO_MODER_MODE8_1); // alternate functions PB6, PB7, PB8
GPIOB->OSPEEDR |= 0b111111<<14; // PB6, PB7, PB8 very high speed
GPIOB->AFRL |= (GPIO_AFRL_AFSEL6_2|GPIO_AFRL_AFSEL7_0); // PB6, PB7 SPI2
GPIOB->AFRH |= GPIO_AFRH_AFSEL8_0; // PB8 SPI2
}else{
return;
}
SPI->CR1 = (SPI_CR1_MSTR|SPI_CR1_SSM); // SPI master, enable, soft select
SPI->CR1 |= 0b111<<3; // 1 MHz baudrate
SPI->CR2 |= 0b111<<8; // SPI 8bit mode
SPI->CR1 |= SPI_CR1_SPE; // enable SPI
}I can see in a logic analyzer that the pins shortly go low. So I guess my error is in the transmit code. I simply write to the SPI_DR to transmit.
void spi_wbyte(SPI_TypeDef* SPI, uint8_t val)
{
SPI->DR = val;
}Also, how do I read a byte? I could not find any examples. Is there anything wrong in my init?
Thanks
Kind regards.