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