Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // accel.c
- // Акселерометр
- //
- #include "accel.h"
- #include "lis302dl.h"
- #include "../drivers.h"
- static const TSPI SPI = SPI_1;
- static const TPin CS = { PE, 3 };
- static const int UpdateFrequency = 50; // Hz
- static int8_t X = 0;
- static int8_t Y = 0;
- static int8_t Z = 0;
- int8_t acc_GetX(void) { return X; }
- int8_t acc_GetY(void) { return Y; }
- int8_t acc_GetZ(void) { return Z; }
- // Записать регистр акселерометра
- static void acc_Write(uint8_t Register, uint8_t Data)
- {
- gpio_LowLevel(&CS);
- spi_Send(SPI, Register);
- spi_Send(SPI, Data);
- gpio_HighLevel(&CS);
- }
- // Прочитать регистр акселерометра
- static uint8_t acc_Read(uint8_t Register)
- {
- uint8_t Result;
- static const uint8_t READWRITE_CMD = 0x80; // Read/Write command
- gpio_LowLevel(&CS);
- spi_Send(SPI, Register | READWRITE_CMD);
- Result = spi_Send(SPI, 0);
- gpio_HighLevel(&CS);
- return Result;
- }
- static void acc_Update(void)
- {
- X = (int8_t)acc_Read(LIS302DL_OUT_X_ADDR);
- Y = (int8_t)acc_Read(LIS302DL_OUT_Y_ADDR);
- Z = (int8_t)acc_Read(LIS302DL_OUT_Z_ADDR);
- }
- void acc_Init(void)
- {
- // spi
- spi_Init(SPI);
- gpio_DigitalOutput(&CS);
- gpio_HighLevel(&CS);
- // Проверка наличия
- if(acc_Read(LIS302DL_WHO_AM_I_ADDR) != LIS302DL_WHO_AM_I_ID) return; // No
- // Включение
- {
- uint8_t Temp = 0;
- Temp |= LIS302DL_CTRL_REG1_DR; // Частота 400 Гц
- Temp |= LIS302DL_CTRL_REG1_PD; // Активный режим
- Temp |= LIS302DL_CTRL_REG1_ZEN; // Включена ось Z
- Temp |= LIS302DL_CTRL_REG1_YEN; // Включена ось Y
- Temp |= LIS302DL_CTRL_REG1_XEN; // Включена ось X
- acc_Write(LIS302DL_CTRL_REG1_ADDR, Temp);
- }
- timer_AddFunction(UpdateFrequency, &acc_Update);
- }
- void acc_Main(void)
- {
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement