Witam staram się skonfigurować spi tak aby wybierać slave za pomocą stanu na pinie PE3. Aktualnie komunikacja działa jednakże niezależnie od stanu na zadanym pinie. Podczas gdy chce wylaczyc mozliwosc komunikacji i ustalam stan na pinie PE3 na wysoki gdy na poczatku funkcji read_spi() zmieniam stan na wysoki to po wyjsciu z tejże funkcji stan ustalony jest znowu na niski. Czytalem o flagach SSOE SSI oraz SSM i z tego z zrozumiałem zeby pin NSS byl wyjściem nalezy zapalić flage SSOE, aby sterować tymże pinem programowo poprzez FLAGE SSI zapalona musi byc flaga SSM. Jednakże powyższe rozumowanie sie nie sprawdza;/
spi init
spi read
defines
spi init
void initSPI1()
{
// clock for port d and e for CS
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOEEN;
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;// clock for usart
//PA5 - SCK AF5
GPIOA->MODER &= ~(GPIO_MODER_MODER5); //reset
GPIOA->MODER |= GPIO_MODER_MODER5_1; //alternate function
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5_1; // 50 Mhz
GPIOA->AFR[0]|= (5<<20);
//PA6 - MISO AF5
GPIOA->MODER &= ~(GPIO_MODER_MODER6); //reset
GPIOA->MODER |= GPIO_MODER_MODER6_1; //alternate function
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6_1; // 50 Mhz
GPIOA->AFR[0]|= (5<<24);
//PA7 - MOSI AF5
GPIOA->MODER &= ~(GPIO_MODER_MODER7); //reset
GPIOA->MODER |= GPIO_MODER_MODER7_1; //alternate function
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7_1; // 50 Mhz
GPIOA->AFR[0]|= (5<<28);
// //PE4 - SPI SS
// GPIOE->MODER &= ~(GPIO_MODER_MODER4); //reset
// GPIOE->MODER |= GPIO_MODER_MODER4_0;
// GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4_1; // 50 Mhz
//PE3 - SPI SS
GPIOE->MODER &= ~(GPIO_MODER_MODER3); //reset
GPIOE->MODER |= GPIO_MODER_MODER3_0;
GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR3_1; // 50 Mhz
SPI1 -> CR1 |= SPI_CR1_MSTR; //Master mode
SPI1 -> CR1 |= SPI_CR1_BR_0 | SPI_CR1_BR_1; // baud rate control
SPI1 -> CR1 |= SPI_CR1_DFF; // 16bit
SPI1 -> CR1 |= SPI_CR1_CPOL;
SPI1 -> CR1 |= SPI_CR1_CPHA;
//FROM DOCUMETATION:
// When configured in master mode with
// NSS configured as an input (MSTR=1 and SSOE=0) and if NSS is pulled low, the SPI
// enters the master mode fault state: the MSTR bit is automatically cleared and the
// device is configured in slave mode
// disables multimaster but aviods going in master fault , you can set SSOE or
// SSI and SSM in CR1 register
// SPI1 -> CR1 |= SPI_CR1_SSI;
// SPI1 -> CR1 |= SPI_CR1_SSM;
SPI1 -> CR2 |= SPI_CR2_SSOE;
SPI1 -> CR1 |= SPI_CR1_SPE; //włączenie SPI
}
spi read
uint8_t SPI1_read(uint8_t subaddress){
// fitted value for spi (read bit itd)
// L3GD20_SS_ENABLE;
LSI302DL_SPI1_DISABLE;
uint16_t spi_register;
spi_register = ((subaddress | L3GD20_READ)<< 8); //
while (!(SPI1->SR & SPI_SR_TXE)); //Wait if TXE cleared, Tx FIFO is full.
SPI1->DR = spi_register;
while (!(SPI1->SR & SPI_SR_RXNE)); //Wait if RNE cleared, Rx FIFO is empty.
spi_register = SPI1->DR;
// LSI302DL_SPI1_DISABLE;
// L3GD20_SS_DISABLE;
return spi_register & 0xff;
}
defines
#define LSI302DL GPIO_BSRR_BS_3
#define LSI302DL_SPI1_DISABLE GPIOE-> BSRRL |= (LSI302DL) //Set
#define LSI302DL_SPI1_ENABLE GPIOE-> BSRRH |= (LSI302DL) //Reset
#define L3GD20_READ (1<<7)