Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stm32f4xx.h"
- #define N 1000
- #define SPI1RSTR 0x1000
- #define CS_LO (uint16_t) 0x8
- short int data=0;
- short int cont=8;
- short int x,y,z;
- int main(void){
- RCC->AHB1ENR |= 1;
- RCC->AHB1ENR |= 1<<4;
- RCC->APB2ENR |= 1<<12;
- RCC->APB2RSTR |= SPI1RSTR;
- RCC->APB2RSTR &= !(SPI1RSTR);
- //CFG PORTA A
- GPIOA->MODER |= 1<<11; //IMPOSTO PA5 COME ALTERNATE FUNCTION
- GPIOA->MODER |= 1<<13; //PA6
- GPIOA->MODER |= 1<<15; //PA7
- GPIOA->AFR[0] |= 0x55500000; //SELEZIONO L'AF5 PER I PA5/6/7
- GPIOA->PUPDR |= 1<<11; //IMPOSTO PULL-DOWN PER PA5
- GPIOA->PUPDR |= 1<<13; //PA6
- GPIOA->PUPDR |= 1<<15; //PA7
- GPIOA->OSPEEDR |= 0xFC00; //IMPOSTO PA5/6/7 ALLA MASSIMA VELOCITà
- //CFG PORTA E
- GPIOE->MODER |=1<<6; //IMPOSTO PA3 COME OUTPOUT DIGITALE
- //CFG SPI1
- SPI1->CR1 |=1<<9; //SSM=1 -> ABILITO LA SELEZIONE DELLO SLAVE VIA SOFTWARE
- SPI1->CR1 |=1<<8; //ABILITO SSI (SE METTO SSM=1 ANCHE QUESTO DEVE ESSERE 1)
- SPI1->CR1 |= 0x18; //IMPOSTO IL BAUD RATE A 1/16
- SPI1->CR1 |=1<<2; //ABILITO IL BIT MASTER
- SPI1->CR1 |= 1<<6; //SPI ENABLE
- //ESEMPIO DI COMUNICAZIONE CON IL GIROSCOPIO CON SPI
- GPIOE->ODR &= !(CS_LO); //ABBASSO CH SELECT
- while(((SPI1->SR)&0x2)==0); //attendo che il buffer di trasmissione sia vuoto
- SPI1->DR = (uint16_t) 0x20; //"PUNTO" IL REGISTRO CTRL_REG1 DEL GIROSCOPIO IN MODALITà SCRITTURA;
- while(((SPI1->SR)&0x1)==0); //attendo che il buffer di ricezione sia vuoto
- data = SPI1->DR; //leggo il dato ricevuto (è inutile in questo caso)
- while(((SPI1->SR)&0x2)==0); //attendo che il buffer di trasmissione sia vuoto
- SPI1->DR = (uint16_t) 0xf; //abilito PD e i 3 assi XYZ
- while(((SPI1->SR)&0x1)==0); //attendo che il buffer di ricezione sia vuoto
- data = SPI1->DR; //leggo il dato ricevuto (è inutile in questo caso)
- GPIOE->ODR |= CS_LO; //Alzo CH SELECT
- GPIOE->ODR &= !(CS_LO);
- while(((SPI1->SR)&0x2)==0);
- SPI1->DR = (uint16_t) 0xA0; //"PUNTO" IL REGISTRO CTRL_REG1 DEL GIROSCOPIO IN MODALITà LETTURA;
- while(((SPI1->SR)&0x1)==0);
- data = SPI1->DR;
- while(((SPI1->SR)&0x2)==0);
- SPI1->DR = (uint16_t) 0x1; //invio un dummy
- while(((SPI1->SR)&0x1)==0);
- data = SPI1->DR;
- GPIOE->ODR |= CS_LO;
- while(1){
- //VOGLIAMO LEGGERE X - Y - Z
- //LETTURA DI X
- GPIOE->ODR &= !(CS_LO);
- while(((SPI1->SR)&0x2)==0);
- SPI1->DR = (uint16_t) 0xA8; //"PUNTO" IL REGISTRO OUT_X_L DEL GIROSCOPIO IN MODALITà LETTURA;
- while(((SPI1->SR)&0x1)==0);
- data = SPI1->DR;
- while(((SPI1->SR)&0x2)==0);
- SPI1->DR = (uint16_t) 0x1;
- while(((SPI1->SR)&0x1)==0);
- data = SPI1->DR; //RICEVO IL VALORE X_L
- GPIOE->ODR |= CS_LO;
- x=(uint16_t)data;
- GPIOE->ODR &= !(CS_LO);
- while(((SPI1->SR)&0x2)==0);
- SPI1->DR = (uint16_t) 0xA9; //"PUNTO" IL REGISTRO OUT_X_H DEL GIROSCOPIO IN MODALITà LETTURA;
- while(((SPI1->SR)&0x1)==0);
- data = SPI1->DR;
- while(((SPI1->SR)&0x2)==0);
- SPI1->DR = (uint16_t) 0x1;
- while(((SPI1->SR)&0x1)==0);
- data = SPI1->DR;
- GPIOE->ODR |= CS_LO; //Alzo CH SELECT
- x|=(uint16_t)data<<8;
- //SPI1->DR = (uint16_t) 0xAA; //"PUNTO" IL REGISTRO OUT_Y_L DEL GIROSCOPIO IN MODALITà LETTURA;
- //SPI1->DR = (uint16_t) 0xAB; //"PUNTO" IL REGISTRO OUT_Y_H DEL GIROSCOPIO IN MODALITà LETTURA;
- //SPI1->DR = (uint16_t) 0xAC; //"PUNTO" IL REGISTRO OUT_Z_L DEL GIROSCOPIO IN MODALITà LETTURA;
- //SPI1->DR = (uint16_t) 0xAD; //"PUNTO" IL REGISTRO OUT_Z_H DEL GIROSCOPIO IN MODALITà LETTURA;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement