⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smb380.c

📁 smb380开发应用和程序(C语言) 包含smb380所有功能的设置函数
💻 C
📖 第 1 页 / 共 3 页
字号:

/** set the interrupt mask for SMB380's interrupt features in one mask
	\param mask input for interrupt mask
	\see SMB380_INT_ALERT, SMB380_INT_ANY_MOTION, SMB380_INT_EN_ADV_INT, SMB380_INT_NEW_DATA, SMB380_INT_LATCH, SMB380_INT_HG, SMB380_INT_LG
*/
int smb380_set_interrupt_mask(unsigned char mask) 
{
	int comres=0;
	unsigned char data[4];

	if (p_smb380==0)
		return E_SMB_NULL_PTR;
	data[0] = mask & SMB380_CONF1_INT_MSK;
	data[2] = ((mask<<1) & SMB380_CONF2_INT_MSK);		


	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, SMB380_CONF1_REG, &data[1], 1);
	comres += p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, SMB380_CONF2_REG, &data[3], 1);		
	data[1] &= (~SMB380_CONF1_INT_MSK);
	data[1] |= data[0];
	data[3] &=(~(SMB380_CONF2_INT_MSK));
	data[3] |= data[2];

	comres += p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, SMB380_CONF1_REG, &data[1], 1);
	comres += p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, SMB380_CONF2_REG, &data[3], 1);

	return comres;	
}

/** get the current interrupt mask settings from SMB380 image registers
	\param *mask return variable pointer for interrupt mask
	\see SMB380_INT_ALERT, SMB380_INT_ANY_MOTION, SMB380_INT_EN_ADV_INT, SMB380_INT_NEW_DATA, SMB380_INT_LATCH, SMB380_INT_HG, SMB380_INT_LG
*/
int smb380_get_interrupt_mask(unsigned char *mask) 
{
	int comres=0;
	unsigned char data;

	if (p_smb380==0)
		return E_SMB_NULL_PTR;

	p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, SMB380_CONF1_REG, &data,1);
	*mask = data & SMB380_CONF1_INT_MSK;
	p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, SMB380_CONF2_REG, &data,1);
	*mask = *mask | ((data & SMB380_CONF2_INT_MSK)>>1);

	return comres;
}


/** resets the SMB380 interrupt status 
		\note this feature can be used to reset a latched interrupt

*/
int smb380_reset_interrupt(void) 
{	
	int comres=0;
	unsigned char data=(1<<RESET_INT__POS);	
	
	if (p_smb380==0)
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, RESET_INT__REG, &data, 1);
	return comres;

}





/* Data Readout */

/** X-axis acceleration data readout 
	\param *a_x pointer for 16 bit 2's complement data output (LSB aligned)
*/
int smb380_read_accel_x(short *a_x) 
{
	int comres;
	unsigned char data[2];
	
	
	if (p_smb380==0)
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, ACC_X_LSB__REG, data, 2);
	*a_x = SMB380_GET_BITSLICE(data[0],ACC_X_LSB) | SMB380_GET_BITSLICE(data[1],ACC_X_MSB)<<ACC_X_LSB__LEN;
	*a_x = *a_x << (sizeof(short)*8-(ACC_X_LSB__LEN+ACC_X_MSB__LEN));
	*a_x = *a_x >> (sizeof(short)*8-(ACC_X_LSB__LEN+ACC_X_MSB__LEN));
	return comres;
	
}



/** Y-axis acceleration data readout 
	\param *a_y pointer for 16 bit 2's complement data output (LSB aligned)
*/
int smb380_read_accel_y(short *a_y) 
{
	int comres;
	unsigned char data[2];	


	if (p_smb380==0)
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, ACC_Y_LSB__REG, data, 2);
	*a_y = SMB380_GET_BITSLICE(data[0],ACC_Y_LSB) | SMB380_GET_BITSLICE(data[1],ACC_Y_MSB)<<ACC_Y_LSB__LEN;
	*a_y = *a_y << (sizeof(short)*8-(ACC_Y_LSB__LEN+ACC_Y_MSB__LEN));
	*a_y = *a_y >> (sizeof(short)*8-(ACC_Y_LSB__LEN+ACC_Y_MSB__LEN));
	return comres;
}


