XMC655XA姿态传感器/陀螺仪

 这款陀螺仪在国内使用并不常见,使得我在开发过程中花了一周时间才结论出来,在这里以个人经验总结,如果有错误地方希望见谅。

 这是一款三轴数字陀螺仪,主要测量角速度

1:三轴测量:能够测量三个方向(X,Y,Z)的角速度,满程量可选正负2g,正负4g,正负8g三种模式8位输出。

2:数字输出:这款陀螺仪通讯是通过IIC接口提供数字化的角速度数据,IIC从机模式,最大速率是400KHZ,输出12位信号。

3:低功耗:实测电流700uA左右,非常符合低功耗开发,可通过寄存器打开或关闭低功耗。
4:集成温度补偿:内置温度传感器,可在不同温度下保持测量精度。

5:高度灵敏:能够检测微小的旋转变化,适合高精度需求应用中。

这款陀螺仪不算飘,实测2%左右算是稳定。

1:原理图

1 :  引脚无连接
2 :  IIC总线数据线脚
3:   引脚无连接
4 :  引脚无连接
5 :  INT中断输出
6:   引脚无连接

7 :  VDD 1.62 V 和 3.6 V

8 :  引脚无连接

9 :  GND 

10: 引脚无连接

11 :引脚无连接

12 :IIC总线时钟脚

在原理图中看到时钟线和数据线和中断脚外接上拉电阻,这里根据个人开发需求,我这里使用的是CH579M低功耗蓝牙芯片,内部没有硬件IIC和开漏输出,我这里使用推挽输出,模拟软件IIC,所以不需要外接上拉电阻,代码是根据我个人开发编写的,这里需要注意。

推挽输出和开漏输出其区别 

开漏输出:内部没有P-MOS管,没有办法真正内部拉高,所以需要外接一个上拉电阻,这就是为何用开漏输出模拟IIC需要外接电阻,开漏输出只能拉低。
 

推挽输出:内部有P-MOS和N-MOS管,内部可拉高拉低,用推挽输出模式模拟IIC,有一个缺点,有多个设备容易烧引脚,因为不同设备可能会在总线上同时输出不同电平,例如,两个设备一个输出高电平另一个输出低电平,导致信号线相互冲突。所以慎重使用。

2:INT脚

中断输出脚作为输出状态,通知主控XY方向发生变化时中断脚拉低,可通过逻辑分析仪查看也可通过STATUS寄存器查看,如何通过STATUS寄存器查看状态,很简单通过IIC通讯:

设备地址:                 0x2A 
STATUS寄存器地址:0x02

INT脚可选择,可管可不管,INT我是不外接上拉电阻, 选择不管。

 3:IIC脚

 IIC总线我就不多讲了,等会用推挽输出模拟IIC,需要注意的点我会提出来

 4:寄存器地址

MXC6655XA有16个寄存器8位寄存器地址0x00-0x0F

INT_SRC0 (0x00):摇动和改变方向中断源(只读)

  1:当检测到Z轴的方向发生变化时,CHORZ置1  

  2:当检测到XY平面方向发生变化时,CHORXY置1

  3:检测到震动时,+X,-X,+Y,-Y,SHYM,SHYP,SHXM,SHXP被置1
假设读取到寄存器值为:0xCF时,证明XYZ轴都发生了变化。

INT_CLR0(0x00):摇动和改变方向中断清除(只写)

  作用: 这个寄存器用于清除 INT_SRC0 寄存器中记录的中断事件位。当系统处理完摇动事件后,需要将 INT_SRC0 寄存器中对应轴的摇动位清除,以便能够检测新的摇动事件。这是通过向 INT_CLR0 寄存器中对应的位写入1来实现的,假设向INT_CLR0寄存器写入0xCF,将所有标志位清空。

  用途: 在应用程序或驱动程序处理中,当处理完某个轴的摇动事件后,通过 INT_CLR0 寄存器来清除相应的中断位。这一操作确保了系统能够继续监视新的摇动事件,而不会因为之前的事件而忽略新的中断。

 INT_SRC1(0x01):数据就绪中断源,倾斜和方向状态(只读)

  每当进行新的测量时,INT_SRC1寄存器中的DRDY(数据就绪)位被设置为1,并且
