Advertisement
teplofizik

accel.c (SPI)

Jun 1st, 2013
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.00 KB | None | 0 0
  1. //
  2. // accel.c
  3. // Акселерометр
  4. //
  5.  
  6. #include "accel.h"
  7. #include "lis302dl.h"
  8. #include "../drivers.h"
  9.  
  10. static const TSPI SPI = SPI_1;
  11. static const TPin CS = { PE, 3 };
  12.  
  13. static const int UpdateFrequency = 50; // Hz
  14.  
  15. static int8_t X = 0;
  16. static int8_t Y = 0;
  17. static int8_t Z = 0;
  18.  
  19. int8_t acc_GetX(void) { return X; }
  20. int8_t acc_GetY(void) { return Y; }
  21. int8_t acc_GetZ(void) { return Z; }
  22.  
  23. // Записать регистр акселерометра
  24. static void acc_Write(uint8_t Register, uint8_t Data)
  25. {
  26.  
  27.     gpio_LowLevel(&CS);
  28.     spi_Send(SPI, Register);
  29.     spi_Send(SPI, Data);
  30.     gpio_HighLevel(&CS);
  31. }
  32.  
  33. // Прочитать регистр акселерометра
  34. static uint8_t acc_Read(uint8_t Register)
  35. {
  36.     uint8_t Result;
  37.     static const uint8_t READWRITE_CMD = 0x80; // Read/Write command
  38.  
  39.     gpio_LowLevel(&CS);
  40.    
  41.     spi_Send(SPI, Register | READWRITE_CMD);
  42.     Result = spi_Send(SPI, 0);
  43.    
  44.     gpio_HighLevel(&CS);
  45.    
  46.     return Result;
  47. }
  48.  
  49.  
  50. static void acc_Update(void)
  51. {
  52.     X = (int8_t)acc_Read(LIS302DL_OUT_X_ADDR);
  53.     Y = (int8_t)acc_Read(LIS302DL_OUT_Y_ADDR);
  54.     Z = (int8_t)acc_Read(LIS302DL_OUT_Z_ADDR);
  55. }
  56.  
  57. void acc_Init(void)
  58. {
  59.     // spi
  60.     spi_Init(SPI);
  61.    
  62.     gpio_DigitalOutput(&CS);
  63.     gpio_HighLevel(&CS);
  64.    
  65.     // Проверка наличия
  66.     if(acc_Read(LIS302DL_WHO_AM_I_ADDR) != LIS302DL_WHO_AM_I_ID) return; // No
  67.    
  68.     // Включение
  69.     {
  70.         uint8_t Temp = 0;
  71.        
  72.         Temp |= LIS302DL_CTRL_REG1_DR; // Частота 400 Гц
  73.         Temp |= LIS302DL_CTRL_REG1_PD;  // Активный режим
  74.         Temp |= LIS302DL_CTRL_REG1_ZEN; // Включена ось Z
  75.         Temp |= LIS302DL_CTRL_REG1_YEN; // Включена ось Y
  76.         Temp |= LIS302DL_CTRL_REG1_XEN; // Включена ось X
  77.        
  78.         acc_Write(LIS302DL_CTRL_REG1_ADDR, Temp);
  79.     }
  80.    
  81.     timer_AddFunction(UpdateFrequency, &acc_Update);
  82. }
  83.  
  84. void acc_Main(void)
  85. {
  86.    
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement