📄 smb380.c
字号:
/** 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 + -