SC7A20.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. #include "SC7A20.h"
  2. #include "iic.h"
  3. #include "stdio.h"
  4. #include <math.h>
  5. void SC7A20_Init(void) {
  6. uint8_t ctrl1 = 0x2F; // 1-1HZ,2-10HZ,5-100HZ,6-200HZ,//F为开低功耗//0x27
  7. uint8_t ctrl4 = 0x20; // ±8g full scale//10为4g,20为8g,30为16g。//0x10
  8. uint8_t ctrl2 = 0x00; // 0x00关闭高通滤波//0x09为开启高通滤波
  9. // 配置CTRL_REG1寄存器0X20
  10. Soft_I2C_Write(SC7A20_ADDR, SC7A20_CTRL_REG1, ctrl1);
  11. // 配置CTRL_REG4寄存器0X23
  12. Soft_I2C_Write(SC7A20_ADDR, SC7A20_CTRL_REG4, ctrl4);
  13. // 配置CTRL_REG2寄存器0X21
  14. Soft_I2C_Write(SC7A20_ADDR, SC7A20_CTRL_REG2, ctrl2);
  15. }
  16. void SC7A20_ReadXYZ(int16_t *x, int16_t *y, int16_t *z) {
  17. uint8_t data[6];
  18. Soft_I2C_ReadMulti(SC7A20_ADDR, SC7A20_OUT_X_L | 0x80 , data, 6);
  19. *x = SC7A20_Class_12bitComplement(data[1], data[0]);
  20. *y = SC7A20_Class_12bitComplement(data[3], data[2]);
  21. *z = SC7A20_Class_12bitComplement(data[5], data[4]);
  22. *x = *x + 1500;
  23. *z = *z + 3000;
  24. }
  25. int16_t SC7A20_Class_12bitComplement(uint8_t msb, uint8_t lsb) {
  26. int16_t temp = (msb << 8) | lsb;
  27. temp >>= 4; // 将数据右移 4 位,保留高 12 位有效数据
  28. if (temp & 0x0800) { // 检查最高位(第 12 位),如果是 1,表示负数
  29. temp |= 0xF000; // 将高 4 位补为 1,得到正确的负数
  30. }
  31. return temp;
  32. }