/** Z-axis acceleration data readout 
	\param *a_z pointer for 16 bit 2's complement data output (LSB aligned)
*/
int smb380_read_accel_z(short *a_z)
{
	int comres;
	unsigned char data[2];	

	if (p_smb380==0)
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, ACC_Z_LSB__REG, data, 2);
	*a_z = SMB380_GET_BITSLICE(data[0],ACC_Z_LSB) | SMB380_GET_BITSLICE(data[1],ACC_Z_MSB)<<ACC_Z_LSB__LEN;
	*a_z = *a_z << (sizeof(short)*8-(ACC_Z_LSB__LEN+ACC_Z_MSB__LEN));
	*a_z = *a_z >> (sizeof(short)*8-(ACC_Z_LSB__LEN+ACC_Z_MSB__LEN));
	return comres;
}


/** 8 bit temperature data readout 
	\param *temp pointer for 8 bit temperature output (offset binary)
	\note: an output of 0 equals -30癈, 1 LSB equals 0.5癈
*/
int smb380_read_temperature(unsigned char * temp) 
{
	int comres;	

	if (p_smb380==0)
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, TEMPERATURE__REG, temp, 1);
	return comres;

}


/** X,Y and Z-axis acceleration data readout 
	\param *acc pointer to \ref smb380acc_t structure for x,y,z data readout
	\note data will be read by multi-byte protocol into a 6 byte structure 
*/
int smb380_read_accel_xyz(smb380acc_t * acc)
{
	int comres;
	unsigned char data[6];


	if (p_smb380==0)
		return E_SMB_NULL_PTR;
	
	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, ACC_X_LSB__REG, &data[0],6);
	
	acc->x = SMB380_GET_BITSLICE(data[0],ACC_X_LSB) | (SMB380_GET_BITSLICE(data[1],ACC_X_MSB)<<ACC_X_LSB__LEN);
	acc->x = acc->x << (sizeof(short)*8-(ACC_X_LSB__LEN+ACC_X_MSB__LEN));
	acc->x = acc->x >> (sizeof(short)*8-(ACC_X_LSB__LEN+ACC_X_MSB__LEN));

	acc->y = SMB380_GET_BITSLICE(data[2],ACC_Y_LSB) | (SMB380_GET_BITSLICE(data[3],ACC_Y_MSB)<<ACC_Y_LSB__LEN);
	acc->y = acc->y << (sizeof(short)*8-(ACC_Y_LSB__LEN + ACC_Y_MSB__LEN));
	acc->y = acc->y >> (sizeof(short)*8-(ACC_Y_LSB__LEN + ACC_Y_MSB__LEN));
	
	
	acc->z = SMB380_GET_BITSLICE(data[4],ACC_Z_LSB); 
	acc->z |= (SMB380_GET_BITSLICE(data[5],ACC_Z_MSB)<<ACC_Z_LSB__LEN);
	acc->z = acc->z << (sizeof(short)*8-(ACC_Z_LSB__LEN+ACC_Z_MSB__LEN));
	acc->z = acc->z >> (sizeof(short)*8-(ACC_Z_LSB__LEN+ACC_Z_MSB__LEN));
	
	return comres;
	
}



/** check current interrupt status from interrupt status register in SMB380 image register
	\param *ist pointer to interrupt status byte
	\see SMB380_INT_STATUS_HG, SMB380_INT_STATUS_LG, SMB380_INT_STATUS_HG_LATCHED, SMB380_INT_STATUS_LG_LATCHED, SMB380_INT_STATUS_ALERT, SMB380_INT_STATUS_ST_RESULT
*/
int smb380_get_interrupt_status(unsigned char * ist) 
{

	int comres=0;	
	if (p_smb380==0)
		return E_SMB_NULL_PTR;
	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, SMB380_STATUS_REG, ist, 1);
	return comres;
}

/** enable/ disable low-g interrupt feature
		\param onoff enable=1, disable=0
*/

int smb380_set_low_g_int(unsigned char onoff) {
	int comres;
	unsigned char data;
	if(p_smb380==0) 
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, ENABLE_LG__REG, &data, 1);				
	data = SMB380_SET_BITSLICE(data, ENABLE_LG, onoff);
	
	comres += p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, ENABLE_LG__REG, &data, 1);
	
	return comres;

}

/** enable/ disable high-g interrupt feature
		\param onoff enable=1, disable=0
*/

int smb380_set_high_g_int(unsigned char onoff) {
	int comres;
	unsigned char data;
	if(p_smb380==0) 
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, ENABLE_HG__REG, &data, 1);				
	data = SMB380_SET_BITSLICE(data, ENABLE_HG, onoff);
	comres += p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, ENABLE_HG__REG, &data, 1);
	
	return comres;

}



/** enable/ disable any_motion interrupt feature
		\param onoff enable=1, disable=0
		\note for any_motion interrupt feature usage see also \ref smb380_set_advanced_int()
*/
int smb380_set_any_motion_int(unsigned char onoff) {
	int comres;
	unsigned char data;
	if(p_smb380==0) 
		return E_SMB_NULL_PTR;
	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, EN_ANY_MOTION__REG, &data, 1);				
	data = SMB380_SET_BITSLICE(data, EN_ANY_MOTION, onoff);
	comres += p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, EN_ANY_MOTION__REG, &data, 1);
	
	return comres;

}

/** enable/ disable alert-int interrupt feature
		\param onoff enable=1, disable=0
		\note for any_motion interrupt feature usage see also \ref smb380_set_advanced_int()
*/
int smb380_set_alert_int(unsigned char onoff) {
	int comres;
	unsigned char data;
	if(p_smb380==0) 
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, ALERT__REG, &data, 1);				
	data = SMB380_SET_BITSLICE(data, ALERT, onoff);

	comres += p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, ALERT__REG, &data, 1);
	
	return comres;

}


/** enable/ disable advanced interrupt feature
		\param onoff enable=1, disable=0
		\see smb380_set_any_motion_int()
		\see smb380_set_alert_int()
*/
int smb380_set_advanced_int(unsigned char onoff) {
	int comres;
	unsigned char data;
	if(p_smb380==0) 
		return E_SMB_NULL_PTR;
	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, ENABLE_ADV_INT__REG, &data, 1);				
	data = SMB380_SET_BITSLICE(data, EN_ANY_MOTION, onoff);

	comres += p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, ENABLE_ADV_INT__REG, &data, 1);
	
	return comres;

}

/** enable/disable latched interrupt for all interrupt feature (global option)
	\param latched (=1 for latched interrupts), (=0 for unlatched interrupts) 
*/

int smb380_latch_int(unsigned char latched) {
	int comres;
	unsigned char data;
	if(p_smb380==0) 
		return E_SMB_NULL_PTR;
	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, LATCH_INT__REG, &data, 1);				
	data = SMB380_SET_BITSLICE(data, LATCH_INT, latched);

	comres += p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, LATCH_INT__REG, &data, 1);
	
	return comres;

}



/** enable/ disable new data interrupt feature
		\param onoff enable=1, disable=0
*/

int smb380_set_new_data_int(unsigned char onoff) {
	int comres;
	unsigned char data;
	if(p_smb380==0) 
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, NEW_DATA_INT__REG, &data, 1);				
	data = SMB380_SET_BITSLICE(data, NEW_DATA_INT, onoff);
	comres += p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, NEW_DATA_INT__REG, &data, 1);
	
	return comres;

}



/* MISC functions */


/** calls the linked wait function

		\param msec amount of mili seconds to pause
		\return number of mili seconds waited
*/

int smb380_pause(int msec) 
{
	if (p_smb380==0)
		return E_SMB_NULL_PTR;
	else
	  p_smb380->delay_msec(msec);	
	return msec;

}


/** read function for raw register access

		\param addr register address
		\param *data pointer to data array for register read back
		\param len number of bytes to be read starting from addr
	
*/

int smb380_read_reg(unsigned char addr, unsigned char *data, unsigned char len)
{

	int comres;
	if (p_smb380==0)
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_READ_FUNC(p_smb380->dev_addr, addr, data, len);
	return comres;

}


/** write function for raw register access
		\param addr register address
		\param *data pointer to data array for register write
		\param len number of bytes to be written starting from addr	
*/
int smb380_write_reg(unsigned char addr, unsigned char *data, unsigned char len) 
{

	int comres;

	if (p_smb380==0)
		return E_SMB_NULL_PTR;

	comres = p_smb380->SMB380_BUS_WRITE_FUNC(p_smb380->dev_addr, addr, data, len);

	return comres;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -