#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; }