You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

159 lines
5.4 KiB

#include "SL_Sc7a20_FreeFall_Driver.h"
/***************在线测试**********************/
signed char SL_SC7A20_Online_Test(void)
{
unsigned char SL_Read_Reg=0xff;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x0F,1, &SL_Read_Reg);
if(SL_Read_Reg==SC7A20_CHIP_ID_VALUE) return 1;
else return -1;
}
/***************BOOT 重载内部寄存器值*********************/
signed char SL_SC7A20_BOOT(void)
{
unsigned char SL_Read_Reg=0xff;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x24,1, &SL_Read_Reg);
SL_Read_Reg=SL_SC7A20_BOOT_ENABLE|SL_Read_Reg;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x24, SL_Read_Reg);
return 1;
}
/***************传感器量程设置**********************/
signed char SL_SC7A20_FS_Config(unsigned char Sc7a20_FS_Reg)
{
unsigned char SL_Read_Reg=0xff,SL_Write_Reg;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x23,1, &SL_Read_Reg);
// SL_Write_Reg=0x80|Sc7a20_FS_Reg|SL_SC7A20_HR_ENABLE;
SL_Write_Reg=0x80|Sc7a20_FS_Reg;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x23, SL_Write_Reg);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x23,1, &SL_Read_Reg);
if(SL_Read_Reg==SL_Write_Reg) return 1;
else return -1;
}
/***************数据更新速率**加速度计使能**********/
signed char SL_SC7A20_Power_Config(unsigned char Power_Config_Reg)
{
unsigned char SL_Read_Reg;
#if SL_SC7A20_MTP_ENABLE == 0X01
SL_Read_Reg = 0x00;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x1E, SL_SC7A20_MTP_VALUE);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x57,1, &SL_Read_Reg);
SL_Read_Reg=SL_Read_Reg|SL_SC7A20_SDO_PU_MSK|SL_SC7A20_I2C_PU_MSK;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x57, SL_Read_Reg);
#endif
SL_Read_Reg = 0xff;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x20, Power_Config_Reg);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x20,1, &SL_Read_Reg);
if(SL_Read_Reg==Power_Config_Reg) return 1;
else return -1;
}
/***************数据更新速率**加速度计使能**********/
signed char SL_SC7A20_FreeFall_Config(void)
{
unsigned char SL_Read_Reg;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x24,1, &SL_Read_Reg);
SL_Read_Reg=0x80|SL_Read_Reg;//AOI1 LATCH
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x24, SL_Read_Reg);
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x22, 0x40);//AOI1 映射到INT1
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x25, 0x02);//INT1 默认高电平,有中断输出低电平
//FreeFall AOI1
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x30, 0x95);
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x32, 0x19);
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE,0x33, 0x04);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,0x30,1, &SL_Read_Reg);
if(SL_Read_Reg==0x95) return 1;
else return -1;
}
#if SL_SC7A20_16BIT_8BIT==0
/***************加速度计数据读取*8bits*********/
signed char SL_SC7A20_Read_XYZ_Data(signed char *SL_SC7A20_Data_XYZ_Buf)
{
unsigned char SL_Read_Buf[7];
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,1, &SL_Read_Buf[0]);
if((SL_Read_Buf[0]&0x0f)==0x0f)
{
#if SL_SC7A20_SPI_IIC_MODE ==1//IIC
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_DATA_OUT,6, &SL_Read_Buf[1]);
#elif SL_SC7A20_SPI_IIC_MODE ==0//SPI
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,7, &SL_Read_Buf[0]);
#endif
SL_SC7A20_Data_XYZ_Buf[0]=(signed char)SL_Read_Buf[2];
SL_SC7A20_Data_XYZ_Buf[1]=(signed char)SL_Read_Buf[4];
SL_SC7A20_Data_XYZ_Buf[2]=(signed char)SL_Read_Buf[6];
return 1;
}
else
{
return 0;
}
}
#elif SL_SC7A20_16BIT_8BIT==1
/***************加速度计数据读取*16bits*********/
signed char SL_SC7A20_Read_XYZ_Data(signed short *SL_SC7A20_Data_XYZ_Buf)
{
unsigned char SL_Read_Buf[7];
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,1, &SL_Read_Buf[0]);
if((SL_Read_Buf[0]&0x0f)==0x0f)
{
#if SL_SC7A20_SPI_IIC_MODE ==1//IIC
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_DATA_OUT,6, &SL_Read_Buf[1]);
#elif SL_SC7A20_SPI_IIC_MODE ==0//SPI
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE,SL_SC7A20_STATUS_REG,7, &SL_Read_Buf[0]);
#endif
SL_SC7A20_Data_XYZ_Buf[0]=(signed short)((SL_Read_Buf[2]<<8) + SL_Read_Buf[1]);
SL_SC7A20_Data_XYZ_Buf[1]=(signed short)((SL_Read_Buf[4]<<8) + SL_Read_Buf[3]);
SL_SC7A20_Data_XYZ_Buf[2]=(signed short)((SL_Read_Buf[6]<<8) + SL_Read_Buf[5]);
return 1;
}
else
{
return 0;
}
}
#endif
//自由落体检测
signed char SL_SC7A20_Freefall_Status(void)
{
unsigned char sl_freefall_reg;
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE, 0x31,1, &sl_freefall_reg);
//USART_printf( USART1, "SL_reg31:%x!\r\n",sl_freefall_reg);
if((sl_freefall_reg&0x40)==0x40)
{
return 1;//自由落体成立
}
return 0;//自由落体不成立
}
signed char SL_SC7A20_Power_Down(void)//power down
{
unsigned char SL_Read_Reg = 0xff;
SL_SC7A20_I2c_Spi_Write(SL_SC7A20_SPI_IIC_MODE, 0x20, 0x00);
SL_SC7A20_I2c_Spi_Read(SL_SC7A20_SPI_IIC_MODE, 0x20,1, &SL_Read_Reg);
if(SL_Read_Reg==0x00) return 1;
else return -1;
}