cancel
Showing results for 
Search instead for 
Did you mean: 

STM32 SPI Cant Set SSM Bit

Defensive
Visitor

Hi, Im new to STM32 and Im writing a bare metal spi library however for some reason when I try to change the SSM bit in code it doesnt seem to work. Im able to change the SSM bit in debug mode.

 

void SPI_Enable(SPI_Com* spi)
{
	SPI1_CLK_EN;


	//Reset the whole CR1 register if someone decides to enable it using different options
	//First disable SPI
	spi->spiReg->SPI_CR1 &= ~(1 << 6);
	spi->spiReg->SPI_CR1 = 0;

	//CPOL and CPHA
	spi->spiReg->SPI_CR1 |= (spi->spiConfig.CPHA);
	spi->spiReg->SPI_CR1 |= (spi->spiConfig.CPOL << 1);


	//Master, Slave mode
	spi->spiReg->SPI_CR1 |= (spi->spiConfig.masterMode << 2);

	//Set baud rate
	spi->spiReg->SPI_CR1 |= (spi->spiConfig.baudRate << 3);

	//MSB or LSB first
	spi->spiReg->SPI_CR1 |= (spi->spiConfig.isLSB << 7);

	//Data format
	spi->spiReg->SPI_CR1 |= (spi->spiConfig.dataFormat << 11);

	//Software Slave SSM and SSI bits
	//spi->spiReg->SPI_CR1 |= (spi->spiConfig.isSoftwareSlave << 9);
	spi->spiReg->SPI_CR1 |= (1 << 9);
	spi->spiReg->SPI_CR1 |= (1 << 8);


	//Set duplex modes
	switch(spi->spiConfig.duplexMode)
	{
	case FULL_DUPLEX_MODE:
		//You dont have to change since by default its in full duplex mode
		break;

	case HALF_DUPLEX_MODE:
		spi->spiReg->SPI_CR1 |= (1 << 15);
		break;

	case RECIEVE_ONLY_MODE:
		spi->spiReg->SPI_CR1 |= (1 << 10);
		break;
	}

	//Bidi mode
	spi->spiReg->SPI_CR1 |= (spi->spiConfig.bidiMode << 14);

	//Set CS to high
	SetOutputAdress(spi->CS, 1);

	//Set busy to 0
	spi->isBusy = 0;

	spi->spiReg->SPI_CR1 |= (1 << 6);

}
0 REPLIES 0