在XOUT、YOUT、ZOUT和TOUT寄存器中准备好了新的输出。

  INT_SRC1中的ORXY[1:0]和ORZ[1:0]位表示MXC6655XA的方向。ORXY表示方向
表示XY平面的方向,ORZ表示Z轴方向。方向位的映射如下:

 解释:

  方向位通过检测XY和Z加速度输出的幅度和符号来确定的,ORXY[1:0]位仅当离轴倾斜角度(XY平面与地球之间的角度)时才表示电流方向重力矢量)足够小,在X或Y轴上有足够的加速度振幅来确定有效的XY取向。对于要更新的ORXY[1:0], X轴和Y轴加速度值(ax, ay)必须是较大的大于0.375g。如果不是这种情况,则ORXY[1:0]位保留其在存在时确定的最后值有足够的加速度幅度来做出有效的方向决定。

 INT_CLR1(0x01):数据就绪,倾斜和数据就绪中断清除(只写)

  SW_RST 是设备内部一个控制寄存器中的位,通过向该位写入 1,可以触发设备的软件复位,软件复位让寄存器重置到上电时的状态。复位状态会持续,直到当前的 I2C 传输结束。意味着复位信号不会影响正在进行的 I2C 传输。

总结:

  有没有发现 INT_SRC0和INT_CLR0共享0x00地址, INT_SRC1和 INT_CLR1共享0x01,两个寄存器一个,功能区分:

  INT_SRC0INT_SRC1 是用于读取的寄存器,用于报告当前的中断状态。

  INT_CLR0INT_CLR1 是用于写入的寄存器,用于清除或复位相应的中断标志。

 

 STATUS(0x02)瞬时方向状态(只读)

   ORXY[1:0]和ORIZ[1:0]位分别与ORXY[1:0]和ORZ[1:0]相同,但它们不是采用与ORXY[1:0]和ORZ[1:0]相同的低通滤波。ORIXY[1:0]和ORIZ[1:0]通常不使用最终应用程序将作为输出提供信息。

    ORD表示OTP内存已经被读取。如果控制器要在OTP内存被占用之前读取设备读入,结果将是不准确的,因为校准数据尚未加载。之后,这一点将是1,不能被用户重置。

 这里这几个寄存器才是重点:

XOUT(0x03)X轴加速度输出高位

XOUT(0x04)X轴加速度输出低位

  为何需要同时截图两个寄存器,因为X轴是12位加速度输出,由两个8位寄存器组成:

  0x03寄存器为MSB(高位)8位

  0x04寄存器为LSB (低位)4位

  XOUT[11:0]是12位x轴加速度输出。输出为2的补码格式,范围为−2048到+ 2047。

注意:读取寄存器地址的时候需要拼接在一起,高位需要向左移四位,低位需要向右移四位,才能拼接成十二位

YOUT(0x05)Y轴加速度输出高位

YOUT(0x06)Y轴加速度输出低位

  Y轴加速度和X轴加速度原理一样 

ZOUT(0x07)Z轴加速度输出高位

ZOUT(0x08)Z轴加速度输出低位

  Z轴加速度和X轴加速度原理一样 

TOUT(0x09)温度输出

   MXC6655XA包含一个片上温度传感器,输出可以通过I2C接口读取。输出是2的补码格式。在温度为25℃时,TOUT的标称值[7:0]为0输出约0.586oC/LSB。

//也就是说当陀螺仪的温度超过25度时,可能会影响灵敏度输出准确性,如果温度传感器的输出值增加或减少1 LSB(最小单位),那么对应的实际温度变化大约是0.586°C。

INT_MASK0(0X0A)抖动和方向检测中断掩码(只写)

INT_MASK1(0X0B)倾斜和数据就绪中断掩码(只写)

  1:INT_MASKx寄存器用于选择性地启用或禁用单个中断。当任何一点在INT_MASKx寄存器设置为1,INT_SRCx寄存器中相应的中断被启用,允许该事件发生在INT_SRCx寄存器中设置该位,在INT输出引脚上产生中断信号。INT输出是INT_SRC0寄存器中所有位的逻辑NOR和INT_SRC1寄存器中D2-D0位的逻辑NORINT_MASKx寄存器中相应的位。 

  2:TC是用来禁用温度补偿的位。正确的自检操作是必要的。

  3:INT输出是一个低电平、开漏输出。在INT引脚上需要一个外部上拉电阻
使用INT输出。 中断引脚可以选择,我这里没有外接上拉电阻。

  4:由于INT_SRCx寄存器会在事件发生时自动设置标志,IIC主机可以定期读取INT_SRCx寄存器来轮询事件发生情况,而不是等待中断。

 DETECTION(0x0C)方向和震动检测参数(读写)

  1:ORC[1:0]:设置方向计数,即必须连续有效的新方向读取的次数,才会将新的方向指写入STATUS寄存器中的OR[1:0]位。

     00-16次读取

     01-32次读取

     10-64次读取

     11-128次读取

  2:SHC[1:0]:设置X/Y轴震动计数,定义第一次震动事件(加速度超过阈值)和第二次震动事件(加速度突破阈值方向相反)直接允许的读取次数。

     00-8次读取

     01-16次读取

     10-32次读取

     11-64次读取

  3:SHTH[2:0]:设置X、Y和Z轴震动阈值,震动必须超过这个阈值才会触发震动事件,范围:0.25g(SHTH[2:0]=000)到2.0g(SHTH[2:0]=111),没增加1LSB(最小有效位),震动阈值增加0.25g

总结:

 寄存器0x0C用于配置设备的震动和方向检测参数,可以设置震动的阈值,模式,计数以及方向变化的计数,壹调整设备对震动和方向变化的响应灵敏度,这个寄存器帮助精确控制检测震动时间和方向变化

CONTROL(0x0D):工作控制模式和满程量(读写)

  1:ST=1:启用自检模式,这个模式用于验证加速度计的功能,确保传感器的输出在预期范围内

  2:FSR[1:0]:加速度计的全尺输入范围

        00:正负2g,灵敏度为1024LSB/g

        01:正负4g,灵敏度为512LSB/g

        10:正负8g,灵敏度为256LSB/g

        11:未定义

  3:PD=1:设备进入低功耗关机状态,所有功能都被禁用,只有最基本的电源保持活动状态

     PD=0:设备正常工作,进行加速度测量

自检测模式推荐方法:

  1:将设备放在Z轴方向(+1g),或者Z轴负方向(-1g),确保设备的XY平面与水平面之间的脚误差小于3度。

  2:写入0x80到寄存器0x0B以禁用温度补偿

  3:写入0xC0到寄存器0x0D以启用自检模式并设置为8g范围,读取XY输出。

  4:设置ST和TC为0,允许设备恢复到正常操作模式。

总结:

  寄存器0x0D主要用于配置加速度计的工作模式和全尺度范围:

       PD  :用于控制设备是否进入低功耗的关机状态。
       FSR:设置用于加速度计的测量范围,从而调整灵敏度。

       ST   :启用自检模式以验证传感器功能。

   在进行设备校准,测试或调试时,自检模式非常有用,设置正确的全尺度范围可以确保加速度计在所需要的加速度范围内工作并提供校准的数据。

 

Who_Am_I(0x0F): 标识MXC6655XA(只读) 

                              以上MXC6655XA陀螺仪已经介绍完了,下面开始通信 !!! 

5:CH579M主控推挽输出模拟IIC 

/****************************************************************************************************
* 函数名称: MXC6655XA_Config()
* 功能说明:    初始化SCL和Data脚
* 输    入: 无
* 输    出: 无
*****************************************************************************************************/
void MXC6655XA_Config()
{
    
  GPIOB_ModeCfg(GPIO_Pin_9,GPIO_ModeOut_PP_5mA);
  GPIOA_ModeCfg(GPIO_Pin_9,GPIO_ModeOut_PP_5mA);
  GPIOB_ModeCfg(GPIO_Pin_8,GPIO_ModeIN_Floating);

}
 

/*****************************************************************************************************
* 函数名称: IIC_R_W_Config()
* 功能说明:    设置I2C_SDA引脚的读或写
* 输    入: 0=读入,1=写 
* 输    出: 无
*****************************************************************************************************/
void IIC_R_W_Config(uint8_t dir)
{
    if(dir)GPIOA_ModeCfg(I2C_SDA, GPIO_ModeOut_PP_5mA); //SDA推挽输出模式 
    else GPIOA_ModeCfg(I2C_SDA, GPIO_ModeIN_PU);            //SDA上拉输入模式
}

/*****************************************************************************************************
* 函数名称: IIC_Start()
* 功能说明:    产生I2C传输的Start信号
* 输    入: 无 
* 输    出: 无
*****************************************************************************************************/
void IIC_Start(void)
{
    IIC_R_W_Config(1); //SDA输出
    SDA_High();
    SCL_High();        //scl = 1;
    DelayUs(3);
    SDA_LOW();         //sda = 0;    scl为高时sda的下降沿表示“起始”
    DelayUs(3);
    SCL_LOW();         //scl = 0;   准备发送或接收数据

}

 /*****************************************************************************************************
* 函数名称:    IIC_Stop()
* 功能说明:    产生I2C传输的Stop信号
* 输    入: 无 
* 输    出: 无
******************************************************************************************************/
void IIC_Stop(void)
{
    IIC_R_W_Config(1);
    SCL_LOW();             // scl = 0;
    DelayUs(5);   
    SDA_LOW();             // STOP:
    DelayUs(5);
    SCL_High();            // scl = 1;
    DelayUs(5);    
    SDA_High();            // sda = 1;    sclk为高时sdat的上升沿表示“停止”    
    DelayUs(5);
}

/******************************************************************************************************
* 函数名称: IIC_Send()
* 功能说明:    向IIC总线发送一个字节的数据
* 输    入: byte dat     要发送的数据 
* 输    出: 无
******************************************************************************************************/
void IIC_Send(uint8_t dat)
{
    uint8_t i;
    IIC_R_W_Config(1);          //数据线推挽输出
    SCL_LOW();                  //拉低时钟开始数据传输
    
    for(i=0;i<8;i++)
    {
        if(dat&0x80)SDA_High(); //准备好SDA数据
        else SDA_LOW();
        dat<<=1;
        DelayUs(5);
        SCL_High();             //拉高时钟等待从设备读取数据
        DelayUs(5);
        SCL_LOW();              //拉低时钟准备下一位数据
    }

/******************************************************************************************************
* 函数名称:    IIC_Receive()
* 功能说明:    从IIC总线接收一个字节的数据
* 输    入: 无
* 输    出: byte        从IIC总线上接收到得数据
* 注意事项: 无
******************************************************************************************************/
uint8_t IIC_Receive(uint8_t ACK)
{
    uint8_t i,dat;
    IIC_R_W_Config(0);            //数据线浮空输入    
    for(i=0;i<8;i++)
    {
        SCL_LOW();
        DelayUs(4);
        SCL_High();
        dat<<=1;
        if(Slave_Sda())dat|=0x01; //接收1值拉高
        DelayUs(4);
    }
    
    if(!ACK)IIC_NAk();
    else IIC_Ack();
    
    return dat;

/******************************************************************************************************
* 函数名称: IIC_Ack()
* 功能说明:    在应答位位置产生应答,从而继续连续传输
* 输    入: 无 
* 输    出: 无 
******************************************************************************************************/
void IIC_Ack(void)

    SCL_LOW();
    IIC_R_W_Config(1);      //数据线推挽输出
    SDA_LOW();              //sda = 0;    /拉低数据线,即给于应答
    DelayUs(4);
    SCL_High();             //scl = 1;
       DelayUs(4);
    SCL_LOW();              //scl = 0;
}
 

/******************************************************************************************************
* 函数名称: IIC_NAk()
* 功能说明:    在应答位位置不产生应答,从而终止连续传输
* 输    入: 无 
* 输    出: 无 
******************************************************************************************************/
void IIC_NAk(void)

    SCL_LOW();
    IIC_R_W_Config(1);      //数据线推挽输出
    SDA_High();             // sda = 1;    不拉低数据线,即不给于应答
    DelayUs(4); 
    SCL_High();             // scl = 1;
    DelayUs(4);
    SCL_LOW();              // scl = 0; 

/*******************************************************************************************************
* 函数名称: IIC_Wait_Ack()
* 功能说明:    检测从机应答位
* 输    入: 无 
* 输    出: uint8_t    0=ACK_OK 从机产生了应答;1=ACK_NO 从机没有产生应答
*******************************************************************************************************/
uint8_t IIC_Wait_Ack(void)
{    
    uint32_t i;
    IIC_R_W_Config(1);       //数据线推挽输出
    SDA_High();              // sda = 1; 释放数据线
    DelayUs(4);
    IIC_R_W_Config(0);
    SCL_High();              // scl = 1;
    while(Slave_Sda()){      //读取从机数据
        i++;
        if(i>1000){
            IIC_Stop();     
            return 1;
        }
        DelayUs(3);
    }
    SCL_LOW();
    DelayUs(4);    
    return 0;

以上是推挽输出模拟IIC部分 ,下面是和MXC6655XA陀螺仪通信部分

/******************************************************************************************************
* 函数名称: MXC6655XA_X(uint8_t addr,uint8_t Reg_HSB,uint8_t Reg_LSB)
* 功能说明: X轴由0x3和0x4寄存器组成的12位,范围值:-2048到+2047(以补码形式输出)
* 输    入: 设备地址0x2A,寄存器地址HSB:0x03,LSB:0x04
* 输    出: 得到X轴加速度输出
******************************************************************************************************/
int MXC6655XA_X(uint8_t addr,uint8_t Reg_HSB,uint8_t Reg_LSB)
{
    uint8_t MSB = 0, LSB = 0;
    
    //HSB    
    IIC_Start();                    //产生起始信号
    IIC_Send(addr);                 //发送设备地址及读写位,0表示写
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Send(Reg_HSB);              //发送寄存器地址
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Start();                    //起始信号
    IIC_Send(addr|0x1);             //发送设备地址读位,1表示读        
    if(!IIC_Wait_Ack())MSB = IIC_Receive(1);
    else MSB = IIC_Receive(0); 

    //LSB    
    IIC_Start();                    //起始信号
    IIC_Send(addr);                 //发送设备地址及写位,0表示写
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出模式
        return 1;        
    }
    IIC_Send(Reg_LSB);              //发送寄存器地址
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出模式
        return 1;        
    }
    IIC_Start();                    //起始信号
    IIC_Send(addr|0x1);             //发送设备地址及读位,1表示读

    if(!IIC_Wait_Ack())LSB = IIC_Receive(1);
    else LSB = IIC_Receive(0); 
    
    IIC_Stop();                   
    SDA_OUT();                      
    
    //将MSB和LSB合并成12位值
     DS_Buff_X = (int)((MSB << 4) | (LSB>>4));
    
    if(DS_Buff_X>2047)DS_Buff_X=2047-DS_Buff_X;
    return DS_Buff_X;
        
}

/****************************************************************************************************
* 函数名称: MXC6655XA_Y(uint8_t addr,uint8_t Reg_HSB,uint8_t Reg_LSB)
* 功能说明: Y轴由0x3和0x4寄存器组成的12位,范围值:-2048到+2047(以补码形式输出)
* 输    入: 设备地址0x2A,寄存器地址HSB:0x03,LSB:0x04
* 输    出: 得到Y轴加速度输出
****************************************************************************************************/
int MXC6655XA_Y(uint8_t addr,uint8_t Reg_HSB,uint8_t Reg_LSB)
{
    
    uint8_t MSB = 0, LSB = 0;
    
    //HSB    
    IIC_Start();                    //起始信号
    IIC_Send(addr);                 //发送设备地址及读写位,0表示写
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Send(Reg_HSB);              //发送寄存器地址
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    IIC_Start();                    //起始信号
    IIC_Send(addr|0x1);             //发送设备地址及读位,1表示读    
    if(!IIC_Wait_Ack())MSB = IIC_Receive(1);
    else MSB = IIC_Receive(0); 

    
    //LSB    
    IIC_Start();                    //产生起始信号
    IIC_Send(addr);                 //发送设备地址及读写位,0表示写
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    IIC_Send(Reg_LSB);              //发送寄存器地址
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Start();                    //产生起始信号
    IIC_Send(addr|0x1);             //发送设备地址及读位,1表示读    
    if(!IIC_Wait_Ack())LSB = IIC_Receive(1);
    else LSB = IIC_Receive(0); 
    
    IIC_Stop();                   
    SDA_OUT();                      
    
    // 将MSB和LSB合并成12位值
    DS_Buff_Y = (int)((MSB << 4) | (LSB>>4));
    if(DS_Buff_Y>2047)DS_Buff_Y=2047-DS_Buff_Y;
    return DS_Buff_Y;
    
}
 

