#include "SC7A20.h" #include "iic.h" #include "stdio.h" #include 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; }