logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

stm32f4 - stm32F4 SPI sterowanie pinem SS poprzez GPIO (hardware)

mateuszaaa 06 Wrz 2013 00:32 2964 3
REKLAMA
  • #1 12706479
    mateuszaaa
    Poziom 9  
    Posty: 46
    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
    
    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)
    
    
  • REKLAMA
  • #2 12706655
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Od palenia flag procesor nie zmieni swojego zachowania, za to ustawienie bitów w rejestrach sterujących ma na to jakiś wpływ. Najpierw zdecyduj, czy chcesz sterować linią SS programowo, czy sprzętowo.

    Wersja kodu, którą pokazałeś, nie zapewnia ani jednego, ani drugiego. Linie portu PE są ustawione jako GPIO, ale w funkcji obsługi SPI brakuje kodu do zmiany ich stanu. Pokaż kod, który wg. Ciebie powinien działać,a nie działa, to spróbujemy pomóc.
  • REKLAMA
  • #3 12706721
    mateuszaaa
    Poziom 9  
    Posty: 46
    chce w sposób sprzętowy, przedstawione przezemnie makra
    
    #define LSI302DL_SPI1_DISABLE    GPIOE-> BSRRL |= (LSI302DL) //Set
    #define LSI302DL_SPI1_ENABLE   GPIOE-> BSRRH |= (LSI302DL) //Reset 
    

    działają, poprzez zapalenie flag mialem na mysli ustawianie bitow. Generalnie moje pytanie dotyczy tego jak wybrac sprzetowa obsluge stanu lini SS
  • #4 12706819
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Powtarzam: pokaż kod, który wg. Ciebie ma działać, a nie działa.

    PS. Rejestry BSRR i BRR zostały wymyślone po to, żeby nie trzeba było używać na nich operacji logicznych, a Ty właśnie to robisz.
REKLAMA