2023-02-11 10:34 AM
The results are always the same: x=-6.145, y=-6.149, z=-6.149 , even if I move my board. What's wrong?
#include <stm32f30x.h>
void GPIO_Config();
void SPI_Config();
uint8_t L3GD20_Read(uint8_t reg);
void L3GD20_Write(uint8_t reg, uint8_t data);
void L3GD20_Init();
void L3GD20_CS_Low();
void L3GD20_CS_High();
int16_t x,y,z;
int main(void){
// Inizializzazione del sistema e delle periferiche
GPIO_Config();
SPI_Config();
L3GD20_Init();
while (1)
{
// Attivazione del giroscopio
L3GD20_CS_Low();
// Trasmissione dell'indirizzo del registro x per la lettura delle coordinate x
SPI1->DR = 0x28 | 0x80;
while (!(SPI1->SR & SPI_SR_TXE));
while((SPI1->SR & SPI_SR_BSY)==SPI_SR_BSY);
x = ((int16_t)(L3GD20_Read(0x29) << 8)) | L3GD20_Read(0x28);
// Trasmissione dell'indirizzo del registro y per la lettura delle coordinate y
SPI1->DR = 0x2A | 0x80;
while (!(SPI1->SR & SPI_SR_TXE));
while((SPI1->SR & SPI_SR_BSY)==SPI_SR_BSY);
y = ((int16_t)(L3GD20_Read(0x2B) << 8)) | L3GD20_Read(0x2A);
// Trasmissione dell'indirizzo del registro z per la lettura delle coordinate z
SPI1->DR = 0x2C | 0x80;
while (!(SPI1->SR & SPI_SR_TXE));
while((SPI1->SR & SPI_SR_BSY)==SPI_SR_BSY);
z = ((int16_t)(L3GD20_Read(0x2D) << 8)) | L3GD20_Read(0x2C);
// Disattivazione del giroscopio
L3GD20_CS_High();
}
}
void GPIO_Config(){
//Abilitare clock su periferiche GPIOA e GPIOE
RCC->AHBENR |= RCC_AHBENR_GPIOEEN;
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
//Impostare PE3 (Chip Select) come output
GPIOE->MODER |= GPIO_MODER_MODER3_0;
//Impostare PA5, PA6, PA7 rispettivamente come SCK, MISO, MOSI
GPIOA->MODER |= GPIOA_MODER_MODER5_1;
GPIOA->MODER |= GPIOA_MODER_MODER6_1;
GPIOA->MODER |= GPIOA_MODER_MODER7_1;
GPIOA->AFR[0] |= (5<<20) | (5<<24) | (5<<28);
}
void SPI_Config(){
// Abilitare clock su periferica SPI1
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
// Configurare SPI1 in modalità master e imposta il baud rate prescaler di 8
SPI1->CR1 |= SPI_CR1_BR_1;
SPI1->CR1 |= SPI_CR1_MSTR;
// Configurare modalità di lavoro del bus SPI: CPOL=0, CPHA=0
SPI1->CR1 &= ~SPI_CR1_CPOL;
SPI1->CR1 &= ~SPI_CR1_CPHA;
// Abilitare gestione software del chip select (NSS)
SPI1->CR1 |= SPI_CR1_SSM;
SPI1->CR1 |= SPI_CR1_SSI;
// Abilitare periferica SPI1
SPI1->CR1 |= SPI_CR1_SPE;
}
uint8_t L3GD20_Read(uint8_t reg){
uint8_t data;
// Trasmissione del registro da leggere
SPI1->DR = reg;
while (!(SPI1->SR & SPI_SR_TXE));
while((SPI1->SR & SPI_SR_BSY)==SPI_SR_BSY);
// Ricezione dei dati dal giroscopio
while (!(SPI1->SR & SPI_SR_RXNE));
data = SPI1->DR;
return data;
}
void L3GD20_Write(uint8_t reg, uint8_t data){
// Trasmissione dell'indirizzo del registro 'reg' per la scrittura
SPI1->DR = reg;
while (!(SPI1->SR & SPI_SR_TXE));
while((SPI1->SR & SPI_SR_BSY)==SPI_SR_BSY);
// Trasmissione del valore 'data' da scrivere nel registro 'reg'
SPI1->DR = data;
while (!(SPI1->SR & SPI_SR_TXE));
while((SPI1->SR & SPI_SR_BSY)==SPI_SR_BSY);
}
void L3GD20_Init(){
// Impostazione dei bit Xen, Yen, Zen e PD per accendere il giroscopio e attivare i 3 assi
L3GD20_Write(0x20, 0x0F);
}
void L3GD20_CS_Low(void) {
GPIOE->BSRR = (1 << (3 + 16));
}
void L3GD20_CS_High(void) {
GPIOE->BSRR = (1 << 3);
}
2023-02-14 01:02 AM
Thats a lot of active waits (while).