/****************************************************************************************************
* 函数名称: MXC6655XA_Z(uint8_t addr,uint8_t Reg_HSB,uint8_t Reg_LSB)
* 功能说明: Z轴由0x3和0x4寄存器组成的12位,范围值:-2048到+2047(以补码形式输出)
* 输    入: 设备地址0x2A,寄存器地址HSB:0x03,LSB:0x04
* 输    出: 得到Z轴加速度输出
****************************************************************************************************/
int MXC6655XA_Z(uint8_t addr,uint8_t Reg_HSB,uint8_t Reg_LSB)
{
   
    uint8_t MSB = 0, LSB = 0;
    
    //HSB    
    IIC_Start();                    //产生起始信号
    IIC_Send(addr);                 //发送设备地址及读写位,0表示写
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Send(Reg_HSB);              //发送寄存器地址
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Start();                    //产生起始信号
    IIC_Send(addr|0x1);             //发送设备地址及读位,1表示读    
    if(!IIC_Wait_Ack())MSB = IIC_Receive(1);
    else MSB = IIC_Receive(0); 

    
    //LSB    
    IIC_Start();                    //产生起始信号
    IIC_Send(addr);                 //发送设备地址及读写位,0表示写
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Send(Reg_LSB);              //发送寄存器地址
    if(IIC_Wait_Ack())              //检测是否有应答
    {
        IIC_Stop();                 //产生停止信号
        SDA_OUT();                  //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Start();                    //产生起始信号
    IIC_Send(addr|0x1);             //发送设备地址及读位,1表示读    
    if(!IIC_Wait_Ack())LSB = IIC_Receive(1);
    else LSB = IIC_Receive(0); 

    IIC_Stop();                   
    SDA_OUT();                      
    
    // 将MSB和LSB合并成12位值
    DS_Buff_Z = (int)((MSB << 4) | (LSB>>4));
    if(DS_Buff_Z>2047)DS_Buff_Z=2047-DS_Buff_Z;
    return  DS_Buff_Z;    
}

/************************************************************************************************
* 函数名称: Write_MXC6655XA(uint8_t addr,uint8_t register1,uint8_t value)
* 功能说明: 向寄存器写入指令
* 输    入: 
* 输    出: 
*************************************************************************************************/
uint8_t Write_MXC6655XA(uint8_t addr,uint8_t register1,uint8_t value)
{
    IIC_Start();                //产生起始信号
    IIC_Send(addr&0xFE);        //发送设备地址及读写位,0表示写
    if(IIC_Wait_Ack())          //检测是否有应答
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为推挽输出
        return 1;        
    }
    IIC_Send(register1);        //发送寄存器地址
    if(IIC_Wait_Ack())          //检测是否有应答
    {             
        
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为推挽输出
        return 1;                 
    }
    IIC_Send(value);            //向寄存器地址写入数据
    if(IIC_Wait_Ack())          //检测MXC6655XA_XYZ是否有响应
    {             
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为推挽输出
        return 1;            
    }    
    
    IIC_Stop();                 //产生停止信号
    SDA_OUT();                   //将SDA引脚恢复为推挽输出

    return 0;
}

