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.
173 lines
6.0 KiB
173 lines
6.0 KiB
#include "SL_Sc7a20_FreeFall_Driver.h"
|
|
#include "msp_iicM1.h"
|
|
|
|
unsigned char SL_MEMS_i2c_spi_Write(unsigned char reg, unsigned char dat)
|
|
{
|
|
///void L2_IICM1_WriteCmd(unsigned char sla,unsigned char reg,unsigned char cmd)
|
|
L2_IICM1_WriteCmd(SC7A20_IIC_ADDRESS, reg, dat); //由客户的II函数接口决定
|
|
return 1;
|
|
}
|
|
|
|
unsigned char SL_MEMS_i2c_spi_Read(unsigned char reg, unsigned char len, unsigned char *buf)
|
|
{
|
|
///void L2_IICM1_ReadReg(unsigned char sla,unsigned char reg,
|
|
/// unsigned char *r,unsigned char n)
|
|
L2_IICM1_ReadReg( SC7A20_IIC_ADDRESS, reg, buf, len);//由客户的II函数接口决定
|
|
return 1;
|
|
}
|
|
|
|
|
|
/***************在线测试**********************/
|
|
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;
|
|
}
|
|
|
|
|