Advertisement
Guest User

sp

a guest
Feb 12th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.35 KB | None | 0 0
  1. #include "stm32f4xx.h"
  2. #define N 1000
  3. #define SPI1RSTR 0x1000
  4. #define CS_LO (uint16_t) 0x8
  5.  
  6. short int data=0;
  7. short int cont=8;
  8. short int x,y,z;
  9.  
  10. int main(void){
  11. RCC->AHB1ENR |= 1;
  12. RCC->AHB1ENR |= 1<<4;
  13. RCC->APB2ENR |= 1<<12;
  14. RCC->APB2RSTR |= SPI1RSTR;
  15. RCC->APB2RSTR &= !(SPI1RSTR);
  16.  
  17. //CFG PORTA A
  18. GPIOA->MODER |= 1<<11; //IMPOSTO PA5 COME ALTERNATE FUNCTION
  19. GPIOA->MODER |= 1<<13; //PA6
  20. GPIOA->MODER |= 1<<15; //PA7
  21. GPIOA->AFR[0] |= 0x55500000; //SELEZIONO L'AF5 PER I PA5/6/7
  22. GPIOA->PUPDR |= 1<<11; //IMPOSTO PULL-DOWN PER PA5
  23. GPIOA->PUPDR |= 1<<13; //PA6
  24. GPIOA->PUPDR |= 1<<15; //PA7
  25. GPIOA->OSPEEDR |= 0xFC00; //IMPOSTO PA5/6/7 ALLA MASSIMA VELOCITà
  26.  
  27. //CFG PORTA E
  28. GPIOE->MODER |=1<<6; //IMPOSTO PA3 COME OUTPOUT DIGITALE
  29.  
  30. //CFG SPI1
  31. SPI1->CR1 |=1<<9; //SSM=1 -> ABILITO LA SELEZIONE DELLO SLAVE VIA SOFTWARE
  32. SPI1->CR1 |=1<<8; //ABILITO SSI (SE METTO SSM=1 ANCHE QUESTO DEVE ESSERE 1)
  33. SPI1->CR1 |= 0x18; //IMPOSTO IL BAUD RATE A 1/16
  34. SPI1->CR1 |=1<<2; //ABILITO IL BIT MASTER
  35. SPI1->CR1 |= 1<<6; //SPI ENABLE
  36.  
  37. //ESEMPIO DI COMUNICAZIONE CON IL GIROSCOPIO CON SPI
  38.  
  39. GPIOE->ODR &= !(CS_LO); //ABBASSO CH SELECT
  40. while(((SPI1->SR)&0x2)==0); //attendo che il buffer di trasmissione sia vuoto
  41. SPI1->DR = (uint16_t) 0x20; //"PUNTO" IL REGISTRO CTRL_REG1 DEL GIROSCOPIO IN MODALITà SCRITTURA;
  42. while(((SPI1->SR)&0x1)==0); //attendo che il buffer di ricezione sia vuoto
  43. data = SPI1->DR; //leggo il dato ricevuto (è inutile in questo caso)
  44. while(((SPI1->SR)&0x2)==0); //attendo che il buffer di trasmissione sia vuoto
  45. SPI1->DR = (uint16_t) 0xf; //abilito PD e i 3 assi XYZ
  46. while(((SPI1->SR)&0x1)==0); //attendo che il buffer di ricezione sia vuoto
  47. data = SPI1->DR; //leggo il dato ricevuto (è inutile in questo caso)
  48. GPIOE->ODR |= CS_LO; //Alzo CH SELECT
  49.  
  50.  
  51. GPIOE->ODR &= !(CS_LO);
  52. while(((SPI1->SR)&0x2)==0);
  53. SPI1->DR = (uint16_t) 0xA0; //"PUNTO" IL REGISTRO CTRL_REG1 DEL GIROSCOPIO IN MODALITà LETTURA;
  54. while(((SPI1->SR)&0x1)==0);
  55. data = SPI1->DR;
  56. while(((SPI1->SR)&0x2)==0);
  57. SPI1->DR = (uint16_t) 0x1; //invio un dummy
  58. while(((SPI1->SR)&0x1)==0);
  59. data = SPI1->DR;
  60. GPIOE->ODR |= CS_LO;
  61. while(1){
  62.  
  63. //VOGLIAMO LEGGERE X - Y - Z
  64. //LETTURA DI X
  65. GPIOE->ODR &= !(CS_LO);
  66. while(((SPI1->SR)&0x2)==0);
  67. SPI1->DR = (uint16_t) 0xA8; //"PUNTO" IL REGISTRO OUT_X_L DEL GIROSCOPIO IN MODALITà LETTURA;
  68. while(((SPI1->SR)&0x1)==0);
  69. data = SPI1->DR;
  70. while(((SPI1->SR)&0x2)==0);
  71. SPI1->DR = (uint16_t) 0x1;
  72. while(((SPI1->SR)&0x1)==0);
  73. data = SPI1->DR; //RICEVO IL VALORE X_L
  74. GPIOE->ODR |= CS_LO;
  75. x=(uint16_t)data;
  76.  
  77. GPIOE->ODR &= !(CS_LO);
  78. while(((SPI1->SR)&0x2)==0);
  79. SPI1->DR = (uint16_t) 0xA9; //"PUNTO" IL REGISTRO OUT_X_H DEL GIROSCOPIO IN MODALITà LETTURA;
  80. while(((SPI1->SR)&0x1)==0);
  81. data = SPI1->DR;
  82. while(((SPI1->SR)&0x2)==0);
  83. SPI1->DR = (uint16_t) 0x1;
  84. while(((SPI1->SR)&0x1)==0);
  85. data = SPI1->DR;
  86. GPIOE->ODR |= CS_LO; //Alzo CH SELECT
  87. x|=(uint16_t)data<<8;
  88. //SPI1->DR = (uint16_t) 0xAA; //"PUNTO" IL REGISTRO OUT_Y_L DEL GIROSCOPIO IN MODALITà LETTURA;
  89. //SPI1->DR = (uint16_t) 0xAB; //"PUNTO" IL REGISTRO OUT_Y_H DEL GIROSCOPIO IN MODALITà LETTURA;
  90. //SPI1->DR = (uint16_t) 0xAC; //"PUNTO" IL REGISTRO OUT_Z_L DEL GIROSCOPIO IN MODALITà LETTURA;
  91. //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