/*************************************************************************************************
* 函数名称: Write_MXC6655XA(uint8_t addr,uint8_t register1,uint8_t value)
* 功能说明: 向寄存器写入指令
* 输    入: 
* 输    出: 
*************************************************************************************************/
uint8_t Read_MXC6655XA(uint8_t addr,uint8_t register1)
{
  
    int Read_Value;  
    IIC_Start();                //产生起始信号
    IIC_Send(addr&0xFE);        //发送设备地址及读写位,0表示写
    if(IIC_Wait_Ack())          //检测是否有应答
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为推挽输出
        return 1;        
    }
    IIC_Send(register1);        
    if(IIC_Wait_Ack())            //检测是否有应答
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Start();                //产生Repeated Start    
    IIC_Send(addr|1);           //发送设备地址及读位,1表示读    
     if(IIC_Wait_Ack())
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为推挽输出
        return 1;        
    }
        
    Read_Value = IIC_Receive(1);//读取数据
    IIC_Stop();                 //产生停止信号
    SDA_OUT();                  //将SDA引脚恢复为推挽输出

    return Read_Value;
}
 

/************************************************************************************************
* 函数名称:  Read_MXC6655XA_Reg(uint8_t addr,uint8_t register1)
* 功能说明: 读取寄存器温度,公式:(Reg_Temper*0.586)+25
* 输    入: 
* 输    出: 
*************************************************************************************************/
float Read_MXC6655XA_Reg(uint8_t addr,uint8_t register1)
{
    int Reg_Temper;             //温度寄存器状态脚
    float Reg_temp;             //温度值
    IIC_Start();                //产生起始信号
    IIC_Send(addr&0xFE);        //发送设备地址及读写位,0表示写
    if(IIC_Wait_Ack())          //检测是否有应答
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为推挽输出
        return 1;        
    }
    IIC_Send(register1);        //发送读取数据的起始地址
    if(IIC_Wait_Ack())          //检测是否有应答
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为推挽输出
        return 1;        
    }
    
    IIC_Start();                //起始信号避免在读操作期间释放总线。
    IIC_Send(addr|1);           //读取数据
    if(IIC_Wait_Ack())          //检测是否有应答
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为推挽输出
        return 1;        
    }    
    Reg_Temper = IIC_Receive(1);
    IIC_Stop();                 //产生停止信号
    SDA_OUT();                  //将SDA引脚恢复为推挽输出
    Reg_temp=(float)Reg_Temper*LSB_G+Temp_value;//读取寄存器温度公式
    return Reg_temp;

/*************************************************************************************************
* 函数名称:  Read_MXC6655XA_full_scale_range(uint8_t addr,uint8_t register1)
* 功能说明: 读取寄存器满量程
* 输    入: 
* 输    出: 
*************************************************************************************************/
uint8_t Read_MXC6655XA_full_scale_range(uint8_t addr,uint8_t register1)
{
 
    uint8_t Reg_range;
    IIC_Start();                //产生起始信号
    IIC_Send(addr&0xFE);        //发送设备地址及读写位,0表示写
    if(IIC_Wait_Ack())          //检测MXC6655XA_XYZ是否有响应
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为输出模式
        return 1;        
    }
    IIC_Send(register1);        //发送读取数据的起始地址
    if(IIC_Wait_Ack())          //检测MXC6655XA_XYZ是否有响应
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为输出模式
        return 1;        
    }
    
    IIC_Start();                //产生起始信号
    IIC_Send(addr|1);           //读取数据
    if(IIC_Wait_Ack())          //检测MXC6655XA_XYZ是否有响应
    {
        IIC_Stop();             //产生停止信号
        SDA_OUT();              //将SDA引脚恢复为输出模式
        return 1;        
    }
    
    Reg_range = IIC_Receive(1); //读取数据
    IIC_Stop();                 //产生停止信号
    SDA_OUT();                  //将SDA引脚恢复为输出模式

    return Reg_range;
}
 

 

Read_Buff_X 是X轴

Read _Buff_Y是Y轴 

Read_Buff_Z是Z轴

Read_Buff_RangeX是X加速度重量

Read_Buff_RY是Y加速度重量

Read_Buff_RangeZ是Z加速度重量

Read_Reg是陀螺仪内部温度

Read_Range为0是关闭陀螺仪低功耗

Read_Range为1是打开陀螺仪低功耗

创作不易,切勿窃取 !!!

创作不易,切勿窃取 !!!

创作不易,切勿窃取 !!!

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值